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

摘要:
MFC的CDC类封装了WindowsAPI中大部分的画图函数。下面的表格列出了MFC的图形对象类:MFC类图形对象句柄图形对象目的CBitmapHBITMAP内存中的位图CBrushHBRUSH画刷特性—填充某个图形时所使用的颜色和模式CFontHFONT字体特性—写文本时所使用的字体CPaletteHPALETTE调色板颜色CPenHPEN画笔特性—画轮廓时所使用的线的粗细CRgnHRGN区域特性—包括定义它的点2.界面美化的实现2.1界面美化的方法:2.1.1使用MFC的既有函数,设定界面属性2.1.2利用Windows的消息机制,截获有用的Windows的消息。


1.
工具:

1.1设备环境类:

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

MFC的CDC类封装了Windows API 中大部分的画图函数。CDC的常见操作函数包括:

Drawing-Attribute Functions:绘图属性操作,如:设置透明模式

Mapping Functions:映射操作

Coordinate Functions:坐标操作

Clipping Functions:剪切操作

Line-Output Functions:画线操作

Simple Drawing Functions:简单绘图操作,如:绘制矩形框

5

Ellipse and Polygon Functions:椭圆/多边形操作

Text Functions:文字输出操作

Printer Escape Functions:打印操作

Scrolling Functions:滚动操作

*Bitmap Functions:位图操作

*Region Functions:区域操作

*Font Functions:字体操作

*Color and Color Palette Functions:颜色/调色板操作

1.2图形对象类

设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外, Windows还有其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时所用的字体。图形对象类封装了所有六个图形对象。

下面的表格列出了MFC的图形对象类:

MFC类图形对象句柄图形对象目的

CBitmap HBITMAP 内存中的位图

CBrush HBRUSH 画刷特性—填充某个图形时所使用的颜色和模式

CFont HFONT 字体特性—写文本时所使用的字体

CPalette HPALETTE 调色板颜色

CPen HPEN 画笔特性—画轮廓时所使用的线的粗细

CRgn HRGN 区域特性—包括定义它的点

2. 界面美化的实现

2.1 界面美化的方法:

2.1.1 使用MFC的既有函数,设定界面属性

2.1.2 利用Windows的消息机制,截获有用的Windows的消息。通过MFC的消息映射(Message Mapping)和反射(Message Reflecting)机制,在Windows准备或者正在绘制该元素时,偷偷修改它的状态和行为,譬如:让按钮的边框为红色。

2.2.3利用MFC类的虚函数机制,重载有用的虚函数。在MFC框架调用该函数的时候,重新定义它的状态和行为

在应用程序中,一般通过以下两种方案实现以上方法:

  1. 在父窗口里,截获自身的或者由子元素(包括控件和菜单等元素)传递的关于界面绘制的消息;
  2. 子类化子元素,或者为子元素准备一个新的类(一般来说该类必须继承于MFC封装的某个标准类,如:CButton)。在该子元素里,截获自身 的或者从父窗口反射过来的关于界面绘制的消息。譬如:用户可以创建一个CXPButton类来实现具有XP风格的按钮,CXPButton继承于 CButton。

对于应用程序,使用CXPButton类的途径相对于对话框窗口和普通窗口分成两种:

①对话框窗口中,直接将原先绑定按钮的CButton类替换成CXPButton类,或者在绑定变量时直接指定Control类型为CXPButton。

②在普通窗口中,直接创建一个CXPButton类对象,然后在OnCreate()中调用CXPButton的Create方法

2.2 使用MFC的基本既有函数

(1) 指定对话框的文本色和背景色

CListCtrl::SetBkColor

CRebarCtrl::SetBkColor

CStatusBarCtrl::SetBkColor

CTreeCtrl::SetBkColor

CListCtrl::SetTextColor

CRebarCtrl::SetTextColor

CStatusBarCtrl::SetTextColor

CTreeCtrl::SetTextColor

(2) 设定控件背景图片

CListCtrl::SetBkImage

2.3 使用Windows消息机制

Windows是通过消息机制进行通讯的,那么我们就可以通过截获一些有用的消息来美化我们的界面,以下是一些常用的Windows消息:(标注*的消息是子元素发送给父窗口的通知消息,其它的为窗口或者子元素自身的消息。

WM_PAINT

WM_ERASEBKGND

WM_CTLCOLOR*

WM_DRAWITEM*

WM_MEASUREITEM*

NM_CUSTOMDRAW*

2.4 WM_PAINT

WM_PAINT 就是窗口要重绘了,会发个WM_PAINT消息给窗口,响应窗口的WM_PAINT

2.5 WM_ERASEBKGND

Windows在向窗口发送WM_PAINT消息之前,总会发送一个WM_ERASEBKGND消息通知该窗口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。

可以响应窗口(包括子元素)的WM_ERASEBKGND,以更改它们的背景。WM_ERASEBKGND的映射函数原型如下:

afx_msg BOOL OnEraseBkgnd( CDC* pDC );

返回值:

指定背景是否已清除,如果为FALSE,系统将自动清除

参数:

pDC指定了绘制操作所使用的设备环境。

2.6 WM_CTLCOLOR

在控件显示之前,每一个控件都会向父对话框发送一个WM_CTLCOLOR消息要求获取绘制所需要的颜色。WM_CTLCOLOR消息缺省处理函数 CWnd::OnCtlColor返回一个HBRUSH类型的句柄,这样,就可以设置前景和背景文本颜色,并为控件或者对话框的非文本区域选定一个刷子。

WM_CTLCOLOR的映射函数原型如下:

afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );

返回值:

用以指定背景的刷子

参数:

pDC指定了绘制操作所使用的设备环境。

pWnd 控件指针

nCtlColor 指定控件类型,其取值如下所示:

类型值含义

CTLCOLOR_BTN按钮控件

CTLCOLOR_DLG对话框

CTLCOLOR_EDIT 编辑控件

CTLCOLOR_LISTBOX 列表框

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR滚动条

CTLCOLOR_STATIC静态控件

2.7 WM_DRAWITEM

OnCtlColor只能修改元素的颜色,但不能修改元素的界面框架,WM_DRAWITEM则可以。

当一个具有Owner draw风格的元素(包括按钮、组合框、列表框和菜单等)需要显示外观时,该元素会发送一条WM_DRAWITEM消息至它的隶属窗口(Owner)。一般自绘或重写按钮控件都必须实现该函数。

WM_DRAWITEM的映射函数原型如下:

afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );

2.8 WM_MEASUREITEM

有时候仅仅WM_DRAWITEM还是不够的,对于一些特殊的控件,如ListBox,系统在发送WM_DRAWITEM消息前,还发送WM_MEASUREITEM消息,需要你设置ListBox中每个项目的高度或宽度等。

WM_DRAWITEM的映射函数原型如下:

afx_msg void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct );

当然,使用这个的前提必须把 控件设置为 Owner draw 属性。

3. 使用MFC的虚函数机制

对界面按钮重绘主要就是在DrawItem中根据按钮当前的状态绘制按钮的外观。可以说自绘控件的大部分功能都是在这个函数中实现的。DrawItem函数包含了一个LPDRAWITEMSTRUCT的指针。

免责声明:文章转载自《MFC/VC++ UI界面美化技术》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ES笔记三:集群管理高起播低延时RTSP网页无插件流媒体播放器EasyPlayerRTSP插件使用说明下篇

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

相关文章

MFC避免窗口闪烁的方法(OnEraseBkgnd) .

在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图...

MFC上下浮动与渐入渐出消息提示框实现

类似QQ与360软件,消息提示有两种。上下浮动、渐入渐出。 1、上下浮动提示框实现 机制,定时器响应上下浮动消息。 主要API:MoveWindow。 源码如下UpDownTipDlg.h、UpDownTipDlg.cpp。 UpDownTipDlg.h [cpp] view plaincopy /*  *@brief 上下浮动提示框  *@...

MFC控件(2):Text_Edit_Control

Static Text用法简介 static text是一段不可编辑的文字,主要用来起提示作用.在C#中类似的控件叫Label. 如果只是没啥特殊要求,并且内容固定.就简单的在属性窗口中中Caption中输入内容即可.另外在代码中常用到的一些操作如下(假设static text ID为IDC_STATIC_NOTE) 直接通过函数操作 GetDlgItem...

VS2010下MFC的串口编程

串口通信简介   一般来说,计算机都有一个或多个串行端口,这些串口提供了外部设备与PC进行数据传输和通信的通道,在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API...

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

AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名、窗口是叠加型的、可改变窗口大小等。要修改窗口的缺省风格,需要重载CWnd::PreCreateWindow(CREATESTRUCT& cs)函数,并在其中修改CREATESTRUCT型参数cs。CWnd::PreCreateWindow 函数先于窗口...

转载:MFC之MessageBox、AfxMessageBox用法

在软件中我们经常会弹出个小窗口,给一点点提示.这就会用到消息对话框. 在Win32 API程序中只有MessageBox这一种用法. 而在MFC中就有三各方法: 1.调用API中的MessageBox; 2.调用CWnd的成员函数MessageBox; 3.调用全局函数AfxMessageBox; MFC中MessageBox的用法 一...