mfc修改主窗口风格和窗口类 .

摘要:
AppWizard生成的应用程序框架的主窗口具有默认窗口样式,例如自动将文档名称添加到窗口标题栏、叠加窗口以及更改窗口大小。如果函数重载,窗口创建函数将使用CWnd::PreCreateWindow函数返回的CREATESTRUCTcs参数定义的窗口样式创建窗口;否则,请使用预定义的窗样式。

AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名、窗口是叠加型的、可改变窗口大小等。要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs。
CWnd::PreCreateWindow 函数先于窗口创建函数执行。如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT cs参数所定义的窗口风格来创建窗口;否则使用预定义的窗口风格。
CREATESTRUCT结构定义了创建函数创建窗口所用的初始参数,其定义如下:

  1. typedefstructtagCREATESTRUCT{
  2. LPVOIDlpCreateParams;//创建窗口的基本参数
  3. HANDLEhInstance;//拥有将创建的窗口的模块实例句柄
  4. HMENUhMenu;//新窗口的菜单句柄
  5. HWNDhwndParent;//新窗口的父窗口句柄
  6. intcy;//新窗口的高度
  7. intcx;//新窗口的宽度
  8. inty;//新窗口的左上角Y坐标
  9. intx;//新窗口的左上角X坐标
  10. LONGstyle;//新窗口的风格
  11. LPCSTRlpszName;//新窗口的名称
  12. LPCSTRlpszClass;//新窗口的窗口类名
  13. DWORDdwExStyle;//新窗口的扩展参数
  14. }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屏幕,标题条中仅显示窗口名,不显示文档名。

  1. BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs)
  2. {
  3. //TODO:ModifytheWindowclassorstylesherebymodifying
  4. //theCREATESTRUCTcs
  5. //修改主窗风格
  6. cs.style&=~FWS_ADDTOTITLE;//去除标题条中的文档名
  7. cs.style&=~WS_THICKFRAME;//去除可改变大小的边框
  8. cs.style|=WS_DLGFRAME;//增加不能改变大小的边框
  9. //确定主窗的大小和初始位置
  10. intcxScreen=::GetSystemMetrics(SM_CXSCREEN);//获得屏幕宽
  11. intcyScreen=::GetSystemMetrics(SM_CYSCREEN);//获得屏幕高
  12. cs.x=0;//主窗位于左上角
  13. cs.y=0;
  14. cs.cx=cxScreen/2;//主窗宽为1/2屏幕宽
  15. cs.cy=cxScreen/2;//主窗高为1/2屏幕高
  16. returnCMDIFrameWnd::PreCreateWindow(cs);
  17. }
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);   
} 

修改窗口类,实现更改背景颜色

方法一:

  1. BOOLCMainWindow::PreCreateWindow(CREATESTRUCT&cs)
  2. {
  3. //TODO:在此添加专用代码和/或调用基类
  4. if(CFrameWnd::PreCreateWindow(cs))
  5. {
  6. //改变窗口类
  7. WNDCLASSwndclass;
  8. ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
  9. //wndclass.hbrBackground=(HBRUSH)(COLOR_3DFACE+1);
  10. //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  11. wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
  12. wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能为函数局部变量
  13. wndclass.hbrBackground=*(newCBrush(RGB(25,25,0)));//最方便的方法
  14. //wndclass.hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
  15. wndclass.lpszClassName=_T("newViewClassName");
  16. VERIFY(AfxRegisterClass(&wndclass));
  17. cs.lpszClass=wndclass.lpszClassName;
  18. returnTRUE;
  19. }
  20. returnFALSE;
  21. }
BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此添加专用代码和/或调用基类
	if( CFrameWnd::PreCreateWindow(cs))
	{	
		//改变窗口类
		WNDCLASS   wndclass; 

		::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); 
		//wndclass.hbrBackground   =   (HBRUSH)(COLOR_3DFACE   +   1); 
		//wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
		wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
		wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能为函数局部变量
		wndclass.hbrBackground=*(new CBrush(RGB(25,25,0)));//最方便的方法
		//wndclass.hCursor   =   AfxGetApp()-> LoadCursor(IDC_CURSOR1); 
		wndclass.lpszClassName   =   _T("newViewClassName "); 
		VERIFY(AfxRegisterClass(&wndclass)); 
		cs.lpszClass=wndclass.lpszClassName;
		return TRUE;
	}
	return FALSE;
}

方法二:

  1. BOOLCMFC_单文档View::PreCreateWindow(CREATESTRUCT&cs)
  2. {
  3. WNDCLASSwndclass;
  4. //1.调用基类的同名函数,以自动生成一个窗口类供修改
  5. CView::PreCreateWindow(cs);
  6. //2.得到窗口类
  7. ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
  8. //3.修改窗口类
  9. wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
  10. OutputDebugString(wndclass.lpszClassName);
  11. //4.更新窗口类
  12. //反注册MFC自动生成的窗口类(因为新旧窗口类名称一样)
  13. ::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());
  14. //注册修改后的窗口类
  15. AfxRegisterClass(&wndclass);
  16. //因为新旧窗口类名称一样,不必执行下面这句代码
  17. //cs.lpszClass=wndclass.lpszClassName;
  18. //注意返回TRUE
  19. returnTRUE;
  20. }

免责声明:文章转载自《mfc修改主窗口风格和窗口类 .》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇自动化部署 jenkins 插件简介Dns局域网域名解析下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC常见问题解惑

MFC类的分类 1Root: CObject :CObject2Application Architecture Classes:CWinApp/CFrameWnd/... 3Window, Dialog, and Control Classes:CWnd/CDialog/...4Drawing and Printing Classes :CGdiObje...

MFC/VC++ UI界面美化技术

1. 工具: 1.1设备环境类: Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需 要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows的设备无关性。 MFC的CDC类封装了...

MFC对话框和控件

对话框和控件 对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据。控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入、输出功能。对话框与控件关系密切,在每个对话框上一般都有一些控件,对话框依靠这些控件与用户进行信息的交互。 在MFC中,对话框的功能被封装在CDialog类中,而CDialog类是...

MFC 创建多层目录

创建多层目录 1 BOOL CTestToolCtr::CreateFolder(CString strNewFolder) 2 { 3 /********************************************************************** 4 [Name ] 5 CreateFolder...

学习 MFC之 工具栏(二)

对于InitToolBar()函数进行进一步解析: 1、首先声明一个全局对象:  CToolBar m_toolbar; 2、然后用create()创建toolbar: //创建ToolBar工具条 if(!m_toolbar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP...

MFC 扫雷

花了两天时间做了一个MFC的扫雷,简单的实现了扫雷的功能,界面很草小毛病很多(比如标题。。),还望大家多多指正。 开发工具: VS2008 代码:https://files.cnblogs.com/GhostZCH/FindMine.rar 界面如下,红色的是标记,绿色的是还没有打开的各种,黄色的是已经打开的,红星是地雷(原谅程序的丑陋,唉,我也不是做美工...