1.一個窗口的標題就是主窗口顯示時左上角的窗口名,用GetWindowText獲取;一個窗口的類名是註冊這個窗口時的窗口類名,用GetClassName獲取。
2.MFC在preCreateWindow中註冊窗口類,根據窗口類型不同註冊6個窗口類中的一個,每個窗口類名固定,如:
CWnd註冊一個名爲_AfxWnd的類,CFrameWnd註冊一個_afxWndFrameOrView,CMDIFrameWnd註冊一個_afxWndMDIFrame.
上面的_AfxWnd,_afxWndFrameOrView,_afxWndMDIFrame都是宏,代表標識窗口類的字符串,共有5個窗口類名: _afxWnd _afxWndControlBar afxWndMDIFrame _afxWndFrameOrView _afxWndOleControl,每個宏代表一個串。但是MFC框架會自動對類名進行一個轉換,轉成Afx:x:y:z:w的形式,成爲獨一無二的窗口類名稱。(用spy++可以看到窗口類名都是這種形式)
3.可以自己給窗口類名起一個名字,方法如下:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
4.默認情況下,每建立一個子窗口,主窗口標題會加上一個“ - 子窗口標題”,在 PreCreateWindow把cs的風格設置成WS_OVERLAPPEDWINDOW就不會加了。
5.一個MDI主窗口有一個子窗口"MDIClient"(子窗口類名),它纔是所有MDI子窗口的父窗口。MDI主窗口的子窗口包括狀態欄,工具欄,菜單欄和MDIClient窗口,MDIClient窗口的子窗口才是MDI子窗口,所有以下程序只能查找到狀態欄,工具欄等MDI主窗口的子窗口
HWND hWnd = ::FindWindow(NULL,_T("Hello"));
HWND hPreWnd = ::FindWindowEx(hWnd,NULL,NULL,NULL);
TCHAR lpTemp[30] = "";
TCHAR lpTemp2[30]= "";
while(::IsWindow(hPreWnd))
{
::GetWindowText(hPreWnd,lpTemp,30);
::GetClassName(hPreWnd,lpTemp2,30);
hPreWnd = ::FindWindowEx(hWnd,hPreWnd,NULL,NULL);
}
以下代碼用於查找MDI子窗口:
HWND hWnd = ::FindWindow(NULL,_T("Hello"));
HWND hFirstWnd = ::FindWindowEx(hWnd,NULL,NULL,NULL);
HWND hMdiChildWnd = ::FindWindowEx(hFirstWnd,NULL,NULL,NULL);
TCHAR lpTemp[30] = "";
TCHAR lpTemp2[30]= "";
while(::IsWindow(hMdiChildWnd))
{
::GetWindowText(hMdiChildWnd,lpTemp,30);
::GetClassName(hMdiChildWnd,lpTemp2,30);
hMdiChildWnd = ::FindWindowEx(hFirstWnd,hMdiChildWnd,NULL,NULL);
}