7.MFC界面与美化
基于MFC的桌面应用程序开发与优化
基于MFC的桌面应用程序开发与优化一、引言随着计算机技术的不断发展,桌面应用程序在日常生活和工作中扮演着越来越重要的角色。
MFC(Microsoft Foundation Class)作为Windows平台下的经典桌面应用程序开发框架,具有丰富的功能和强大的扩展性,被广泛应用于各种领域。
本文将重点探讨基于MFC的桌面应用程序开发与优化,旨在帮助开发人员更好地利用MFC框架构建高效、稳定的桌面应用程序。
二、MFC框架概述MFC是微软公司提供的一套C++类库,旨在简化Windows应用程序的开发过程。
通过MFC,开发人员可以快速构建具有丰富用户界面和功能的桌面应用程序。
MFC提供了诸多类和函数,涵盖了窗口管理、消息处理、控件设计等方方面面,为开发人员提供了强大的工具箱。
三、MFC应用程序的创建在开始开发基于MFC的桌面应用程序之前,首先需要创建一个MFC应用程序项目。
在Visual Studio中,选择“新建项目”->“Visual C++”->“MFC应用程序”,按照向导指引完成项目创建过程。
在创建项目时,可以选择不同类型的应用程序模板,如单文档应用程序、多文档应用程序等,根据实际需求选择合适的模板。
四、MFC应用程序开发实践1. 界面设计MFC提供了丰富的控件库,开发人员可以通过拖拽控件到对话框上的方式快速设计用户界面。
在设计界面时,需要考虑用户体验和美观性,合理布局各个控件,并确保界面风格统一。
2. 事件处理事件处理是MFC应用程序开发中至关重要的一环。
通过响应用户操作或系统消息,触发相应事件并执行相应操作。
在MFC中,可以通过消息映射表和消息处理函数来实现事件处理,确保应用程序能够正确响应用户操作。
3. 数据处理对于需要处理数据的桌面应用程序,数据处理是不可或缺的部分。
MFC提供了数据库支持和文件操作等功能,可以方便地进行数据读写操作。
开发人员需要合理设计数据结构和数据流程,确保数据的准确性和完整性。
MFC自绘控件与界面美化
MFC自绘控件与界面美化界面美化摘要本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。
读者最好具有以下VC基础:1. 大致了解MFC框架的基本运作原理;2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;3. 熟悉OOP理论和技术;本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。
正文1. 美化界面之开题篇相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:图1 瑞星杀毒软件的精美界面程序的功能如何如何强大是一回事,它的用户界面则是另一回事。
千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。
“受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。
2. 美化界面之基础篇美化界面需要先熟悉Windows下的绘图操作,并明白Windows 的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免……2.1 Windows下的绘图操作熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。
你也可以花点时间画个按钮,画个你自己的菜单,等等……Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。
要了解Windows下的绘图操作,要实现Windows 界面的美化,就必须了解MFC封装的设备环境类和图形对象类。
2.1.1 设备环境类Windows下的绘图操作说到底就是DC操作。
DC(Device Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。
这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。
mfc课程设计报告模板
mfc课程设计报告模板一、教学目标本课程的教学目标是使学生掌握MFC(Microsoft Foundation Class)的基本概念和编程技巧,培养学生使用MFC进行Windows应用程序开发的能力。
具体目标如下:1.知识目标:(1)理解MFC的基本概念,如窗口、消息、事件等。
(2)掌握MFC的编程步骤,如创建项目、添加类、编写代码等。
(3)熟悉MFC常用的类和函数,如CCmdTarget、CWnd、AfxMessageBox等。
2.技能目标:(1)能够使用MFC编写简单的Windows应用程序。
(2)能够使用MFC进行窗口布局和界面设计。
(3)能够使用MFC处理消息和事件,实现用户交互。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣和热情。
(2)培养学生解决问题的能力和创新精神。
(3)培养学生团队协作和良好沟通的意识和能力。
二、教学内容本课程的教学内容主要包括MFC的基本概念、编程步骤和常用类及函数。
具体安排如下:1.MFC的基本概念:介绍MFC的起源、发展及其在Windows应用程序开发中的应用。
2.MFC的编程步骤:讲解如何创建MFC项目、添加类、编写代码等。
3.MFC的常用类及函数:介绍MFC的核心类,如CCmdTarget、CWnd等,以及常用的函数,如AfxMessageBox等。
4.窗口布局和界面设计:讲解如何使用MFC进行窗口布局、界面设计以及界面美化。
5.消息和事件处理:讲解MFC如何处理消息和事件,实现用户交互。
6.实战项目:通过实际项目案例,让学生掌握MFC的应用,提高实际编程能力。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:教师讲解MFC的基本概念、编程步骤和常用类及函数。
2.讨论法:教师引导学生进行问题讨论,巩固所学知识。
3.案例分析法:分析实际项目案例,让学生学会运用MFC解决实际问题。
mfc界面设计教程
mfc界面设计教程MFC(Microsoft Foundation Classes)是一套用于开发Windows平台上图形用户界面(GUI)的C++类库。
MFC界面设计是开发Windows应用程序中不可或缺的一部分。
本文将向您介绍一些MFC界面设计的基本原则和技巧,帮助您创建出具有吸引力和用户友好的应用程序界面。
首先,设计一个清晰的用户界面是至关重要的。
您需要确保您的应用程序界面布局简洁明了,易于导航。
使用适当的菜单和工具栏来组织您的功能,使用户能够方便地找到和使用这些功能。
避免界面过于拥挤或混乱,这会给用户带来困惑和不满。
其次,选择合适的颜色和字体可以提升您应用程序界面的外观。
一般来说,最好选择与您应用程序主题相关的颜色,并确保文字清晰可读。
避免使用太多花哨的字体或颜色,这可能会让用户感到眼花缭乱。
另外,为您的界面添加一些可视化元素也是一个不错的选择。
例如,您可以使用图标来表示不同的功能或操作,这有助于用户更快地识别和理解这些内容。
您还可以考虑使用一些动画效果或过渡效果来吸引用户的注意力,但要确保这些效果不会分散用户的注意力或降低应用程序的性能。
此外,考虑到用户的反馈是很重要的。
您可以通过使用弹出窗口、对话框或状态栏来向用户显示相关的提示信息,告知他们当前的操作状态或发生的错误。
提供适当的错误处理机制也非常重要,以便用户能够轻松地解决问题或进行必要的更正。
最后,测试是一个不可忽视的环节。
在设计和开发过程中,您应该经常测试您的界面,以确保它在不同屏幕分辨率和操作系统上都能够正常显示和工作。
同时,您还应该进行用户体验测试,以了解用户对您设计的界面的感受和反馈,并根据需要进行相应的修改和改进。
总结起来,MFC界面设计需要注意清晰布局、合适的颜色和字体、可视化元素、合理的反馈机制以及充分的测试。
通过遵循这些原则和技巧,您可以创建出用户友好和吸引人的应用程序界面。
希望本文对您的MFC界面设计有所帮助!。
MFC窗口的颜色和字体的设置
3、如果要改变OK按钮的文字颜色,靠上面的方式是不行的。我们需要创建一个新的从CButton类继承的CTestBtn类,并用类向导添加一个类的DrawItem的虚函数,加入以下代码(可以从CButton的例子中复制):
// TODO: Add your code to draw the specified item
if (pWnd->GetDlgCtrlID()==IDC_TEXT) /*如果为ID号所指的静态文本框*/
{
pDC->SelectObject(&m_font); /*则将绘图设备加入所需的字体。*/
}
注意,因为OnPaint消息响应函数是在控件被绘制之前触发的,它所返回的HBRUSH画刷句柄,便携带了我们所设置的这些属性。
注意如果要设置单行EDIT的文字背景色,需要使用SetBkColor设置,而SetBkMode即使为透明,文字的背景仍为系统的默认色。
3、利用上面的原理,在对话框控件响应OnPaint消息时,将一个静态文本显示所设置字体的文字。添加一个静态文本框,改名为IDC_TEXT。添加一个字体成员变量 private: CFont font;在对话框的构造函数中对字体进行初始化: m_font.CreatePointFont(200,"华文行楷");在2的return hbr;之前加入如下代码:
MFC窗口的颜色和字体的设置
1、改变对话框的底色
在对话框的类中添加一个 private : CBrush m_brush;的成员变量。在类的构造函数中添加如下代码:
m_brush.CreateSolidBrush(RGB(0,0,255)); //初始化为蓝色
让你的软件界面更漂亮[VC][二]
让你的软件界面更漂亮[VC][二]一、统一风格漂亮界面设计的理论与实现a.窗口和对话框Windows操作系中窗口和对话框在我们看来是一样的,就是一个四边形,有标题栏、系统按钮,边框等,可移动和可变大小。
实际上窗口和对话框是有的区别的。
在创建对话框窗口时的工作中要发生两个主要过程:对话框的过程和其窗口过程。
Win32 SDK对话框使用了系统提供的对话框窗口的窗口过程和对话框过程,对话框过程将被窗口过程调用。
在MFC下,所有的窗口类都使用了同一个窗口过程,对话框类也一样。
MFC对话框过程只处理WM_INITDIALOG消息,其余都让窗口过程处理,我们只能在函数OnInitDialog()中有唯一机会处理我们的对话框的初始化工作。
因而我们设计界面时要在窗口过程处理中相关消息实现我们的界面。
b. 几个有关对话框窗口消息的处理1.WM_NCPAINT:重画非客户区消息重载此消函数,可以标题栏上为所欲为。
2. WM_NCLBUTTONDOWN:在非客户区上按下鼠标左键消息要想在标题栏相应鼠标左键,可重载此消函数3.WM_NCMOUSEMOVE:在非客户区上移动鼠标会产生此消息4.WM_SIZE:在窗口改变大小后产生此消息。
为了使软件更专业,调整对放框大小时,里面的各控件也应合理调整位置和大小,重载此消函数可实现目的。
还有很几个,其它的不介绍了。
c. 统一的界面风格实现如何运用上述知识请参考我的前一文让你的软件界面更漂亮[VC][一]中有介绍并有源程序。
漂亮界面的统一风格是如何实现的将是本文要讨论主要内容。
我们知道Windows操作系统窗口风格基本上是一致的,微软的应用软件程序也和操作系统风格基本是统一的。
所以使我们的CDialog 也跟其一样,要改变它的界面风格很困难。
除非你对MFC了如指掌,甚至要了解操作系统内核。
本人在摸索过程中经过无数次碰壁后,终于找到了希望。
看了上面两图你是不是对VC有信心了?Visual C++ 可实现你想要的统一风格界面。
MFC界面美化
SDI和MDI程序中对非客户区(标题栏、左右下边界)的美化基本思路是重载CMainFrame类的DefWindowProc()函数,并判断消息为:WM_NCPAINT,WM_NCACTIV ATE,WM_NOTIFY的时候,调用自己的绘制窗口标题栏的函数。
用GetSystemMetrics(SM_CSFRAME)和GetSystemMetrics(SM_CYFRAME)可以取得标题栏的左上角的坐标。
最大化,最小化的按钮自己画,如果不是在标准的位置,一定要记录下他们的位置,并且在WM_NCLBUTTONDOWN消息处理函数中判断是否是点击了按钮,以做出相应的处理。
系统图标也可以自己重新画。
主要任务有贴图(包括标题栏、左边界、右边界、下边界、系统图标、最大化、最小化、关闭按钮)、处理消息(屏蔽系统自带按钮、双击状态栏改变大小、鼠标停放在三个自绘按钮上时改变按钮图标、单击自绘按钮时作出相应反应)。
一、响应的消息及重载的函数响应的消息及重载的函数都在CMainFrame类中。
响应DefWindowProc函数,在其中判断消息是不是WM_NCPAINT、WM_MOVE、WM_NCACTIV ATE、WM_NOTIFY,若是则重画标题栏、左框架、右框架、下框架、最大化、最小化、关闭按钮(放在一个函数里)。
响应消息WM_NCHITTEST,使鼠标位于自绘按钮时返回相应hittest值,同时屏蔽自带按钮的鼠标事件。
简言之,当鼠标位于自绘按钮时,让系统误以为鼠标位于相应按钮,而当鼠标位于系统自带按钮时,让系统误以为鼠标只是位于标题栏。
自绘图标与之类似,不再赘述。
响应消息WM_NCMOUSEMOVE,判断光标是不是位于自绘最大化、最小化、关闭按钮区域,如是则重画相应的按钮。
响应消息WM_NCLBUTTONDOWN,判断单击左键时鼠标是否位于自绘制的最大化、最小化、关闭按钮或图标区域,如是则执行相应的按钮操作。
响应消息WM_NCLBUTTONDBCLK,使双击标题栏时窗口能最大化或还原。
MFC框架窗口界面设计(共58张PPT)
pStatus->SetPaneText(1,str);
二个窗格的文本
// wParam的低字节表示菜单、控件、加速键的命令ID
(3) 图形编辑器工作窗口的控制条上,单击“New Device Image”,单击[定制]。
// 更新第
FWS_ADDTOTITLE
1框架窗口
(6)在第四步对话框中,单击[高级], 如图,分别用于文档模板字串资源 内容和窗口风格的修改。
▪ 文档窗口一般都有相应的可见边框,它的客户区(除了窗口标题栏、边框外的区 域)是由相应的视图来构成的,因此可以说视图是文档窗口内的子窗口。文档窗 口时刻跟踪当前处于活动状态的视图的变化,并将用户或系统产生的消息传递给 当前活动视图。
1框架窗口
MFC AppWizard为每个窗口设置了相应的大小和位置。
ClassWizard信息文件
(9) 为CM.adinsFpr(aDmeev类el添o加peWrSMt_uSdEiToCUPRroSjOeRc的t)消息映射函数,项增目加代文码件:
(2) 在CMai.npFrlagme类添加WM_CONTEXTMENU消息映射,函数编代码译。信息文件
BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
➢ 除了上述风格外,框架窗口还有以下三个自己的风格。它们都可以在PreCreateWindow重载 函数的CREATESTRUCT结构中指定。
➢ FWS_ADDTOTITLE 该风格指定相关的信息如文档名添加到框架窗口标题的后面。
➢ FWS_PREFIXTITLE 该风格使得框架窗口标题中的文档名显示在应用程序名之前。
// 显示窗口
m_pMainWnd->UpdateWindow();
MFC 小技巧(更换皮肤,背景,标题栏,透明)
1.背景透明在MainFrame.Cpp中找到int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数添加代码SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^0x80000);// 添加库HINSTANCE hInst = LoadLibrary("User32.DLL");if(hInst){typedef BOOL (WINAPI *ShowLayer)(HWND,COLORREF,BYTE,DWORD);ShowLayer fun = NULL;// 读取函数指针fun = (ShowLayer)GetProcAddress(hInst, "SetLayeredWindowAttributes");if (fun)fun(this->GetSafeHwnd(), 0, 230, 2);FreeLibrary(hInst);}HBITMAP startpic;CStaticstartPics;startpic=(HBITMAP) ::LoadImage(NULL,"snakeNet.bmp",IMAGE_BITMAP,110,50,LR_LOADFROMF ILE|LR_DEFAULTSIZE);startPics.Create(NULL,WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(200,457,20 0+110,457+50),this,NULL);startPics.SetBitmap(startpic);GetSafeHwnd(), 0, 230, 2);里面的参数230是改变透明度对话框的函数好像不一样2.更换背景图片首先先找一张图片将其格式转换成.Bmp格式然后在VC中ctrl+R 新建一个bitmap资源然后在资源栏中右击选择引入然后选择你的那张BMP格式图片出现这个不用理然后在View类中添加CBrush类型的m_brushBackground变量然后在View的构造函数中添加代码CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2); ///加载位图m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷其中IDB_BITMAP2是你图片的ID号然后在OnDraw(CDC* pDC)函数中添加代码CRectrect;GetClientRect(rect);///取得客户区域pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域然后调试就发现背景好看多了3.标题栏标题栏图标找一个IOC格式的图片直接把名字改成工程文件夹中rs文件夹中的ico格式图片的名字直接替换就行了标题栏名字在App。
MFC框架窗口界面设计
MFC框架窗口界面设计MFC(Microsoft Foundation Classes)是一个用于开发Microsoft Windows应用程序的C++类库。
MFC提供了一整套用于创建Windows应用程序的类和函数,其中包括窗口界面设计。
本文将探讨MFC框架窗口界面设计的一些关键方面。
首先,MFC框架中的窗口界面设计基于窗口类。
每个窗口类都有一个相应的类对象,用于管理窗口的创建、显示、隐藏以及事件处理等。
设计MFC窗口界面时,首先需要确定窗口的布局和功能。
通常,应该继承自CWnd类,CWnd类是MFC框架中窗口类的基类。
其次,MFC框架提供了丰富的控件类,可以用于设计窗口界面的各种元素,例如按钮、文本框、列表框、菜单、工具栏等等。
开发者可以根据实际需求选择并配置适当的控件类,并根据需要调整控件的位置和大小,以实现所需的窗口界面。
MFC框架还提供了对话框类CDialog,用于设计对话框窗口。
对话框是一种特殊的窗口,通常用于显示和接收用户输入的信息。
开发者可以使用对话框模板设计器来设计对话框的布局,并通过类成员变量和控件关联实现对对话框中各个控件的操作。
在MFC框架中,窗口界面设计通常采用消息映射的方式。
通过在窗口类中添加消息映射函数,可以实现对窗口消息的处理。
开发者可以根据需要添加相应的消息映射函数,处理窗口消息并执行相应的操作。
例如,当用户点击按钮时,可以响应WM_COMMAND消息,并执行与该按钮相关的操作。
此外,MFC框架还提供了一些辅助类和函数,用于简化窗口界面设计的过程。
例如,CDialogEx类是对话框类的一个扩展类,提供了一些额外的功能,如主题支持和阻止空格键输入等。
另外,MFC框架还提供了一些用于绘制窗口界面的绘图类和函数,例如CDC类和绘图函数。
总的来说,MFC框架提供了丰富而强大的工具和类库,用于设计和开发Windows应用程序的窗口界面。
通过合理选择和配置窗口类、控件类和对话框类,并使用消息映射和辅助类,开发者可以很容易地实现自定义的、具有丰富功能的窗口界面。
MFC界面美化攻略
MFC界面美化攻略资源文件:Bitmap:PS里输出24位windows的BMP图片Cursor:光标可以自绘Wave: WMV格式的声音文件ICON:这个网上可以转化1.字体:面板属性里更改2.Edit控件文字颜色:添加CtlColor(),增添if (IDC_STATIC == pWnd->GetDlgCtrlID())//判断正在绘制的是不是指定的控件{pDC->SetTextColor(RGB(0, 0, 255));//设置它的文本显示}3.背景图片:增添Paint()函数,else后修改为//CDialogEx::OnPaint(); 这句话注释掉CPaintDC dc(this);CRect rect;GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1);BITMAP 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);4.背景音乐:添加头文件#include <mmsystem.h>#pragma comment( lib, "Winmm.lib" )在InitDialog()函数里写PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);5.光标自绘:在资源里新建一个CURSOR增添SetCursor()函数,写入SetCursor(LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_CURSOR2)));返回值记住改为false6.皮肤更改:复制SkinH.dll、SkinH.lib、SkinH.h以及皮肤文件Aero.she 至工程目录下;在工程中引入 .h 头文件及Lib 静态库,记得在stdafx.h里声明,#include"SkinH.h"#pragma comment(lib,"SkinH.lib")在创建窗口之前加载皮肤文件,这里是对话框初始化的时候,第一句。
MFC界面设计范文
MFC界面设计范文MFC(Microsoft Foundation Classes)是微软的一套C++类库,用于快速开发Windows应用程序的用户界面。
MFC界面设计也涉及到对用户界面元素的布局和外观的管理。
开发人员可以使用MFC提供的布局工具来控制窗口和控件在用户界面中的位置和大小。
同时,MFC还提供了一系列的图形和文字绘制函数,开发人员可以使用这些函数来设计和定制用户界面的外观。
MFC界面设计通常采用面向对象的开发方法。
开发人员可以通过继承和重载MFC提供的类来定制和扩展用户界面的功能。
同时,MFC还提供了一系列的通用类和控件,开发人员可以直接使用这些类和控件来快速开发用户界面。
在进行MFC界面设计时,开发人员需要考虑以下几个方面:1.用户需求:开发人员需要清楚了解用户的需求和期望,设计出符合用户期望的界面。
2.界面布局:开发人员需要合理安排界面中窗口和控件的位置和大小,使界面看起来美观和易用。
3.用户交互:开发人员需要处理用户输入和操作,包括鼠标点击、键盘输入等操作,并根据用户操作来更新用户界面。
4.界面美化:开发人员可以使用MFC提供的绘图函数和控件样式设置来美化用户界面,使其看起来更加吸引人。
5.效率和性能:开发人员需要考虑用户界面的响应速度和性能,避免界面出现卡顿或响应慢的情况。
在进行MFC界面设计时,可以参考以下几点建议:1. 参考现有界面:可以参考和借鉴现有的Windows应用程序界面,学习其设计理念和布局方式。
2.用户测试:在设计过程中可以进行用户测试,收集用户的反馈意见和建议,修正和改进界面设计。
3.界面组件的选择:根据功能需求选择合适的界面组件,例如使用列表框、树形控件来展示数据。
4.风格统一:尽量保持界面的风格和样式统一,使用户界面看起来整洁和一致。
5.错误处理:在界面设计中需要考虑错误处理和异常情况,及时提供用户友好的提示和帮助信息。
总之,MFC界面设计是Windows应用程序开发中重要的一环,它关系到用户体验和使用效果。
MFC编程中修改窗口的方法
一对窗口外观的修改窗口的外观或者风格可以有类风格(CS_)和窗口风格(WS_),改变外观就是改变这两个风格。
窗口风格是由一个CREATESTRUCT结构体作为API函数CreateWindow()参数确定的。
类风格是由一个WNDCLASS结构体在注册窗口类之后确定的。
而改变可以在窗口对象创建之前和之后改变。
A 窗口创建之前改变在PreCreateWindow(CREATESTRUCT &cs)中修改,该函数是CWnd类的成员函数。
窗口风格:对于窗口风格只要修改cs的成员就可以实现。
类风格:但是对于由窗口类指定的那些诸如图标光标等类风格就不能由cs修改了,因为他们是由WNDCLASS结构在注册的时候指定的,所以只能修改更底层的窗口类,并重新注册。
方法如下:方法一在PreCreateWindow函数中,定义一个WNDCLASS变量并注册,然后把cs.lpszclss成员赋为该已注册类的窗口类名。
例如:PreCreateWindow(CREATESTRUCT &cs){...WNDCLASS wndcls;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackgroud=(HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor=LoadCursor(NULL,IDC_HELP);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=AfxGetInstanceHandle();wndcls.lpfnWndProc=::DefWindowProc;wndcls.lpszClassName="ncls" //!!指定新类的名字,在后面cs.lpszclss就用该名字!!wndcls.lpszMenuName="";wndcls.style=CS_HREDRAW | CS_VREDRAW;RegisterClass(&wndcls);cs.lpszClass="ncls";...return TRUE;}对于单文档应用程序要修改背景和光标,应该在CView类的PreCreateWindow 中去修改。
MFC框架窗口界面设计
MFC框架窗口界面设计MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++框架。
它提供了一套面向对象的API,使开发人员能够快速创建Windows GUI应用程序。
在MFC框架中,窗口界面设计是非常重要的一部分,良好的界面设计可以提升用户体验,使应用程序更加易于使用和理解。
在进行MFC窗口界面设计时,需要考虑以下几个方面:1.窗口布局:首先要考虑的是窗口的布局。
通过合理的布局可以使窗口界面看起来整洁、统一,并且便于用户操作。
可以使用容器控件(如面板、分组框)来划分窗口区域,并使用控件对界面进行进一步的细分和排列。
3.控件排列:选择合适的控件后,需要对它们进行合理的排列。
可以使用布局管理器(如网格布局、堆栈布局)来自动调整控件的位置和大小,以适应不同窗口大小的变化。
同时,应该考虑控件之间的间距和对齐方式,使界面看起来更加整齐美观。
4.界面元素:除了基本的控件外,还可以添加一些界面元素来增强用户体验。
比如图标、图片、背景色等。
这些元素可以帮助用户更好地理解应用程序的功能和状态,并增加界面的可视化效果。
5.字体和颜色:选择合适的字体和颜色可以改善界面的可读性和视觉吸引力。
应该选择易于阅读的字体,并确保文字和背景颜色的对比度足够高,使用户能够清晰地看到和理解界面上的信息。
6.响应式设计:现代应用程序通常需要适应不同分辨率和窗口大小的设备,因此,响应式设计变得越来越重要。
在MFC框架中,可以使用响应式布局和弹性控件来实现窗口界面的自适应性。
这样,无论应用程序在大屏幕、小屏幕还是移动设备上运行,都能保持良好的用户体验。
7.错误处理和反馈:在设计窗口界面时,要考虑用户输入错误或操作失误的情况,并提供相应的错误处理和反馈机制。
比如,在输入框中输入无效数据时,可以显示错误提示信息或闪烁该输入框,以引起用户的注意。
总之,MFC框架窗口界面设计需要考虑布局、控件选择和排列、界面元素、字体和颜色、响应式设计,以及错误处理和反馈等方面。
我整理的MFC界面美化
一,对话框背景为一幅位图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使用Skin++美化皮肤
MFC使⽤Skin++美化⽪肤查了好⼏天关于MFC应⽤程序换肤的资料,经过各种莫名其妙的问题的困扰,现分享⼀下⾃⼰的体会。
希望可以避免⼀些弯路。
另外会在附上⼀些资源。
环境:Windows 7 + VS2012 + SkinSharp(注:Skin++、USkin、SkinMagic ⽤法相同)1. 新建⼀个⼯程(⼯程名:Demo)(⽐如⼀个基于对话框的MFC程序)如图所⽰,注意不要勾选Use Unicode libraries ,否则可能会出现以下错误:见图2. 添加相关⽂件(.h .lib .dll 以及⽪肤⽂件)下⾯就以SkinSharp、Skin++、USkin、SkinMagic中的⼀种(SkinSharp)进⾏⽰范,其他三种的操作基本是⼤同⼩异。
如图将SkinH.h和SkinH.lib⽂件导⼊⼯程⽂件的⽬录中,如下图所⽰:请注意VC++6.0和VS2012下⼯程⽬录的不同之处,应该是Demo->Demo⽂件夹下(Demo是⼯程名),然后加⼊⼯程的Header Files下:3. 添加必要的代码3.1 在stdafx.h中添加#include "SkinH.h"#pragma comment(lib, "SkinH.lib")如图:在BOOL CDemoApp::InitInstance() 函数下写SkinH_Attach();这句语句是加载默认的⽪肤⽂件:skinh.she3.3 试着编译⼯程,产⽣Debug⽂件(或者Release⽂件)将以下⽂件放⼊Debug⽬录(⼯程根⽬录下的Debug⽂件夹)中如图:3.4 再次编译⼯程即可看到换肤的效果:(添加的是只是skinh.she⽪肤⽂件)3.5 实现更“⾃由”的换肤将SkinH_Attach(); 改为下句SkinH_AttachEx("../Debug/Skins/Green.she", NULL);运⾏效果如下:3.6 如果出现缺少SkinH.dll,就将该⽂件再放到C:\Windows\System32和C:\Windows\SysWOW64⽂件夹下,然后重新编译运⾏就可以了。
MFC修改应用程序外观
在窗口创建之前一,修改窗口大小在CMainFrame()类PreCreateWindow()cs.cx=300;cs.cy=200;二,修改在CMainFrame()类PreCreateWindow()cs.style &=~FWS_ADDTOTITLE;//cs.style=WS_OVERAPPEDWINDOWcs.lpszNeme="xxxx";在窗口创建之后在CMainFrame类OnCreate()z中SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);//标题没了SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE) & ~WS_MAXIMIZEBOX);//去掉最大化框修改程序图标在CMainFrame()类PreCreateWindow()WNDCLASS wndcls;wndcls.cbClsExtra=0;//窗口额外内存wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//背景wndcls.hCursor=LoadCursor(NULL,IDC_HELP);//光标wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//图标wndcls.hInstance=AfxGetInstanceHandle();//当前应用程序的句柄wndcls.lpfnWndProc=::DefWindowProc;wndcls.lpszClassName="";wndcls.lpszMenuName=NULL;wndcls.style=CS_HREDRA W | CS_VREDRA W;//窗口类得类型RegisterClass(&wndcls);//注册cs.lpszClass="";BOOL CStyleView::PreCreateWindow(CREA TESTRUCT& cscs.lpszClass="";//此方法比较繁琐另一种方法:cs.lpszClass=AfxRegisterWndClass(CS_HREDRA W | CS_VREDRA W,//水平重画垂直重画类型0,//光标0,//背景LoadIcon(NULL,IDI_W ARNING)//图标);//比较方便修改背景的光标BOOL CStyleView::PreCreateWindow(CREA TESTRUCT& cs)cs.lpszClass=AfxRegisterWndClass(CS_HREDRA W | CS_VREDRA W,//水平垂直重画LoadCursor(NULL,IDC_CROSS),//十字型的光标(HBRUSH)GetStockObject(BLACK_BRUSH),//背景颜色0//无标题栏);//如把参数设置位默认……在窗口创建之后修改int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)SetClassLong(m_hWnd,//窗口句柄GCL_HICON,//图标(LONG)LoadIcon(NULL,IDI_ERROR));在view类修改背景,光标给view类添加WM_CREA TE消息处理SetClassLong(m_hWnd,//句柄GCL_HBRBACKGROUND,//背景(LONG)GetStockObject(BLACK_BRUSH)//画刷);SetClassLong(m_hWnd,GCL_HCURSOR,//光标(LONG)LoadCursor(NULL,IDC_HELP));完成不断变化的图标准备好3副图标放入res文件夹中Inset-》resource-》导入图标给CMainFrame类增加HICONm_hIcones[3] privite方法成员标量int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)m_hIcons[0]=LoadIcon(AfxGetInstanceHandle(),//获取应用程序当前实例句柄MAKEINTRESOURCE(IDI_ICON1)//把ID号转换成字符串指针);m_hIcons[1]=LoadIcon(theApp.m_hInstance,//获取实例句柄的另一种方法需声明extern CStyleApp theApp;在函数之前MAKEINTRESOURCE(IDI_ICON2));m_hIcons[2]=LoadIcon(AfxGetApp()->m_hInstance,//获取实例句柄的另一种方法MAKEINTRESOURCE(IDI_ICON3));SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);//把第一副图标设置为程序图标设置定时器SetTimer(1,//定时器标识1000,//流逝时间NULL//);给CMainFrame增加WM_TIMER消息处理void CMainFrame::OnTimer(UINT nIDEvent)static int index=1;SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);index=++index%3;修改工具栏Resource-》toolbar-》IDR_MAINFRAME->双击查看ID号-》增加按钮-》在帮助菜单下增加菜单项ID:IDM_TEST->Caption:test->在test菜单项上右击-》classwizard-》增加一个函数-》编辑代码-》修改按钮的ID号:IDM_TEST->void CMainFrame::OnTest()MessageBox("test");添加分隔符在按钮上按住鼠标左键拖动会产生分隔符删除按钮拖动按钮出工具栏创建工具栏Insert-》resource-》toolbar-》绘画几个按钮-》class CMainFrame : public CFrameWndCToolBar m_newToolBar;int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)if (!m_newToolBar.CreateEx(this, TBSTYLE_FLA T, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_newToolBar.LoadToolBar(IDR_TOOLBAR1)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_newToolBar);工具栏的隐藏与显示在查看子菜单下增加一菜单项IDM_VIEW_NEWTOOL,Caption:新的工具栏,对菜单项进行命令响应右击-》classwizard-》void CMainFrame::OnViewNewtool()if(m_newToolBar.IsWindowVisible()){m_newToolBar.ShowWindow(SW_HIDE);}else{m_newToolBar.ShowWindow(SW_SHOW);}RecalcLayout();//控制栏消失DockControlBar(&m_newToolBar);//浮动的控制栏消失***显示时没有在原先位置出现另一种控制栏的显示与隐藏void CMainFrame::OnViewNewtool()ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindow Visible(),FALSE);增加复选标记在菜单项上右击-》classwizard-》Object IDs:->Messages:UODA TE_COMMAND_UI->AddFunctionvoid CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)pCmdUI->SetCheck(m_newToolBar.IsWindow Visible());状态栏的编程增加字符串资源ID:IDS_TIMER caption: 时钟,ID:IDS_PROGRESS CAPTION:进度栏static UINT indicators[] =IDS_TIMER,IDS_PROGRESS,在状态栏显示系统时间void CMainFrame::OnTimer(UINT nIDEvent)CTime t=CTime::GetCurrentTime();CString str=t.Format("%H:%M:%S");CClientDC dc(this);CSize sz=dc.GetTextExtent(str);m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);m_wndStatusBar.SetPaneText(1,str);创建进度栏在CMainFrame头文件中CProgressCtrl m_progress;int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_VERTICAL,CRect(100,100,120,200),this,123);m_progress.SetPos(50);//进度位置在状态栏显示进度栏获取状态栏指定窗格的大小在CMainFrame头文件中定义消息队列#define UM_PROGRESS WM_USER+1定义消息队列在宏的下边afx_msg void OnProgress();消息映射BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_MESSAGE(UM_PROGRESS,OnProgress)消息的实现void CMainFrame::OnProgress(){CRect rect;m_wndStatusBar.GetItemRect(2,&rect);m_progress.Create(WS_CHILD | WS_VISIBLE | PBS_SMOOTH,rect,&m_wndStatusBar,123);m_progress.SetPos(50);}int CMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)PostMessage(UM_PROGRESS);完善上述程序给CMainFrame添加WM_PAINT消息处理void CMainFrame::OnPaint()CRect rect;m_wndStatusBar.GetItemRect(2,&rect);if(!m_progress.m_hWnd)m_progress.Create(WS_CHILD | WS_VISIBLE ,//| PBS_SMOOTH,rect,&m_wndStatusBar,123);elsem_progress.MoveWindow(rect);m_progress.SetPos(50);//注释发送消息语句// SendMessage(UM_PROGRESS);// PostMessage(UM_PROGRESS);进度栏变化void CMainFrame::OnTimer(UINT nIDEvent)m_progress.StepIt();状态栏显示鼠标坐标在view类中增加WM_MOUSEMOVE消息处理修改public:CStatusBar m_wndStatusBar;在CMAINFrame头文件中在mousemove文件中包含#include "MainFrm.h"CString str;str.Format("x=%d,y=%d",point.x,point.y);((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);另一函数((CMainFrame*)GetParent())->SetMessageText(str);另一函数((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);//不需要把CStatusBar m_wndStatusBar;变成public:第四种方法GetParent()->GetDescendantWindow(AFX_IDW_STA TUS_BAR)->SetWindowText(str);增加启动画面Project-》add to project->component and control-》visual c++ component-》splash screen-》inset-》OK-》OK->COLSE->编译延长显示时间int CSplashWnd::OnCreate(LPCREA TESTRUCT lpCreateStruct)SetTimer(1, 3000, NULL);。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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() 进行实际的窗口创建
CREATESTRUCT WNDCLASS
修改窗口外观
MainFrame类中修改
1、 MainFrame::PreCreateWindows() 2、 MainFrame::OnCreate()
7.VC++2010 MFC应用程 序 界面与美化
界面美化
窗口风格 窗口图标与背景 工具栏 状态栏 鼠标、光标 其他
7.1窗口风格美化
借助ActiveSkin(外部ActiveX控件,收费) 修改窗口外观
MFC窗口:MainFrame窗口、视图窗口 窗口创建过程: CWnd::Create()/CWnd::Create()
7.2窗口图标与背景修改
7.2.1 窗口图标
(例7-4 ChangeIcon) 步骤
1、新建MFC单文档应用 2、导入5个图标 3、框架类中添加成员变量m_hIcon[5] 4、OnCreate()中加载图标并设置Timer 5、添加定时器响应函数OnTimer()
补:给WM_TIMER添加响应函数OnTimer()(P360有问题)
7.6创建启动界面
Vc6可用,vs2010不可用
安装Splash screen 组件 插入位图(修改ID)
7.7创建特效窗口启动应用程序
利用对话框显示启动画面
1、新建单文档工程 2、导入位图,默认ID 3、新建对话框,删掉2个按钮,增加Picture控件, 设置为上一步中的位图ID 4、修改对话框效果 5、 CMainFrame::OnCreate()中最开始显示对话 框,并延时后销毁
视图类中修改
1、 ChangeFrm::PreCreateWindows() 2、 ChangeFrm ::OnCreate()
修改窗口外观
MainFrame类中修改 (例7-3 ChangeFrm)
1、 MainFrame::PreCreateWindows()
直接修改CREATESTRUCT结构 WNDCLASS SetWindowLong() SetClassLong()
7.4状态栏编程与美化
7.4.1 创建状态栏
1、CMainFrame头文件中申明CStatusBar对象 2、 CMainFrame::OnCreate()中创建状态栏
7.4.2 状态栏中插入进度条
1、CMainFrame头文件中申明CProgressCtrl对 象m_Pro 2、在资源面板中加入字符串资源,ID为IDS_PRO, 并在 CMainFrame中添加状态指示器IDS_PRO 3、CMainFrame加入WM_PAINT相应函数 OnPaint(),在其中创建状态栏 4、OnTimer()中 m_Pro.StepIt();
7.5鼠标、光标编程
7.5.1 鼠标光标编程
1、手工编辑Cursor 2、定义Cursor变量 3、加载Cursor 4、控制Cursor行为:OnCursor()
7.5.2 鼠标的消息处理机制
7.5.3 示例
vc下动态改变鼠标光标
SetCursor(AfxGetApp()>LoadStandardCursor(IDC_CROSS)); 或是: HCURSOR hc; hc=LoadCursor(NULL,IDC_CROSS); SetCursor(hc);
系统标准光标
IDC_APPSTARTING 带小沙漏的标准箭头 IDC_ARROW 标准箭头 IDC_CROSS 十字光标 IDC_HAND 手型 IDC_HELP 带问号的箭头 IDC_NO 禁止符号 IDC_SIZEALL 十字箭头 IDC_SIZENESW 指向东北和西南的双向箭头 IDC_SIZENS 指向南和北的双向箭头 IDC_SIZENWSE 指向西北和东南的双向箭头 IDC_SIZEWE 指向东西的双向箭头 IDC_UPARROW 上箭头 IDC_WAIT 沙漏