如何使窗口在级联位置打开(使用MFC)
How to make a window open in a cascade position (using MFC)
我正在使用Windows MFC创建一个小程序。我想让程序的多个实例出现在一个级联位置。
当前程序总是居中显示,即不可能在多个窗口中看到它。
是否有一种自动的方法让窗口在级联位置创建多个实例?
为了测试,我使用了一个批处理脚本,其中包含多行: "start MyProgram.exe"
"start MyProgram.exe"
"start MyProgram.exe"
我使用的对话框是从cdialgex派生的(但我使用CDialog有相同的)
我希望这是一个标志/对话框的属性。
在更改.rc文件之前,请设置如下属性
IDD_MAIN_DLG DIALOGEX 0, 0, 260, 185 STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION
我知道CascadeWindows()函数,但据我所知,它需要更多地了解哪些实例已经运行
下面的代码作为起点如何?
#include <Psapi.h>
namespace {
size_t nWnds = 0;
HWND hWnds[10];
BOOL CALLBACK enumerate(HWND hWnd, LPARAM This)
{
HWND hWndThis = reinterpret_cast<HWND>(This);
TCHAR nameThis[MAX_PATH], nameOther[MAX_PATH];
VERIFY(GetWindowModuleFileName(hWndThis, nameThis, _countof(nameThis)));
TCHAR wndclass[32];
VERIFY(RealGetWindowClass(hWnd, wndclass, _countof(wndclass)));
if (_tcscmp(wndclass, _T("#32770")) == 0) {
DWORD pid;
GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess != NULL) {
if (GetModuleFileNameEx(hProcess, NULL, nameOther, _countof(nameOther))) {
if (_tcscmp(nameThis, nameOther) == 0) {
hWnds[nWnds++] = hWnd;
}
}
VERIFY(CloseHandle(hProcess));
hProcess = NULL;
}
}
return TRUE;
}
}
BOOL CMFCApplication1Dlg::OnInitDialog()
{
// ...
VERIFY(EnumWindows(enumerate, reinterpret_cast<LPARAM>(m_hWnd)));
if (nWnds > 1) {
VERIFY(CascadeWindows(NULL, MDITILE_ZORDER, NULL, nWnds, hWnds));
}
return TRUE;
}
它包含对OnInitDialog
的更改,以扫描已由可执行文件创建的所有顶级对话框,然后调用CascadeWindows
。当然,在enumerate中,您也可以将您找到的每个窗口移动到从CPoint(x, y)
开始的点,并随着每个窗口的CSize(xoffset, yoffset)
变化。
注意事项:
-
CascadeWindows
看起来不像正确的解决方案,它恢复所有最大化的窗口,不只是触摸你的进程创建的窗口(我更喜欢)。 - 如果您的进程创建了多个顶级对话框,那么您可能需要检测要移动哪些对话框。
- 如果用户复制了你的程序文件,那么模块文件名将不同。
- 只是概念验证代码,您需要添加错误检查和边界检查。
相关文章:
- 使用 MFC 的表/网格
- 使用 MFC c++ 删除已装载驱动器的文件
- 我如何使用MFC C 模仿办公风格
- 使用MFC在对话框上拖放文件
- 我们可以使用mfc应用程序创建pdf文件吗
- 使用 MFC 的结构多线程
- 使用 mfc 的 EXE(调试)不能在其他 PC 上运行
- 使用 MFC C++ 6.0 从 ms 访问中读取整数数据
- 使用 MFC 时导出到 Excel 文件
- 尝试使用MFC对象时会违规
- 如何使用mfc/c++在chrome或firefox中注入脚本
- 如何使用 MFC 获取单独窗口的句柄
- 使用 mfc 对话框显示.bmp图像时出错
- 由于使用 MFC 时"__cdecl"和"__thiscall"调用约定不匹配而导致的链接器错误?
- 使用MFC的opencv中函数cvInitImageHeader的输入roi错误
- 优化使用MFC FindFile API失败
- 使用 MFC CFile 进行文件读取写入
- 使用 MFC 打印到打印机 DC
- 在 MySQL 中使用 MFC 对话框基础应用的C++插入一行
- 使用 MFC 对话框加载图像