2011年10月31日 星期一

註冊自已的dialog base類別

有時候我們會設計一些跨行程的應用程式,當我們需要取得另一行程的視窗Handle對其做操作時通常會利用FindWindow來找到我們想要的視窗。

FindWindow可利用title name或是windows class二種方式來找到指定的視窗。為避免命名上的衝突或是多語系的支援,通常我們會重新註冊我們的dialog類別為特殊的名稱。註冊的方式分為2部份。

Step 1:首先找到你的RC檔,在dialog的rc區加入以下的程式碼

IDD_MYCLASSDLG_DIALOG DIALOGEX 0, 0, 200, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "MyClass Dialog"
CLASS "MyClassDlg"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
...


也可透過Visual Studio的GUI來修改,先將RC設定為非MFC Mode


如此一來,Dialog的屬性Class Name變為可修改狀態,再輸入指定的Class Name即可



Step 2:設定好RC屬性後,在App的InitInstance中呼叫main dialog之前註冊MyClassDlg即可完成註冊

WNDCLASS wndcls = { 0 };
::GetClassInfo(AfxGetInstanceHandle(),MAKEINTRESOURCE(32770),&wndcls);

wndcls.lpszClassName = _T("MyClassDlg");

AfxRegisterClass(&wndcls);

CMyClassDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
...