mfc修改主窗口风格和窗口类
- 格式:docx
- 大小:16.31 KB
- 文档页数:2
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中各种控件的透明效果。
根据具体的需求和控件类型,选择适合的方法来实现透明效果。
需要注意的是,在使用透明效果时,需要确保控件的父窗口也是透明的,否则无法实现完全透明的效果。
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换成你想要的标题字符串。
第三章 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++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。
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时,使用下列风格。
在大多数情况下,这些风格通常在类的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 与复选框类似,但是这个框不仅可以被选中,还可以被变灰。
一,对话框背景为一幅位图1.插入位图打开VC6.0MFC程序,右击“Dialog”,打开“引入”,选择图片就可以引入一个位图了。
2.打开“ClassView”,再打开“CAbouttDlg()”函数,找到void CTuxingDlg::OnPaint()函数,粘贴上CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP1是你自己的图对应的IDBITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);二.在对话框上显示一幅位图法一:把图片引入工程,其句柄名为IDB_BITMAP2;然后放一个静态控件或者图片控件到对话框上,将其句柄名设为IDC_SHOWBMP; 具体代码为在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP);HBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAP hBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESOURCE(IDB_BITMAP2));//从工程资源处获得IDB_BITMAP2的位图句柄,并将其赋值给hBitmap变量p->Modifystyle(0xF,SS_BITMAP|SS_CENTERIMAGE);//设置该静态控件(p指向的静态控件),使其用于显示位图,并且是在控件中央显示//(若无此步无法显示,因为没有说明静态对话框要显示的类型是什么)p->SetBitmap(hBitmap);//将需要显示的位图设置为bBitmap,即资源IDB_BITMAP1的句柄法二:通过位图所在路径显示位图(此方法无需事先将位图文件添加为该工程的资源) 在对话框上放一个静态控件(一定是静态控件,若图片控件则无法显示) 将其重命名为IDC_BMP(不重命名的话无法添加变量),然后再为该控件添加一个变量,命名为m_image.在需要使用的地方(如按钮函数或OnInitDialog()或OnPaint()里等等)加入如下代码: this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);this->m_image.SetBitmap(hBmp);详解:this->m_image.ModifyStyle(0,SS_BITMAP |SS_CENTERIMAGE);//和上面的作用一样,将该静态控件设置为是用来显示位图的,只不过这里是通过该静态对话框的变量来进行/ /modifystyle操作的HBITMAP hBmp = (HBITMAP)::LoadImage(0, "path\\1.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //从bmp文件所在的路径直接读取该bmp图象的句柄,并将其转换为HBITMAP类型//注:其中的"path\\1.bmp"是相对路径,即在和可执行文件的同一目录下有一个名为path的文件夹,里面有一个名为1.bmp的位图文件.this->m_image.SetBitmap(hBmp); //通过变量m_image来设置该静态框所显示的位图文件.三.列表控件的背景在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码m_List.SetBkColor(RGB(444, 233, 255)); //三个参数可以任意改变,下同m_List.SetTextBkColor(RGB(444, 233, 255));四.设置列表控件属性带有表格线在BOOL CTuxingDlg::OnInitDialog()函数中添加以下代码DWORD NewStyle = m_List.GetExtendedStyle();NewStyle |= LVS_EX_GRIDLINES; m_List.SetExtendedStyle(NewStyle);五.改变全部界面的背景颜色点击“Globals”,再打开“theApp”,在Bool CPersonalFinancialManagementSystemApp::InitInstance()函数中添加SetDialogBkColor(RGB(444, 233, 255), RGB(0, 0, 0));。
MFC中CWnd类及其派生类对话框、消息处理、窗口操作CWnd类我们在屏幕上看到的所有对象都和窗口有关,它们或者派生于CWnd,属继承关系,如对话框、工具栏、状态栏、子控件;或者被CWnd合成,属服务员与服务对象关系,如图标、菜单、显示设备。
CWnd类封装的窗口操作主要包含窗口的创建和销毁、操作窗口风格、操作窗口状态、窗口子类化、获取指定窗口等。
当然,CWnd还实现了其他功能:1、绘制窗口GetDC()//取得客户区显示设备上下文GetWindowsDC()//取得整个窗口的显示设备上下文ReleaseDC()BeginPaint()EndPaint()PrintClient()RedrawWindow()//重绘客户区的某区域2、操作窗口子控件GetDlgItem():取得(临时的)控件对象指针SetDlgItemText()和GetDlgItemText():设置、取得控件标题SubclassDlgItem():将控件句柄与相应类相关联DlgDirList()和DlgDirListComboBox():以文件列表或目录列表填充(组合框)列表框CheckDlgButton()和CheckRadioButton():设置复选框(单选按钮)状态。
GetNextDlgTabItem():取得下一个WS_TABSTOP风格控件3、窗口定时器SetTimer():设置定时器KillTimer():销毁定时器4、窗口消息的相关函数GetCurrentMessage():取得当前被处理的消息PreTranslateMessage():可重载的虚函数。
被UI线程的消息循环调用,可以过滤窗口收到的消息,过滤出的消息得以分发SendMessage():向本窗口发送消息。
不通过消息循环,直接调用窗口函数处理消息。
窗口函数执行完毕,该函数才返回PostMessage():向本窗口寄送消息。
将消息放入消息队列,立即返回。
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; 澳门新濠天地官网
}。