且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

MFC单文档应用程序 修改style 光标 图标 背景 等综合

更新时间:2022-08-13 08:18:43

 

 首先我们修改窗体 有2种方法  一是  在窗体创建之前   二是在窗体创建之后 修改  下面就介绍各种修改方法
  参考  MSDN window style    window styles   

 
    用到的函数  GetWindowLong  SetWindowLong      GetClassLong   SetClassLong  在窗体创建之后修改窗体的属性 图标光标 等等  
    AfxRegisterWndClass函数返回一个已经注册的窗口类的名字以便我们给CREATESTRUCT结构体赋值 
    RegisterClass注册窗口类  
    ::DefWindowProc   缺省窗口过程 一定要加全局符号   因为 CWnd类也有同名函数否则VC会编译报错 
    AfxGetInstanceHandle获得应用程序句柄
    LoadIcon(NULL,IDI_ERROR);  //要使用系统图标 参数一实例的句柄必须设置为NULL     如果 引用了 图标资源那么不能为NULL  应该是AfxGetApp()->m_hInstance;
    LoadCursor(NULL,IDC_HELP);

 

1.

   窗体创建之前修改这种修改是通用的我们可以再 从CWnd派生的类中覆盖这个虚函数   SDI程序 主界面由框架窗体 和视图构成 
   这个函数在窗体创建之前   

  
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)   //在窗体生成之前传递给MFC底层代码 CreateWindowEx在这里的改变会影响到底层代码
{                                                   //这个CREATESTRUCT的结构体的参数和创建窗口所需要的WNDCLASSEX参数完全一样只是顺序不同
 if( !CFrameWnd::PreCreateWindow(cs) )          //window style 参考  
  return FALSE;
     
 
         cs.cx=500;   //修改大小
  cs.cy=500;
  cs.style&=~FWS_ADDTOTITLE;  //MFC默认这个属性把window caption设置为 文档标题 所以我们要去掉这个属性用&=  取反           cs.lpszName="http://www.xiaowei.org"; 

  //因为 引用关系所作的修改都会影响到MFC创建窗体的底层代码

 

      

     //如何修改窗体的图标光标背景呢 这些事创建窗口的时候MFC指定的  我们不能也不应该修改MFC底层代码 但是我们可以注册自己的窗口类

   /*     WNDCLASS wndcls;
   wndcls.cbClsExtra=0;
   wndcls.cbWndExtra=0;
   wndcls.hbrBackground=(HBRUSH)::GetStockObject(BLACK_BRUSH);
   wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
   wndcls.hIcon=::LoadIcon(NULL,IDI_ERROR);
   wndcls.hInstance=::AfxGetInstanceHandle();
   wndcls.lpfnWndProc=::DefWindowProc;// 缺省窗口过程 因为CWnd类也有一样的函数所以 我们应该加上全局限定符
   wndcls.lpszClassName="xiaowei.com";
          wndcls.lpszMenuName=NULL;//对于一个MDI程序来说 菜单的创建不是在注册窗口类的时候  所以 NULL
   wndcls.style=CS_HREDRAW|CS_VREDRAW; //窗口类型 水平重画 和垂直重绘   
           RegisterClass(&wndcls);//窗口类一经注册全局 便可以使用 类名字 
   cs.lpszClass="xiaowei.com"; //吧底层代码的窗口类换成我们注册的    

     */


 
             //上面的修改太过繁琐  我们要修改 窗口  的光标 图标 背景其实很简单   AfxRegisterWndClass()函数返回一个 注册的窗口类名
            //cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_ERROR));修改成我们注册的窗口类  
}

 


2.窗体创建之后修改 窗体的属性   图标光标  背景  等等    具体看MSDN  window styles   class styles  有相关的设置参数

在 框架类 或者 视图类的WM_CREATE消息的响应事件中 

      //SDI的主窗体就是框架  就好像 基于对话框的程序一样 主窗体是对话框
     //我们再窗体创建之后通过 SetWindowLong 改变窗口属性  GetWindowLong 获得现有窗口的信息
    //::SetWindowLong(this->m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW );
   //修改的属性值 参考window styles
     ::SetWindowLong(this->m_hWnd,GWL_STYLE,::GetWindowLong(this->m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);


       
        //在视图中用 这个函数设置视图的背景   在框架类设置背景  光标无意义    应该砸view类设置 光标和背景
    ::SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)::GetStockObject(GRAY_BRUSH));