mfc修改主窗口風格和窗口類 .


 AppWizard生成的應用程序框架的主窗口具有缺省的窗口風格,比如在窗口標題條中自動添加文檔名、窗口是疊加型的、可改變窗口大小等。要修改窗口的缺省風格,需要重載CWnd::PreCreateWindow(CREATESTRUCT&   cs)函數,並在其中修改CREATESTRUCT型參數cs。
CWnd::PreCreateWindow   函數先於窗口創建函數執行。如果該函數被重載,則窗口創建函數將使用CWnd::PreCreateWindow   函數返回的CREATESTRUCT   cs參數所定義的窗口風格來創建窗口;否則使用預定義的窗口風格。
CREATESTRUCT結構定義了創建函數創建窗口所用的初始參數,其定義如下:

  1. typedef   struct   tagCREATESTRUCT   {     
  2. LPVOID   lpCreateParams;   //   創建窗口的基本參數      
  3. HANDLE   hInstance;   //   擁有將創建的窗口的模塊實例句柄      
  4. HMENU   hMenu;   //   新窗口的菜單句柄      
  5. HWND   hwndParent;   //   新窗口的父窗口句柄      
  6. int   cy;   //   新窗口的高度      
  7. int   cx;   //   新窗口的寬度      
  8. int   y;   //   新窗口的左上角Y坐標      
  9. int   x;   //   新窗口的左上角X坐標      
  10. LONG   style;   //   新窗口的風格      
  11. LPCSTR   lpszName;   //   新窗口的名稱      
  12. LPCSTR   lpszClass;   //   新窗口的窗口類名      
  13. DWORD   dwExStyle;   //   新窗口的擴展參數      
  14. }   CREATESTRUCT;     

 

CREATESTRUCT結構的style域定義了窗口的風格。比如,缺省的MDI主窗口的風格中就包括FWS_ADDTOTITLE(在標題條中顯示當前的工作文檔名)、FWS_PREFIXTITLE(把文檔名放在程序標題的前面)、WS_THICKFRAME(窗口具有可縮放的邊框)等風格。由於多種風格參數由邏輯或(“|”)組合在一起的,因此添加某種風格,就只需用“|”把對應的參數加到CREATESTRUCT結構的style域中;刪除已有的風格,則需用“&”連接CREATESTRUCT結構的style域與該風格的邏輯非值。
CREATESTRUCT結構的x、y、cx、cy域分別定義了窗口的初始位置和大小,因此,在CWnd::PreCreateWindow   函數中給它們賦值,將能定義窗口的初始顯示位置和大小。
下例中的代碼將主框窗口的大小將固定為1/4屏幕,標題條中僅顯示窗口名,不顯示文檔名。

  1. BOOL   CMainFrame::PreCreateWindow(CREATESTRUCT&   cs)     
  2. {     
  3. //   TODO:   Modify   the   Window   class   or   styles   here   by   modifying      
  4. //   the   CREATESTRUCT   cs      
  5.   
  6. //   修改主窗風格      
  7. cs.style   &=   ~FWS_ADDTOTITLE;   //去除標題條中的文檔名      
  8. cs.style   &=   ~WS_THICKFRAME;   //去除可改變大小的邊框      
  9. cs.style   |=   WS_DLGFRAME;   //增加不能改變大小的邊框      
  10.   
  11. //   確定主窗的大小和初始位置      
  12. int   cxScreen   =   ::GetSystemMetrics(SM_CXSCREEN);//獲得屏幕寬      
  13. int   cyScreen   =   ::GetSystemMetrics(SM_CYSCREEN);   //獲得屏幕高      
  14. cs.x   =   0;   //   主窗位於左上角      
  15. cs.y   =   0;     
  16. cs.cx   =   cxScreen/2;   //   主窗寬為1/2屏幕寬      
  17. cs.cy   =   cxScreen/2;   //   主窗高為1/2屏幕高      
  18. return   CMDIFrameWnd::PreCreateWindow(cs);     
  19. }   

 

修改窗口類,實現更改背景顏色

方法一:

  1. BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)  
  2. {  
  3.     // TODO: 在此添加專用代碼和/或調用基類   
  4.     if( CFrameWnd::PreCreateWindow(cs))  
  5.     {     
  6.         //改變窗口類   
  7.         WNDCLASS   wndclass;   
  8.   
  9.         ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);   
  10.         //wndclass.hbrBackground   =   (HBRUSH)(COLOR_3DFACE   +   1);    
  11.         //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);   
  12.         wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));  
  13.         wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能為函數局部變量   
  14.         wndclass.hbrBackground=*(new CBrush(RGB(25,25,0)));//最方便的方法   
  15.         //wndclass.hCursor   =   AfxGetApp()-> LoadCursor(IDC_CURSOR1);    
  16.         wndclass.lpszClassName   =   _T("newViewClassName ");   
  17.         VERIFY(AfxRegisterClass(&wndclass));   
  18.         cs.lpszClass=wndclass.lpszClassName;  
  19.         return TRUE;  
  20.     }  
  21.     return FALSE;  
  22. }  

 

方法二:

  1. BOOL CMFC_單文檔View::PreCreateWindow(CREATESTRUCT& cs)  
  2. {  
  3.     WNDCLASS   wndclass;     
  4.   
  5.     //1.調用基類的同名函數,以自動生成一個窗口類供修改   
  6.     CView::PreCreateWindow(cs);  
  7.       
  8.     //2.得到窗口類   
  9.     ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);  
  10.   
  11.     //3.修改窗口類   
  12.     wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));    
  13.     OutputDebugString(wndclass.lpszClassName);  
  14.   
  15.     //4.更新窗口類   
  16.     //反注冊MFC自動生成的窗口類(因為新舊窗口類名稱一樣)   
  17.     ::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());  
  18.     //注冊修改后的窗口類   
  19.     AfxRegisterClass(&wndclass);  
  20.   
  21.     //因為新舊窗口類名稱一樣,不必執行下面這句代碼   
  22.     //cs.lpszClass=wndclass.lpszClassName;   
  23.       
  24.     //注意返回TRUE   
  25.     return TRUE;  
  26. }  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM