单/多文档的窗体类属性修改(VC_MFC)
(本章节中例子都是用 VS2005 编译调试的)
窗口与窗口类关系
与窗口类关系 MFC 类窗口类中封装了一个窗口句柄,窗口销毁时候,与之对应的MFC类窗口对象看其生命是否结束,但是MFC类窗口类对象销毁时候,与之对应的窗口一定会被销毁
修改程序外观
- 修改应用程序窗口图标,标题栏在框架类中实现
- 修改应用程序背景与光标(因为视觉类窗口始终覆盖在框架类上) 在视类中实现
设置窗口类属性
在窗体生成前且窗口类注册前
在CMainFrame的PreCreateWindow函数中进行:
- 第一种 修改函数中传递的CREATESTRUT结构的对象cs,修改cs中的对应属性,便可以达到修改窗体类的对应属性(CREATESTRUT结构类似于Win32编制中的WNDCLASS结构)
- 第二种 自身定义一个 WNDCLASS 结构成员变量,并注册此窗体结构变量,(用RegisterClass函数注册窗体类),后 cs.lpszClass = "窗体类名"
- 第三种 MFC提供了一个全局函数,用来设定窗口的类型,光标,背景和图标 AfxRegisterWndClass 函数,然后 cs.lpszClass = AfxRegisterWndClass();
代码示例(用VS2005调试):
首先先看看未被改变的时,工程生成的单文档示例的运行结果:
第一种:(使初始化程序无菜单栏)
在CMainFrame的PreCreateWindow函数中添加下添加:
cs.hMenu = NULL;
运行结果:
第二种:(使初始化程序无菜单栏)
在CMainFrame的PreCreateWindow函数中添加下添加:
WNDCLASS wndclass; WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); wndcls.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); wndcls.hInstance=AfxGetInstanceHandle(); wndcls.lpfnWndProc=::DefWindowProc; wndcls.lpszClassName=L"test"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); cs.lpszClass=L"test";
运行结果同上
第三种:(修改程序图标)
首先为工程添加一个图标资源(资源 ID 为 IDI_ICON1),资源视图如下:
然后在CMainFrame的PreCreateWindow函数中添加下添加:(AfxRegisterWndClass)
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));
运行结果:
在窗体显示前且窗体类注册后
说明
在类中的 OnCreate 函数实现,用SetClassLong函数设置窗体类的属性
代码示例(用VS2005调试):
首先先看看未被改变的时,工程生成的单文档示例的运行结果:
接着需要修改窗口图标,先为工程添加一个图标资源(资源 ID 为 IDI_ICON1),资源视图如下:
然后在 CMainFrame 的 OnCreate 函数中添加下添加:(SetWindowLong)
SetClassLong(m_hWnd,GCL_HICON,(LONG)AfxGetApp()->LoadIcon(IDI_ICON1));
运行结果:
在窗体生成后
- 用 SetWindowLong 函数实现
- 用 GetWindowLong 函数获得当前窗体属性
- 在 MFC 中还提供 ModifyStyleEx 修改窗口的扩展属性(你可以在 OnCreate 函数中调用它去掉 WS_EX_TOOLWINDOW,然后便可以在任务栏中去掉显示的本窗体图标)
实现代码(用VS2010调试):
首先先看看未被改变的时,工程生成的单文档示例的运行结果:
接着需要修改窗口属性,为文档程序在主菜单栏上添加个 显示/隐藏系统栏 的菜单项,完成显示/隐藏系统栏的这个功能.菜单资源(菜单资源 ID 为 IDR_MAINFRAME,菜单项 ID 为 ID_CH)视图如下:
为菜单项 显示/隐藏系统栏 在框架类中添加事件响应函数(添加在框架类中,即 MainFrm 中),后在事件响应函数中添加相关操作,具体代码如下:(SetWindowLong)
//获得窗口大小 CRect rc; this->GetWindowRect(&rc); //判断窗体是否有系统栏 if(GetWindowLong(GetSafeHwnd(),GWL_STYLE) & WS_CAPTION) { //去掉标题栏 SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) & ~WS_CAPTION); //窗体高度减 30 个像素点,即为窗体减去标题栏的高度 rc.top+=30; } else { //添加标题栏栏 SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) | WS_CAPTION); //窗体高度加 30 个像素点,即为窗体加上标题栏的高度 rc.top-=30; } //移动窗体到新矩形区中 this->MoveWindow(&rc);
运行结果:
注意:
函数在窗口完全创建完成后第一个调用的函数并且在OnPaint前相应