修改主窗口風格

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

typedef   struct   tagCREATESTRUCT   {  
LPVOID   lpCreateParams;   //   創建窗口的基本參數  
HANDLE   hInstance;   //   擁有將創建的窗口的模塊實例句柄  
HMENU   hMenu;   //   新窗口的菜單句柄  
HWND   hwndParent;   //   新窗口的父窗口句柄  
int   cy;   //   新窗口的高度  
int   cx;   //   新窗口的寬度  
int   y;   //   新窗口的左上角Y座標  
int   x;   //   新窗口的左上角X座標  
LONG   style;   //   新窗口的風格  
LPCSTR   lpszName;   //   新窗口的名稱  
LPCSTR   lpszClass;   //   新窗口的窗口類名  
DWORD   dwExStyle;   //   新窗口的擴展參數  
}   CREATESTRUCT;  
       
CREATESTRUCT結構的style域定義了窗口的風格。比如,缺省的MDI主窗口的風格中就包括FWS_ADDTOTITLE(在標題條中顯示當前的工作文檔名)、FWS_PREFIXTITLE(把文檔名放在程序標題的前面)、WS_THICKFRAME(窗口具有可縮放的邊框)等風格。由於多種風格參數由邏輯或(“|”)組合在一起的,因此添加某種風格,就只需用“|”把對應的參數加到CREATESTRUCT結構的style域中;刪除已有的風格,則需用“&”連接CREATESTRUCT結構的style域與該風格的邏輯非值。
CREATESTRUCT結構的x、y、cx、cy域分別定義了窗口的初始位置和大小,因此,在CWnd::PreCreateWindow   函數中給它們賦值,將能定義窗口的初始顯示位置和大小。
下例中的代碼將主框窗口的大小將固定爲1/4屏幕,標題條中僅顯示窗口名,不顯示文檔名。

BOOL   CMainFrame::PreCreateWindow(CREATESTRUCT&   cs)  
{  
//   TODO:   Modify   the   Window   class   or   styles   here   by   modifying  
//   the   CREATESTRUCT   cs  

//   修改主窗風格  
cs.style   &=   ~FWS_ADDTOTITLE;   //去除標題條中的文檔名  
cs.style   &=   ~WS_THICKFRAME;   //去除可改變大小的邊框  
cs.style   |=   WS_DLGFRAME;   //增加不能改變大小的邊框  

//   確定主窗的大小和初始位置  
int   cxScreen   =   ::GetSystemMetrics(SM_CXSCREEN);//獲得屏幕寬  
int   cyScreen   =   ::GetSystemMetrics(SM_CYSCREEN);   //獲得屏幕高  
cs.x   =   0;   //   主窗位於左上角  
cs.y   =   0;  
cs.cx   =   cxScreen/2;   //   主窗寬爲1/2屏幕寬  
cs.cy   =   cxScreen/2;   //   主窗高爲1/2屏幕高  
return   CMDIFrameWnd::PreCreateWindow(cs);  

}


用嚮導重載
void   CMainFrame::OnGetMinMaxInfo(MINMAXINFO   FAR*   lpMMI)  
{
//   TODO:   Add   your   message   handler   code   here   and/or   call   default
lpMMI   -> ptMaxTrackSize.x   =   ::GetSystemMetrics(SM_CXSCREEN);//獲得屏幕寬
lpMMI   -> ptMaxTrackSize.y   =   ::GetSystemMetrics(SM_CYSCREEN);//獲得屏幕高  
lpMMI   -> ptMinTrackSize.x   =   ::GetSystemMetrics(SM_CXSCREEN);//獲得屏幕寬
lpMMI   -> ptMinTrackSize.y   =   ::GetSystemMetrics(SM_CYSCREEN);//獲得屏幕高  
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}


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