• 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. }  
  • 相关阅读:
    AR路由器web界面每IP限速配置方法
    传输层:TCP 协议
    从需求的角度去理解Linux系列:总线、设备和驱动
    京东的个性化推荐系统
    数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法
    Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()
    Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
    拦截器及 Spring MVC 整合
    表现层 JSP 页面实现
    Controller 层实现
  • 原文地址:https://www.cnblogs.com/lidabo/p/2595388.html
Copyright © 2020-2023  润新知