VC之美化界面篇

所需积分/C币:50 2012-12-30 20:15:35 406KB PDF
收藏 收藏
举报

你想使用VC来开发漂亮的界面程序吗?这个文档将教会您如何在VC中使用MFC来开发很美观的界面程序,使你脱离控制台程序!
其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时 所用的字体。图形对象类封装了所有六个图形对象。 面的表格列出了MC的图形对象类 MFC类图形对象句柄图形对象目的 CBitmap HBITMAP内存中的位图 Brush brush画刷特性一填充某个图形时所使用的颜色和模式 CFont font字体特性一写义本时所使用的字体 CPalette palette调色板颜色 CPen hen画笔特性一画轮廓时所使用的线的粗细 CRgn hrgn区域特性一包括定义它的点 表1图形对象类和它们封装的句柄 使用CDC和图形对象类,在 Windows里绘图还算是很简单的。观察以下的画面 无标题CDc 回风 文件@)编辑①)查看)帮助0 自圖的舀 Hello. Cfan 就绪 图2使用CDC绘制出的按钮 该画面通过以下代码自行绘制的假按钮: BOOL CUilView:: PreCreate Window(CREATESTRUCT& cs) //设置背景色 //CBrush CUi lView: m Back m Back. Create SolidBrush(:: Get SysColor(COLOR 3DFACE)) cs. lpszClass= AfxRegisterWndC lass(0, 0, m Back, NULL) return CView:: PreCreate Window(cs) int CUilView:: OnCreate (LpCreatestruct lpCreateStruct f(CView:: On Create(lpCreateStruct)--1 return -1 /创建字体 CFont cuilvicw:: m Font m Font. CreatePoint Font(120,"Impact") return o void CUilView:: OnDraw(CDC k pDC) //绘制按钮框架 oDC->DrawFrame Control(CRect(100, 100, 220, 160), DFC BUTTON, DFCS BUTTONPUSH) //输出文字 pDC->SetBKMode(TRANSPARENT) pDC->Text Out(120, 120,Hello, CFan! 呵呵,不好意思,这并不是真的 Windows按钮,它只是一个假的空框子,当用户在按钮 上点击鼠标时,放心,什么事情都不会发生。 22 Windows的幕后绘图操作 在 Window中,如果所有的界面操作都由用户代码来实现,那将是·个很浩大的⊥程 笔者曾经在D0S设计过窗口图形界面,代码上千行,但实现的芥面还是很古板、难看,除了 我那个对编程一窍不通的女友,没有一个人欣赏它L;而且,更要命的是,操作系统,包括 别的应用程序并不认认你的界面元素,这才是真正悲哀的。认识这些界面的只有你的程序, 图2中的按钮永远只是一个无用的框子。 有了 Windows,切都好办了, Windows将诸如按钮、菜单、L具栏等等这些通用界面 的绘制及动作都交给∫系统,程序员就不用花心思再画那些按钮了,可以将史多的精力放在 程序的功能实现方面。 所有的标准界面元索都被 Windows封装好了。 Windows知道怎么画你的菜单以及你的标注着 Hello,cfan!”的按钮。当CFan某个快乐的小编(譬如:小飞)点击这个按钮的时候, Windows也明白按钮按下去的时候该有的模样,甚至,当这个友好的按钮获取焦点时, Windows也会个失时机地为它准备一个虚框…… 有利必有弊。你的不满这时候产生了:你既想使用 Windows的 True button,可也嫌它 的界面不够好看,譬如,你喜欢用监色的粗体表达你对Cian的无限情怀(正如图2那样) 人心不足,有办法吗?有的 3美化界面之实现篇 Windows还是给程序员留下了很多后门,通过一些途径还是可以美化界面的。本章节我 们系统学习下 Windows界面美化的实现。 31美化界面的途径 如何以合法的于段来达到美化界面的效果?一般美化界面的方法包括 1.使用MFC类的既有函薮,设定界面属性 2.利用 Windows的消息机制,截获有用的 Windows的消息。通过MFC的消息映射 Message Mapping)和反射 Message reflecting)机制,在 Windows准备或者正在绘该元素时, 偷偷修改它的状态和行为,彎如:让按钮的边框为红色; 3.利用MFC类的虚函数机制,重载有用的虚函数。在MC框架调用该函数的时候,重新定 义它的状态和行为 般来说,应用程序可以通过以下两种途径来灾现以上的方法 在父窗口里,截获自身的或者由子元素(包括控件和菜单等元素)传递的关于界面绘制的 消息; 2.子类化子元素,或者为子元素准备一个新的类(一般来说该类必须继承于MFC封装的某 个标准类,如: CBut ton)。在该了元素里,截获自身的或者从父窗∏反射过来的关于界 血绘制的消息。譬如:用户可以创建一个 CXPButton类来实现只有XP风格的按钮, CXPButton继承于 CButton。 对于应用程序,使用 CXPButton类的途径相对」对话框窗口和普通窗口分成两种 ①对话框窗口中,直接将原先绑定按钮的 CBut ton类替换成 CXPBut ton类,或者在绑定变 量吋直接指定 Control类型为 CXPButton,如图3所示 Add Member Variable Member variable name. OK m ok Cancel Category: Control Variable type CXPButton CButton CXPButton Description: map to CXPButton member (user-defined class) 图3为按钮指定 CXPButton类型 ②2在普通窗口中,直接创建一个 CXPBut ton类对象,然后在 On Create(中调用 CXPBut ton 的 Create方法; 以下的章节将综合地使用以上的方法,请读者朋友留心观察 32使用MFC类的既有函数 在界面美化的专题中,MFC也并非一无是处。MFC类对于界面美化也做了部分的努力, 以下是一些可以使用的,参数说明略去 CWinApp: SetDialogBk Color void Set Dialoghkcolor( colorref c lBk=RGB (192, 192, 192), COlORREF cIrltIText= RGB (0, 0 0)) 指定对话框的背景色和文本颜色。 CListctrl:: SetBkcolor CReBarCtrl:: SetBkColor Cstatusbarltrl.. setbkcolor trl:: SetBkcolor COLORREF SetBkColor( COloRREF clr 设定背景色。 CListCtrl:: SetTextcolor CReBarctrl:: SetTextcolor CTreeCtrl:: SetTextColor COLORREF SetTextColor( ColORREF clr 设定文本颜色。 CListCtrl:: SetBkimage BOOL SetBk Image( LVBKIMAGE* plvbk Image BOOL SetBk Image( HBItMAP hbm, BOOL fIle= TRUe, int xOffsetPercent=0, int yOffsetPercent BOOL SetBk Image( LPTSTR pszUrl, BOOL fIle= TRUE, int xOffsetPercent =0, int yOffsetPercent 0) 设定列表控件的背景图片 CComboBoxEx: SetExtendedStyle CListCtrl: SetExtendedSty le CTabCtrl: SetExtendedStyle CToolBarCtrl: SetExtendedS ty le DWORD SctExtendcdStylc( DWORD dwExMask, DWORD dwExStylcs 设置控件的扩展属性,例如:设置列衣控件属性带有衣格线。 图4是个简单应用MFC类的既有函数来改善 Windows界面的例子: MFC 昵称 56s4165 白乔 「682364 Satan c Radiol M Check 指定背景色的窗口 匚确定 图4使用MFC类的既有函数美化界面 相关实现代码如下: BOOL CUi2App: InitInstance o //设置对话框背景色和字体颜色 SetDialogBk Color(RGD(128, 192, 255), RGB(0, 0, 255)) BOOL CUi2D1g:: OnInit Dialogo //设置列表控件属性带有表格线 DWORD NewStyle =m List. GetExtendedStyle( NewStyle= LVS EX GRIDLINES m List. SetExtendedStyleewStyle) //设置列表控件字体颜色为红色 m List. SetTextColor(RGB(255, 0, 0)) /填允数据 m List. Insert Column(, QQ", LVCFMT LEFT, 100) m list. InsertColumn(1,"昵称”", LVCFMT LEFT,100) m List. InsertItem(0,5851165) list. Setltemtext(,1,"自乔) m List. InsertItem(1,6823864) m List. SetItemText(l, 1,Satan) 嗯,这样的界面还算不错吧? 3.3使用 Windows的消息机制 使用MFC类的既有函数来美化界面,其功能是有限的。既然 Windows是通过消息机制进 行通讯的,那么我们就可以通过截获一些有用的消息来美化我们的界面,以下是一些有用的 Windows消息: WM ERASEBKGND WM CTLCOLOR: MM DRAWITEM WM MEASUREITEMK NM CUSTOMDRAW* 注意,标注*的消息是子元素发送给父窗口的通知消息,其它的为窗口或者子元素自身的消 3.31 WM PAINT MPAN消息相信大家都很熟悉,个窗∏要重绘了,就会有个 WM PAINT消息发送给窗 可以响应窗口的WMPAⅠNT,以更改它们的模样。 WM PAINT的映射函数原型如下 afx msg void OnPaint) 控件也是窗口,所以控件也有 WM PAINT消息,通过消息映射我们完全可以定义控什的界面 如图5所示 NM PAINT -态的文本 正常的文本 图5利用 WM PAIN消息美化界面 实现代码也很简单 void CLazy Static:: OnPaint( CPaintdc dc(this);// device context for painting //什么都不输出,仅仅画一个矩形框 GetClicnt Rcct(&rc dc Rectangle(rc) 哈哈,简单吧?不过 WM PAINT确实绝了点,它要求应用程序完成元素界面的所有绘制 过程,想象·下如何画岀个完整的列友控件?太烦了吧。般来说,很少有人喜欢使用 MM PAINT,还有其它更细致的消息。 3.3.2 WM ERASEBKGND Windows在向窗口发送 WM PAINT消息之前,总会发送一个 WM ERASEBKGND消息通知该 窗凵擦除背景,默认情况下, Windows将以窗凵的背景色清除该窗口。 可以响应窗口(包括子元素)的 WM ERASEBKGND,以史改它们的背景。 WM ERASEBKGND的映射 函数原型如下 afx msg BOOL OnEraseBkgnd( CDC** pDC 返回值: 指定背景是否已清除,如果为FALS,系统将自动清除 参数: pDC指定了绘制操作所使用的设备环境。 图6是个简单的例了,通过 nErasebkgnd为对话框加载了副位图背景: WM ERASEBKGND 带有背景色的对话框:) 厂 Cheek C Radiol 确定 图6利用 WM ERASEBKGND消息美化界面 实现代码也很简单: BOOL CLi4D1g:: OnInitDialog( //加载位图 //CBi tmap m Back m Back. LoadBitmap(IDb back BOOL CLi4D1g:: On EraseBkgnd(CDC* pDC) cdC dc dc. CreateCompatibleDC (pDC) dc SelectObject( &m Back) //获取 BITMAP对象 BITMAP hb m Back. GetBitmap( &hb) //获取窗口大小 GetClient Rect(&rt) /显示位图 pIC:>StretchBlt(0, 0, rt Width, rt. He O tdc, 0,0, hb. bnmWidth, hb. bmHeight, SRCCOPY) return true HBRUSH CUi4D1g: OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor /设置透明背景模式 pDC->SetBkMode TRansParent //设置背景刷子为空 return(HBRUSH): GetStock Object(HOLLOW BRUSH 同时别心了响应 OnCtlcolor,否则窗口里面的控件就不透明了。0 nCtlcolor的内容 3.33 WM CTLCOLOR 在控件显示之前,每一个控件都会向父对话框发送一个 WM CTLCOLOR消息要求获取绘制 所需要的颜色。 WM CTLCOLOR消息缺省处理函数CWnd:: OnCtlcolor返回一个 HBRLSH类型的

...展开详情
试读 21P VC之美化界面篇
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
康武文 正是我所想需要的,学习中
2013-01-01
回复
上传资源赚积分or赚钱
最新推荐
VC之美化界面篇 50积分/C币 立即下载
1/21
VC之美化界面篇第1页
VC之美化界面篇第2页
VC之美化界面篇第3页
VC之美化界面篇第4页
VC之美化界面篇第5页

试读结束, 可继续读2页

50积分/C币 立即下载 >