单/多文档的窗体类属性修改(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)

View Code
//获得窗口大小
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前相应

原文地址:https://www.cnblogs.com/kzang/p/2788900.html