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

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

[cpp] view plaincopyprint?

  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;     
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屏幕,标题条中仅显示窗口名,不显示文档名。

[cpp] view plaincopyprint?

  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. }   
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);
}

 

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

方法一:

[cpp] view plaincopyprint?

  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. }  
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;
}

 

方法二:

[cpp] view plaincopyprint?

  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. }  
时间: 2024-12-02 18:19:38

mfc修改主窗口风格和窗口类 .的相关文章

窗口风格-MFC SDI禁掉最大化按钮后程序把桌面任务里覆盖了,求大神解答

问题描述 MFC SDI禁掉最大化按钮后程序把桌面任务里覆盖了,求大神解答 2C MFC SDI禁掉最大化按钮后程序把桌面任务里覆盖了,求大神解答 解决方案 我是在 PreCreate 函数修改的窗口风格 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs){ if( !CFrameWndEx::PreCreateWindow(cs) ) return FALSE; // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口

MFC父窗口控制子窗口CListCtrl控件刷新的问题

问题描述 MFC父窗口控制子窗口CListCtrl控件刷新的问题 目标:父窗口单击按钮,向子窗口发送一个消息:子窗口的消息处理函数中,调用列表显示函数来刷新列表数据. 我的代码: // 父窗口void CDlg4::OnButtonClick(){ CDlg43 *dlg = new CDlg43(); dlg->Create(IDD_DIALOG_43this); if (NULL == dlg) { AfxMessageBox(""failed""); d

MFC子窗口和父窗口(SetParent,SetOwner)

一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list,即child.sibling.parent.owner四个域.所以我们可以看到,窗口之间的关系有两种:owner-owned 关系和 parent-child关系.前者称之为拥有/被拥有关系,后者称之为父/子关系.在这篇文字中,我把owner窗口称之所有者窗口.换句话说,一个窗口在有一个父窗口(pa

qt c++-Qt中,到底如何实现主窗口和子窗口之间的通信?

问题描述 Qt中,到底如何实现主窗口和子窗口之间的通信? RT,比如,当子窗口关闭时,重新打开主窗口.这个是如何通信的,希望能给上例子.我知道是用信号和槽,可是两个窗口(类)之间的信号和槽我还不太会.网上也没找到具体的例子.希望大婶们能给个好点的直观的例子. 解决方案 主窗体类为A,子窗体类为B,在A中实例化B,其对象为b,关闭b,但不要释放b,调用b的public方法返回数据.仔细理解. void A::buttonClick(){ B b; b.exec(); b.getData();} 或

操作-VC++ 主窗口与子窗口ListCtrl传值(有文字有整数,列表形式)

问题描述 VC++ 主窗口与子窗口ListCtrl传值(有文字有整数,列表形式) 在主窗口(父窗口)类中定义一个数据成员,用于实时更新ListCtrl的内容,当执行添加或者删除操作时,对应着更新这个数据成员.执行查找操作时,将主窗口的这个数据成员的指针传递给查找窗口(子窗口)对应的类中(在查找类中定义一个对应类型的数据成员指针),那么取数据时直接用的主窗口的实时数据. 现在遇到相同的问题,有些不太明白,恳请大虾贴出上述方法的具体代码,谢谢啦! 解决方案 使用委托与事件,如果是使子窗体中的内容·随

c#改变进程主窗口后,窗口上的timer,backgroundworker异常

问题描述 c#改变进程主窗口后,窗口上的timer,backgroundworker异常 原先program里的application.run是登录窗口,我现在改为主页面后,主页面上的timer控件设定的是1分钟执行1次,但是实际却1分钟执行3-5次,timer控件控制的backgroundworker也是,isbusy属性一直都是false,哪怕独立线程没结束,还是会运行.之前还好好的呢,为啥? 图片是main入口 下面是主页面上的1个timer和对于的独立线程. /// /// 数据质量监控

mfc 窗口通信-mfc 窗口分割,窗口之间通信

问题描述 mfc 窗口分割,窗口之间通信 mfc 窗口分割后,如何实现一个窗口的控件与另一个窗口控件的通信 解决方案 关于切分视图,最佳的实践是通过共享的文档对象来共享数据. 解决方案二: 用父窗口做中转,子窗口都可以访问父窗口

winform-主窗口 向子窗口传值,主窗口 textchange 子窗口输入框也变

问题描述 主窗口 向子窗口传值,主窗口 textchange 子窗口输入框也变 form1(主窗口)呼出form2(子窗口),然后将form1的值通过委托传给form2,利用委托怎么实现呢.我写了 但是 老是出来新窗口.因为没有币,所以不能悬赏.让我哭一下,新手求答案 解决方案 方法:信号槽 假设主窗口为A? : 子窗口 为 a : 给子窗口定义一个信号,当触发这个信号,使用信号槽连接来发送参数. 子窗口定义信号: signals: void toMainWindow(QString); 在子窗

窗口风格-windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式?

问题描述 windows编程中怎样让建立的窗口不能拉伸,应该设置什么样式? 最近在学习Windows编程,看windows程序设计,但那个hellowin程序出来的窗口是可以拉伸的,怎样固定下来,让窗口不可以拉伸,应该是一个窗口样式或者风格,但老是查不出来,求助! 解决方案 WS_SIZEBOX WS_THICKFRAM 解决方案二: http://blog.csdn.net/diaolingle/article/details/17284711 解决方案三: WS_BORDER 0X00800