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; //修改主窗口类名 WNDCLASS wndclass; //GetClassInfo返回注册窗口类信息 ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); //重新设置窗口类的类名 wndclass.lpszClassName="New ClassName"; //重新注册新的窗口类 VERIFY(AfxRegisterClass(&wndclass)); // 利用新注册的类名修改主窗口类名 cs.lpszClass=wndclass.lpszClassName; 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); }