2015-10-15 56 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工具。我會在這個週末嘗試。 –