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;
- <FONT color=#ff6600>//修改主窗口类名
- WNDCLASS wndclass;
- //GetClassInfo返回注册窗口类信息
- ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
- //重新设置窗口类的类名
- wndclass.lpszClassName="New ClassName";
- //重新注册新的窗口类
- VERIFY(AfxRegisterClass(&wndclass));
- // 利用新注册的类名修改主窗口类名
- cs.lpszClass=wndclass.lpszClassName;</FONT>
- return TRUE;
- }
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
<span style="color:#ff6600;">//修改主窗口类名
WNDCLASS wndclass;
//GetClassInfo返回注册窗口类信息
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
//重新设置窗口类的类名
wndclass.lpszClassName="New ClassName";
//重新注册新的窗口类
VERIFY(AfxRegisterClass(&wndclass));
// 利用新注册的类名修改主窗口类名
cs.lpszClass=wndclass.lpszClassName;</span>
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);
- }
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子窗口:
以下代码用于查找MDI子窗口:
- <PRE class=csharp name="code"> 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);
- }</PRE>