2015-10-15 52 views
0

我正在使用Windows MFC创建一个小程序。 我想让程序的多个实例出现在级联位置。如何在层叠位置打开一个窗口(使用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

不,您必须通过'OnWindow'方法中的'MoveWindow'来自己做这件事。 –

+2

重复? http://stackoverflow.com/questions/11812931/how-to-make-a-win32-dialog-appear-at-the-default-position-cw-usedefault –

+0

国际海事组织的c + +和MFC标签应该删除,因为你想要“窗口”做这项工作,而不用修改你的程序 – Robson

回答

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. 只需验证概念代码,就需要添加错误检查和边界检查。
+0

这可能是一个解决方案。看起来不错(仅在initDialog中有一个函数调用)。然而,我的目标是从MS那里得到解决方案。我目前不在使用我的Windows工具。我会在这个周末尝试。 –

相关问题