關於框架類和視圖類的PreCreateWindow函數的重載!!

框架類:

 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函數修改相關參數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章