框架類:
static LPCSTR classname=NULL;
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
if(classname==NULL)
{
WNDCLASS wndcls;
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndcls);
wndcls.lpszClassName="MyClass1";
wndcls.hIcon=AfxGetApp()->LoadIcon(ID_MYICON);
AfxRegisterClass(&wndcls);
classname="MyClass1";
}
cs.lpszClass="MyClass1";
return TRUE;
視圖類:
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.lpszClass=AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW ,AfxGetApp()->LoadCursor(IDC_MYCURSOR),
(HBRUSH)GetStockObject(WHITE_BRUSH));
return CView::PreCreateWindow(cs);
一些理解:
AfxRegisterClass函數只有一個WNDCLASS結構的參數,該函數用來註冊窗口類。
AfxRegisterWndClass函數有四個參數,第一參數是窗口類型,第二個參數是指針句柄,第三個參數是背景畫刷句柄,第四個參數是圖標句柄。
從上面的參數可以看出AfxRegisterClass函數需要一個完整的WNDCLASS結構作爲參數,因此爲了方便一般在使用該函數前用GetClassInfo取得一個已經註冊的窗口類(一般是在CFrameWnd::PreCreateWindow(cs)註冊的),之後再修改WNDCLASS結構的某些成員(這也是重載PreCreateWindow函數的主要任務,當然爲了註冊修改後的類,必須將該結構的類名改了)。 最後將類名給cs結構的lpszClass成員。因爲後面的窗口創建函數CreateWindowEx會用到。
重載視圖類的PreCreateWinodw函數會發現,CView::PreCreateWindow(cs)是在最後調用的,因此沒有完整的已經註冊的窗口類可用,因此用AfxRegisterWndClass函數修改相關參數。