如何使窗口在级联位置打开(使用MFC)

时间:2015-10-15 10:07:49

标签: c++ windows mfc

我正在使用Windows MFC来创建一个小程序。 我想让程序的多个实例出现在级联位置。

目前程序始终显示为居中,即无法看到多个窗口。

是否有自动方式让Windows在级联位置创建多个实例?

要测试我使用多行的批处理脚本:

 "start MyProgram.exe"
 "start MyProgram.exe"
 "start MyProgram.exe"

我使用的对话框来自CDialogEx(但我使用的是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()函数,但据我所知,它需要更多地了解已运行的实例

1 个答案:

答案 0 :(得分:0)

以下代码如何作为起点?

#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。当然,在枚举中,您还可以将找到的每个窗口移动到以CPoint(x, y)开头的点,并在每个找到的窗口中按CSize(xoffset, yoffset)更改。

要记住的一些事情:

  1. CascadeWindows看起来不是正确的解决方案,它会恢复所有最大化的窗口,并且不仅会触及您的流程创建的窗口(我更喜欢这样)。
  2. 如果您的流程创建了多个顶级对话框,那么您可能需要检测要移动的对话框。
  3. 如果用户复制了您的程序文件,那么模块文件名将会不同。
  4. 只是概念代码的证明,您需要添加错误检查和边界检查。