mfc修改主窗口风格和窗口类
MFC中各种控件透明的实现方法总结

MFC中各种控件透明的实现方法总结在MFC中实现控件透明的方法有多种,下面总结了几种常用的方法:
1.使用窗口风格(WS_EX_TRANSPARENT):在控件的创建过程中,使用WS_EX_TRANSPARENT风格可以使控件透明。
这个风格将使控件透明并允许鼠标事件穿透到控件底下的其他控件上。
2. 设置背景透明:可以通过重载控件的OnEraseBkgnd函数,将背景绘制为透明的,实现控件的透明效果。
具体的实现方法是,将背景绘制为透明色,并返回TRUE。
3.使用位图作为控件背景:可以使用透明位图作为控件的背景,这样控件就可以显示位图中的内容,并实现透明效果。
具体的实现方法是,将位图加载进内存DC中,然后将内存DC中的图像绘制到控件的DC上。
4.通过子类化控件:通过子类化控件,可以拦截并处理控件的绘制消息,从而实现透明效果。
具体的实现方法是,创建一个继承自原始控件类的子类,并重载子类的绘制函数,将背景绘制为透明。
6. 使用窗口类别(WS_EX_LAYERED):在控件的创建过程中,使用WS_EX_LAYERED风格可以使控件透明。
这个风格将使控件的窗口使用Alpha混合来控制窗口的透明度。
以上是一些常用的方法来实现MFC中各种控件的透明效果。
根据具体的需求和控件类型,选择适合的方法来实现透明效果。
需要注意的是,在使用透明效果时,需要确保控件的父窗口也是透明的,否则无法实现完全透明的效果。
7.MFC界面与美化

7.2窗口图标与背景修改
7.2.2 修改背景 步骤
1、创建兼容设备描述表 2、创建、装入位图 3、位图选入兼容设备描述表 4、将兼容设备描述表复制到当前设备描述表
详见例7-2
修改背景(实例 7-2) 步骤
1、新建MFC单文档App(ChangeBackground) 2、资源面板添加一个位图资源 3、在CChangeBackgroundView::OnDraw()贴图
2、 MainFrame::OnCreate()
修改窗口外观
视图类中修改 (例7-3 CFra bibliotekangeFrm)
1、 ChangeFrm::PreCreateWindows()
修改WNDCLASS AfxRegisterWndClass() SetClassLong()
2、 ChangeFrm ::OnCreate()
7.3工具栏编程与美化
7.3.1 创建工具栏
增加一个工具栏资源 框架类头文件中声明 CMFCToolBar对象 CMainFrame::OnCreate()中创建工具栏并加载
(可参考向导生成的标准工具栏)
7.3.2 工具栏中添加、删除按钮
编辑位图 修改按钮属性(ID,Width,Height,Prompt) 调整顺序、增加分割线、删除按钮
在该函数返回前 1、先调用PreCreateWindow(),对Create()/CreateEx()中的风格参 数进行预处理设置 2、调用OnCreate() 进行实际的窗口创建
VS2010 更改MFC标题及标题栏图标和exe图标

VS2010 更改MFC标题及标题栏图标和exe图标在VS2010下新建一个MFC的多文档应用程序,程序默认的标题是“文档名-工程名”。
图标默认的是写着MFC的三个方块。
但在很多软件中都不是使用的默认设置,开发者们都将标题和图标改过,以符合项目要求,而且直观好看。
一修改标题(一)基于MFC对话框*对话框标题栏内容为静态MFC对话框型程序动态修改自身标题的方法有以下几种:1. 直接在资源视图-Dialog-属性-外观的“Caption”中修改。
2. 最简单的是用对话框类自身的类函数:BOOL CMyDlg::OnInitDialog(){CDialog::OnInitDialog();......SetWindowText("My Title");return TRUE; // return TRUE unless you set the focus to a control}3. 其次还可以用API函数来完成:::SetWindowText(m_hWnd, "My Title"); 或 ::SetWindowText(GetSafeHwnd(), "My Title");m_hWnd也是MFC对话框类的成员变量,可直接引用,GetSafeHwnd()的作用与其一样。
*对话框标题栏内容为动态生成的在对应对话框的初始化函数OnInitDialog()中添加以下代码:CString title;title.Format("%d",Id);//在标题栏动态显示Id的值this->SetWindowText(title);(二)基于MFC单、多文档标题分为前后两部分,前面一部分默认是文档名,后面一部分默认是工程名,比如我新建一个叫做UITEST的工程,那标题就是“UITEST1-UITEST”。
后面都用这个工程为例。
1.修改前半部分:可以重载文档类的虚函数SetTile,如下void CTestDoc::SetTitle(LPCTSTR lpszTitle){CDocument::SetTitle(L"你的标题");}也可以在UITESTDoc.app中,在BOOL CUITESTDoc::OnNewDocument()函数中添加SetTitle(L"你的标题")2.修改后半部分:改资源字符串在资源视图的String Table中找到IDR_MAINFRAME,将其标题改为你想要的标题3.去掉-:去掉标题中间的-,只显示后面的标题,方法1:通过重载CFramWnd类的OnUpdateFrameTitle函数virtual void OnUpdateFrameTitle(BOOL NaDa);void CMainFrame.:OnUpdateFrameTitle(BOOL NaDa){CString csAppName;csAppName.Format(AFX_IDS_APP_TITLE);SetWindowText(csAppName);}此时显示的结果只有字符串资源AFX_IDS_APP_TITLE所定义的字符串,当然也可以把SetWindowText(csAppName)中的csAppName换成你想要的标题字符串。
VC++6[1].0入门【第三章、MFC编程概述】
![VC++6[1].0入门【第三章、MFC编程概述】](https://img.taocdn.com/s3/m/770bb56f58fafab069dc0213.png)
第三章 MFC 应用程序概述第3章 MFC 应用程序概述Microsoft Windows 是微软公司推出的一个应用于微机上的具有图形用户界面的多任务和多窗口的操作系统。
Windows 应用程序也称为窗口应用程序,所有的窗口应用程序都有着相同的窗口风格和菜单结构,用户界面友好,方便用户操作。
本章从剖析窗口应用程序的基本结构入手,继而介绍使用MFC 类库开发的应用程序框架结构,并介绍窗口应用程序运行的核心机制-消息映射。
学习了本章,你将对MFC 应用程序框架结构和运行机制有个整体的了解,为后面进入窗口应用程序开发打下良好的基础。
3.1 窗口应用程序概述窗口应用程序的开发一般采用可视化的面向对象的开发,可选择的窗口应用程序开发语言有Visual C++、Visual Basic 、Visual Java 、Dephi 等等。
无论采用哪一种开发语言,首先要了解窗口应用程序的基本机制。
3.1.1 窗口编程基础窗口应用程序运行于Windows 操作系统,Windows操作系统是一个多任务操作系统,因此窗口应用程序的组成,支持技术,基本运行机制等与DOS 应用程序有着本质的区别。
在学习开发窗口应用程序之前,先要对窗口应用程序有一个概念上的了解。
1. 窗口窗口是应用程序与用户进行交互的界面,应用程序通过窗口传递信息给用户,同样用户通过窗口输入数据,发布命令给应用程序。
Windows 界面包含了丰富的标准用户界面元素,包括窗口、图标、菜单、滚动条、对话框、控件和消息框等。
用户使用这些界面元素可以方便的与应用程序进行交互,一个典型的窗口外观如图3-1所示。
垂直滚动条控制菜单栏标题栏菜单栏关闭按钮最小化按钮最大化按钮客户区VC++6简明教程图3-1 Windows应用程序窗口组成在Windows编程中,各种窗口、菜单、按钮、对话框及程序模块等Windows的规范部件是按“对象”来组织的。
为了提高开发窗口应用程序的效率,微软公司为用户提供了大量能创建上述标准元素的API函数和C++类,并且以Windows API函数库和C++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。
VC++中修改MFC窗口标题

return FALSE;
SetTitle (" 文档标题 " );
return TRUE;
}
运行程序,则每次选择选单中的“文件”的“新建”选项时,文档标题就变成 “文档标题- SDITitle”。
5) 是在CMainFrame的PreCreateWindow函数中修改窗口风格:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~(LONG) FWS_ADDTOTITLE;
return CFrameWnd::PreCreateWindow(cs);
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &=~ (LONG) FWS_ADDTOTITLE;
return CMDIChildWnd::PreCreateWindow(cs);
}
改变窗口类型,这步工作必须做。常量FWS_ADDTOTITLE是在文件\ msdev \ mfc \include \afxwin.h中定义。
VC++中修改MFC窗口标题
一·单文档接口(SDI)类型窗口标题的改变
首先,我们来看Windows SDI类型窗口标题栏的结构形式。结合具体例子说明:用VC的AppWizard创建一个名为“SDITitle”的单文档类型的工程,创建完工程后,编译运行该工程,程序主窗口标题形式如下:
文档标题 主窗口标题
MFC---视图和窗口

MFC---视图和窗⼝视类窗⼝是指程序运⾏后,显⽰信息的那⼀部分。
对应的类是CTestOneView (TestOne 表⽰项⽬名称)类,CTestOneView 类是派⽣于CView 类,⽽CView 类⼜派⽣于CWnd 类。
他们的继承关系可以通过查找类的定义来查看继承关系。
视图类CView ,拥有窗⼝的客户区域,负责显⽰⽂档数据,接受⽤户的输⼊,提供⽂档与⽤户的通信。
视类窗⼝只是主框架窗⼝中空⽩的部分。
主框架窗⼝是指程序运⾏后,程序的整个界⾯。
对应的类是CMainFrame ,CMainFrame 类派⽣于CFrameWnd 类,⽽CFrameWnd 类⼜⼜派⽣于CWnd 类。
主框架窗⼝就是整个应⽤程序外框所包括的部分,主框架窗⼝是视类窗⼝的⼀个⽗窗⼝。
⽂档类CDcoument ,负责维护应⽤程序所需要的数据,提供⼀系列可对这些数据进⾏操作的⽅法,并且能够为视图提供所需的数据。
新建⼀个MFC 单⽂档应⽤程序,项⽬名称为SDITest 。
从项⽬结构中可以看到SDITest 程序中还有⼀个CSDITestDoc 类,它派⽣于CDocument 类,CDocument 类的基类是CCmdTarget ,⽽CCmdTarget ⼜派⽣于CObject 类,从⽽可知这个CSDITestDoc 类不是⼀个窗⼝类,实际上是⼀个⽂档类。
MFC 提供的⽂档/视(Document/View )结构,能够把数据本⾝与它的显⽰分离开,其中⽂档是指CDocument 类,视类是指CView 类。
数据的存储和加载由⽂档类来完成,数据的显⽰和修改则由视类完成,从⽽把数据的管理和显⽰⽅法分离开来。
下⾯介绍⼀下MFC 单⽂档程序是如何将⽂档类对象、框架对象、视类对象组织在⼀起的。
在源⽂件SDITest.cpp 中找到CSDITestApp 类的InitInstance 函数定义,有下⾯这⼀段代码:从上⾯的代码段中可知,定义了⼀个单⽂档模板对象指针pDocTemplate ,这个对象把⽂档对象、框架对象、视类对象有机地组织在⼀起,形成了⼀个有机的整体,程序接着利⽤AddDocTemplate 函数把这个单⽂档模板添加到⽂档模板中,从⽽把这三个类组织为⼀个整体。
MFC使用的风格

MFC使用的风格当你创建相应的MFC时,使用下列风格。
在大多数情况下,这些风格通常在类的Create函数的dwStyle参数中设置。
按钮风格·BS_AUTOCHECKBOX 与复选框相同,但是当用户选择复选框时,检查标记出现在复选框中,而当用户再一次选择复选框时,检查标记就消失。
·BS_AUTORADIOBUTTON 与单项按钮相同,但是当用户选择它的时候,这个按钮自动加亮显示自己并去掉同组中相同风格的其它单项按钮的选择状态。
·BS_AUTO3STA TE 与三态复选框相同,但是当用户选择该框时它会改变自己的状态。
·BS_CHECKBOX 创建一个小方块,在它的右边显示文本(除非这个风格与BS_LEFTTEXT风格一起使用)。
·BS_DEFPUSHBUTTON 创建一个具有深黑边界的按钮。
用户可以按下ENTER键以选择这个按钮。
这个风格使用户可以快速地选择最相似的选项(缺省选项)。
·BS_GROUPBOX 创建一个矩形区域,其中的按钮是成组的。
与这种风格相关的任何文本将显示在矩形的左上角。
·BS_LEFTTEXT 当与单项按钮风格或复选框风格一起使用时,文本出现在单项按钮或复选框的左边。
·BS_OWNERDRAW 创建一个自画按钮。
当按钮的视觉状态发生改变时,框架调用DrawItem成员函数。
当使用CBitmapButton类的时候,必须设置这个风格。
·BS_PUSHBUTTON 创建一个按钮,当用户选择该按钮时向所有者窗口发送一个WM_COMMAND消息。
·BS_RADIOBUTTON 创建一个小圆形区域,在它的右边显示文本(除非这个风格与BS_LEFTTEXT风格一起使用)。
单项按钮通常成组使用但是只能独占选择。
·BS_3STATE 与复选框类似,但是这个框不仅可以被选中,还可以被变灰。
关于窗口属性的更改

cs.lpszName="seven Window name";
MFC自带的主框架属性是:cs.style=WS_OVERLAPPEDWINDOW | WS_ADDTOTITLE
(3)在窗口创建之前可改变的其他属性见CREATESTRUCT类型
(6)、用Get和Set配合去掉窗口的最大化框:
SetWindowLong(m_hWnd,GWL_STYLE,
GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);
RegisterClass(&wndcls);
//改变cs中的创建窗口用的类名为我们自己的类
//就行,不用再Create()的
//在框架中只能改变窗口图标,光标背景等是CView类的
cs.lpszClass="seven1";
//在CView类的PreCreateWindow()中也改一下:
3、MFC的使用:AfxRegisterClass()创建一个窗口类
在堆栈或者堆中创建CWnd对象-》调用成员Create()或者CreateEx()
-》调用::CreateWindowEx()创建窗口对象,句柄给CWnd
CWnd::m_hWnd存放对象关联的窗口对象
LoadCursor(NULL,IDC_CROSS),
(HBRUSH)GetStockObject(BLACK_BRUSH),
0);
其缺省参数后三个:0,0,0-》
图标:默认波浪形。光标:默认箭头。背景:默认透明。
10、在窗口创建之后,改变图标光标背景:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mfc修改主窗口风格和窗口类
AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名、窗口是叠加型的、可改变窗口大小等。
要修改窗口的缺省风格,需要重载
CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs。
CWnd::PreCreateWindow 函数先于窗口创建函数执行。
如果该函数被重载,则窗口创建函数将使用CWnd::PreCreateWindow 函数返回的CREATESTRUCT cs参数所定义的窗口风格来创建窗口;否则使用预定义的窗口风格。
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屏幕,标题条中仅显示窗口名,不显示文档名。
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);
}
修改窗口类,实现更改背景颜色
方法一:
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;
}
方法二:
BOOL CMFC_单文档View::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS wndclass;
//1.调用基类的同名函数,以自动生成一个窗口类供修改
CView::PreCreateWindow(cs);
//2.得到窗口类
::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass); //3.修改窗口类
wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100)); OutputDebugString(wndclass.lpszClassName);
//4.更新窗口类
//反注册MFC自动生成的窗口类(因为新旧窗口类名称一样)
::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());
//注册修改后的窗口类
AfxRegisterClass(&wndclass);
//因为新旧窗口类名称一样,不必执行下面这句代码
//cs.lpszClass=wndclass.lpszClassName;
//注意返回TRUE
return TRUE; 澳门新濠天地官网
}。