VC之美化界面篇

合集下载

VC编程实现IE风格的界面之叙述

VC编程实现IE风格的界面之叙述

VC编程实现IE风格的界面之叙述【简介】使用过IE浏览器的朋友都知道IE界面上的扁平工具条、地址栏,扁平工具栏上的按钮正常状态下为扁平态,按钮上的图像为灰色,当鼠标放在按钮上时,按钮突起(这种状态称为手柄),并且其上的图像变得鲜艳醒目,一些按钮上还有汉字说明或标有小黑三角的下拉按钮,单击时显示下拉菜单,这些技术是怎么实现的呢,本文针对这些问题介绍了如何利用VC编程来实现它们。

【正文】IE风格的实现主要在主框架类的CMainFrame::OnCreate()实现,它的主要思想如下:首先定义一个CReBar 对象,用以作工具条、地址栏的容器,然后分别声明图像列表对象img用于存储工具栏上按钮的热点图像和正常状态下显示的图像。

为了显示扁平工具栏,需要用CreateEx()函数创建CToolBar对象m_wndToolBar,用ModifyStyle()函数将工具栏的风格设为扁平类型,你不能用CToolBar::Create()或CToolBar:: SetBarStyle()设置这种新风格。

CToolBar类不支持TBSTYLE_FLAT。

要解决这个问题,必须绕过CToolBar 类,使用CWnd::ModifyStyle()。

工具栏对象调用SetButtonInfo()设置按钮的风格为TBSTYLE_DROPDOWN,就可以将工具栏按钮设置为附带有下拉按钮。

至于按钮带有中文提示,用工具栏的SetButtonText()就可以轻松实现了。

下面是实现IE风格界面的部分代码和注释:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){CReBar m_wndReBar;//声明CReBar对象CImageList img;//声明图像列表对象CString str;if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;if(!m_wndReBar.Create(this))//创建CReBar对象{TRACE0("Failed to create rebar\n");return-1;//fail to create}if(!m_wndToolBar.CreateEx(this))//创建工具条对象{TRACE0("Failed to create toolbar\n");return-1;//fail to create}//set up toolbar propertiesm_wndToolBar.GetToolBarCtrl().SetButtonWidth(50,150);file://设置工具条上按钮的最大、最小尺寸m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);file://工具条可以带有下拉按钮img.Create(IDB_HOTTOOLBAR,22,0,RGB(255,0,255));file://向图像列表装载热点图像资源,IDB_HOTTOOLBAR为热点图像资源IDm_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);//工具条装载热点图像img.Detach();img.Create(IDB_COLDTOOLBAR,22,0,RGB(255,0,255));file://图象列表装载正常状态的图像资源,IDB_COLDTOOLBAR为图像资源IDm_wndToolBar.GetToolBarCtrl().SetImageList(&img);//将图像装入工具条img.Detach();m_wndToolBar.ModifyStyle(0,TBSTYLE_FLAT TBSTYLE_TRANSPARENT);file://工具条为扁平风格m_wndToolBar.SetButtons(NULL,9);//工具条上有9个按钮//set up each toolbar buttonfile://以下分别对九个按钮分别设置风格和按钮汉语提示m_wndToolBar.SetButtonInfo(0,ID_BUTTON0,TBSTYLE_BUTTON,0);str.LoadString(IDS_BUTTON0);m_wndToolBar.SetButtonText(0,str);m_wndToolBar.SetButtonInfo(1,ID_BUTTON1,TBSTYLE_BUTTON,1);str.LoadString(IDS_BUTTON1);m_wndToolBar.SetButtonText(1,str);m_wndToolBar.SetButtonInfo(2,ID_BUTTON2,TBSTYLE_BUTTON,2);str.LoadString(IDS_BUTTON2);m_wndToolBar.SetButtonText(2,str);m_wndToolBar.SetButtonInfo(3,ID_BUTTON3,TBSTYLE_BUTTON,3);str.LoadString(IDS_BUTTON3);m_wndToolBar.SetButtonText(3,str);m_wndToolBar.SetButtonInfo(4,ID_BUTTON4,TBSTYLE_BUTTON,4);str.LoadString(IDS_BUTTON4);m_wndToolBar.SetButtonText(4,str);m_wndToolBar.SetButtonInfo(5,ID_BUTTON5,TBSTYLE_BUTTON,5);str.LoadString(IDS_BUTTON5);m_wndToolBar.SetButtonText(5,str);m_wndToolBar.SetButtonInfo(6,ID_BUTTON6,TBSTYLE_BUTTON TBSTYLE_DROPDOWN,6); str.LoadString(IDS_BUTTON6);m_wndToolBar.SetButtonText(6,str);m_wndToolBar.SetButtonInfo(7,ID_BUTTON7,TBSTYLE_BUTTON,7);str.LoadString(IDS_BUTTON7);m_wndToolBar.SetButtonText(7,str);m_wndToolBar.SetButtonInfo(8,ID_BUTTON8,TBSTYLE_BUTTON TBSTYLE_DROPDOWN,8); str.LoadString(IDS_BUTTON8);m_wndToolBar.SetButtonText(8,str);file://重新调整按钮的尺寸CRect rectToolBar;m_wndToolBar.GetItemRect(0,&rectToolBar);//得到工具条第一个按钮的尺寸m_wndToolBar.SetSizes(rectToolBar.Size(),CSize(30,20));file://第一个参数为按钮尺寸,第二个参数为图像尺寸file://创建一个组合框作为地址栏if(!m_wndAddress.Create(CBS_DROPDOWN WS_CHILD,CRect(0,0,200,120),this, AFX_IDW_TOOLBAR+1)){TRACE0("Failed to create combobox\n");return-1;//fail to create}file://加入工具栏、地址栏m_wndReBar.AddBar(&m_wndToolBar);str.LoadString(IDS_ADDRESS);m_wndReBar.AddBar(&m_wndAddress,str,NULL,RBBS_FIXEDBMP RBBS_BREAK);file://定义REBARBANDINFO对象,对工具条和地址栏设置理想尺寸REBARBANDINFO rbbi;rbbi.cbSize=sizeof(rbbi);rbbi.fMask=RBBIM_CHILDSIZE RBBIM_IDEALSIZE RBBIM_SIZE;rbbi.cxMinChild=rectToolBar.Width();rbbi.cyMinChild=rectToolBar.Height();rbbi.cx=rbbi.cxIdeal=rectToolBar.Width()*9;m_wndReBar.GetReBarCtrl().SetBandInfo(0,&rbbi);//设置工具栏尺寸rbbi.cxMinChild=0;CRect rectAddress;rbbi.fMask=RBBIM_CHILDSIZE RBBIM_IDEALSIZE;m_wndAddress.GetEditCtrl()->GetWindowRect(&rectAddress);rbbi.cyMinChild=rectAddress.Height()+10;rbbi.cxIdeal=200;m_wndReBar.GetReBarCtrl().SetBandInfo(2,&rbbi);//设置地址栏尺寸m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle()CBRS_TOOLTIPS CBRS_FLYBY CBRS_SIZE_FIXED);if(!m_wndStatusBar.Create(this)!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");return-1;//fail to create}return0;}以上代码在Windows2000和Visual C++环境下编译通过,程序运行正常,有兴趣的朋友可以动手亲自实验一下。

VC++的UI设计实例

VC++的UI设计实例

用VC++实现FLASH的UI启动画面摘要介绍ActiveX控件在VC++应用程序的使用方法并通过使用Shockwave Flash Object控件实现了FLASH的UI启动画面,开发了一套友好美观的应用程序界面。

关键词VC++,Shockwave Flash Object控件,Flash一、应用概述VC是Microsoft的一个非常好用的C++编程工具,它的最大优势就是有一个对于程序员来说非常实用的MFC(微软基础类库,Microsoft Foundation Class),掌握和运用好MFC将会给C++编程带来非常高的开发效率,因此,大多数的C++程序员都喜欢用VC,不但开发环境友好,而且有强大的MFC支持。

然而,VC的界面设计和时间处理方法非常复杂,很多初学者对于Visual C++ UI设计感到十分的麻烦,无法在有限的时间内设计出美观、用户熟悉的操作界面。

UI即User Interface(用户界面)的简称。

UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。

好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由,充分体现软件的定位和特点。

软件界面设计就像工业产品中的工业造型设计一样,是产品的重要买点。

一个友好美观的界面会给人带来舒适的视觉享受,拉近人与电脑的距离,为商家创造卖点。

界面设计不是单纯的美术绘画,它需要定位使用者、使用环境、使用方式并且为最终用户而设计,是纯粹的科学性的艺术设计。

Macromedia公司推出了交互式矢量图和Web 动画的标准——Flash。

在业界,Flash被称为是“最为灵活的前台”,利用Flash可以做出创作出既漂亮又可改变尺寸的导航界面以及其他奇特的效果。

在我们所熟知的Flash应用于站点建设上,它的使用带来了各种优点,如全面的控制、无缝的导向跳转、更丰富的媒体内容、更体贴用户的流畅交互、跨平台和瘦客户端的支持、以及与其它Flash应用方案无缝连接集成等。

使用SkinMagic美化界面

使用SkinMagic美化界面

使用SkinMagic美化界面网络上的SkinMagic版本繁多,而且试用版,破解版并存,各版本之间支持的皮肤文件也不尽相同,因此经常有人在网上询问为何添加了SkinMagic没有效果甚至导致程序崩溃之类的问题、这里有一个可用的破解版本(包含VC6使用的库和支持的常用皮肤文件)SkinMagicToolkitV2.2.31、请注意这个包的大小为1.31M,如果小于1.31M说明下载不完全,则无法使用,建议使用迅雷下载、一:文件说明SkinMagicLib.h 必须的头文件,请添加到工程中、SkinMagic.lib + SkinMagic.dll 动态链接库配套使用编译时需要在工程中添加SkinMagic.dll,程序运行时需要SkinMagic.dll以下版本的编译出来的程序运行时不再依赖SkinMagic.dllSkinMagicLibMD6.lib 静态链接库,用于VC6的Release版编译SkinMagicLibMT6.lib 静态链接库,用于VC6的Debug版编译二:使用步骤1、把SkinMagicLib.h, SkinMagicLibMT6.lib, SkinMagicLibMD6.lib放到你的VC6工程目录下2、在StdAfx.h中添加#include "SkinMagicLib.h"3、在工程设置中添加对应的库Win32 Release中填上SkinMagicLibMD6.libWin32 Debug中填上SkinMagicLibMT6.lib4、在InitInstance()函数的开始处添加初始化SkinMagic资源的代码、VERIFY(1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));5、在InitInstance()函数中加载皮肤文件并设置程序皮肤、你可以选择添加皮肤文件到资源中,并编译到程序中、或者程序在运行时动态加载皮肤文件a. 比如添加corona.smf,设置资源类型为"SKINMAGIC", 资源ID为IDR_SKIN_CORONA CBossKeyDlg dlg;m_pMainWnd = &dlg;//加载SkinMagic皮肤VERIFY(1 == LoadSkinFromResource(NULL, (LPSTR)IDR_SKIN_CORONA, "SKINMAGIC"));VERIFY(1 == SetWindowSkin(m_pMainWnd->m_hWnd, "MainFrame"));VERIFY(1 == SetDialogSkin("Dialog"));int nResponse = dlg.DoModalEx(bStartShow);if (nResponse == IDOK){}else if (nResponse == IDCANCEL){}b. 程序在运行时动态加载皮肤文件CBossKeyDlg dlg;m_pMainWnd = &dlg;//加载SkinMagic皮肤VERIFY(1 == LoadSkinFile("corona.smf"));VERIFY(1 == SetWindowSkin(m_pMainWnd->m_hWnd, "MainFrame")); VERIFY(1 == SetDialogSkin("Dialog"));int nResponse = dlg.DoModalEx(bStartShow);if (nResponse == IDOK){}else if (nResponse == IDCANCEL){}6、在ExitInstance()函数中释放SkinMagic资源//释放SkinMagic资源:ExitSkinMagicLib();。

使用VC创建漂亮的图形用户界面应用程序

使用VC创建漂亮的图形用户界面应用程序

使用VC创建漂亮的图形用户界面应用程序作者:刘汇丹huidan@2005年8月30日前言:本文根据作者本人因工作需要而从网上收集的资料实践之后整理而成。

1基本功能这一部分包括漂亮的图形用户界面的实现方法。

1.1建立工程首先在VC里面建立基于对话框的可执行应用程序工程,命名为demo。

1.2准备工作在主窗体对话框属性里取消Title bar属性,去掉对话框标题栏。

在对话框窗体里面添加如图1所示的各个控件实例。

靠右侧的那个Edit控件设置为只读。

为两个Edit、Slider和进度条设置相应的映射变量,并在CDemoDlg::OnInitDialog()函数中设置初始值。

如图2所示。

1.3设置背景图片使用绘图软件制作出喜欢的图片,保存为位图文件back.bmp,如图3所示。

注意制作的图片要和对话框窗体大小一致,本例中图片的大小为(380px,260px),背景色为RGB(127,169,255)。

将此位图文件拷贝到res文件夹下,并导入到工程里面,设置ID为IDB BACKBMP,为CDemoDlg类添加保护成员变量CBitmap m back,并在CDemoDlg::OnInitDialog()函数里面添加如下代码:图1:应用程序控件布局图图2:映射变量图1m_back.LoadBitmap(IDB_BACKBMP);2//设置窗口区域3CRgn rgn;图3:背景图片代码说明:本例中创建的图片是圆角矩形,所以首先调用CRgn类的Cre-ateRoundRectRgn()函数创建了圆角矩形区域,然后设置窗口区域为此区域。

用户可以根据自己的喜好和需要创建椭圆形、矩形、圆角矩形等形状的区域,详细情况请查看相应函数。

本例中圆角矩形区域的尺寸略大于背景图片的尺寸,这是根据实际情况做出的调整!在CDemoDlg::OnPaint()函数里面,以如下代码替换原来自动生成的代码:1//绘制背景图片2CPaintDC dc(this);//device context for painting3//TODO:Add your message handler code here4CDC picDC;5picDC.CreateCompatibleDC(&dc);67CBitmap*pOldBmp;8pOldBmp=picDC.SelectObject(&m_back);910BITMAP bm;11m_back.GetBitmap(&bm);1213dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&picDC,0,0,SRCCOPY);14dc.SelectObject(pOldBmp);1516SetWindowRgn(rgn,TRUE);经过以上步骤以后,编译运行应用程序,效果如图4所示。

VCLSkin组件使用、Delphi界面美化图文教程

VCLSkin组件使用、Delphi界面美化图文教程

VCLSkin是个方便而且功能强大的界面加强型组件包。

只要在程序的任何一个窗体里加入SkinData组件,设置好相关属性,则所有这个程序里出现的窗体(包括对话框)都具有设置好的界面风格。

SkinStore组件又可以把一些皮肤文件预先存在里面,供SkinData 随时调用,表现出程序的多种风格。

下面简单地介绍它的用法。

基本安装:1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可;3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可;4、如果以上Install按钮为失效的话,试试Compile按钮;5、是run time lib则在option下的packages下的runtimepackes加之。

如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi的Lib目录中,有两种方法可以解决:1、反安装的源文件拷入到Delphi的Lib目录下;2、或者Tools-->Environment Options中把控件源代码路径加入到Delphi的Lib目录中即可。

注意:所安装的控件是否与你所用的Delphi版本相适应。

RxLib的安装:首先在Delphi 5 的IDE 中将以前版本的Rxlib 反安装掉,删除RXCTL5.BPL、RXDB5.BPL、RXBDE5.BPL、DCLRX5.BPL、DCLRXDB5.BPL 和DCLRXBD5.BPL。

打开Rx 的运行包RXCTL5.DPK,在Package 窗口中按Compile 按钮编译RXCTL5.DPK ,然后用同样方法编译另两个运行包RXDB5.DPK 和RXBDE5.DPK ,将编译后的三个BPL 文件放到搜索路径中,如WINDOWS\SYSTEM等。

让你的软件界面更漂亮[VC][二]

让你的软件界面更漂亮[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++ 可实现你想要的统一风格界面。

vc 软件框架窗口界面设计

vc  软件框架窗口界面设计

vc++软件框架窗口界面设计.txt同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀!本文由zhoujc860206贡献ppt文档可能在WAP端浏览体验不佳。

建议您优先选择TXT,或下载源文件到本机查看。

第6章框架窗口界面设计章框架窗口界面设计6.1框架窗口 6.1框架窗口 6.2菜单 6.2菜单 6.3工具栏 6.3工具栏 6.4状态栏 6.4状态栏 6.5交互对象的动态更新 6.5交互对象的动态更新 6.6图标和光标 6.6图标和光标 6.1框架窗口 6.1框架窗口6.1.1单文档和多文档程序框架窗口单文档和多文档程序框架窗口文档应用程序的MFC类结构类结构文档应用程序的如图是单文档应用程序Ex_SDI和多文档应用程序Ex_MDI的MFC类结构。

CAboutDlg是每一个应用程序框架都有的,用来显示本程序的有关信息。

CEx_SDIApp 和CEx_MDIApp是应用程序类,是从CWinApp类派生而来,负责应用程序创建、运行和终止,每一个应用程序都需要这样的类。

CEx_SDIDoc和CEx_MDIDoc是文档类,它们是从CDocument 类派生而来,负责应用程序文档数据管理。

CEx_SDIView和CEx_MDIView是视图类,它们既可以从基类CView派生,也可以从CView派生类派生,负责数据的显示、绘制和其他用户交互。

CMainFrame类是用来负责主框架窗口的显示和管理,包括工具栏和状态栏等界面元素的初始化。

对于单文档应用程序来说,主框架窗口类是从CFrameWnd派生而来的,而对于多文档应用程序程序,主框架窗口是从CMDIFrameWnd派生的。

6.1框架窗口 6.1框架窗口CChildFrame类是从CMDIChildWnd派生而来,专门用来管理多文档应用程序中的文档窗口。

无论是 CMDIChildWnd 还是 CMDIFrameWnd 类,它们都是从 CFrameWnd 派生而来的。

VC改变窗口大小和样式

VC改变窗口大小和样式

改变窗口的外观和大小改变窗口的外观和大小需要在窗口创建以前改变。

所以我们可以在CMainFrame的PreCreateWindow中改变CREATESTRUCT 结构体的值就行了。

E.G.BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)改变窗口的大小-> cs.cx = 300; cs.cy = 200;改变窗口的显示位置坐标是 cs.x 和 cs.y这里常用的一个函数是::GetSysMetrics(SM_CXSCREEN);::GetSysMetrics(SM_CYSCREEN);用来取得屏幕的大小。

要改变窗口标题栏的字符串:cs.lpszName = "Seven"; 会发现标题栏不会改变窗口的标题栏的上的字符串。

改变单文档应用程序的标题栏的字符串参考MSDN windowstyles/Frame-window styles 下面有一个Changing the styles of a window create by MFC./ The SDI Case默认的情况是WS_OVERLAPPEDWINDOW and FWS_ADDTOTITLE styles FWS_ADDTOTITLE is add the document title to the window’s caption.去掉FWS_ADDTOTITLE 就可以更改窗口标题栏字符串。

cs.style &= ~FWS_ADDTOTITLE;cs.lpszName = "Seven";如果我们需要改变背景,画刷,光标等等时候。

我们可以在:PreCreateWindow中创建窗口类,WNDCLASS wndClass;把这个类里的值改变成自己想要的内容就可以了。

E.G.wndClass.cbClsExtra = 0;wndClass.cbWndExtra = 0;wndClass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH);wndClass.hCursor = LoadCursor(NULL, IDC_WAIT);wndClass.hIcon = LoadIcon(NULL, IDI_WARNING);wndClass.hInstance = AfxGetInstanceHandle();获取应用程序的实例句柄可用AfxGetInstanceHandle函数,这个函数是一个全局的函数,前面有一个AFX表示是一个应用程序框架类函数,哪里都可用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC之美化界面篇作者:白乔链接:/1046595482643.html本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。

读者最好具有以下VC基础:1.大致了解MFC框架的基本运作原理;2.熟悉Windows消息机制,熟悉MFC的消息映射和反射机制;3.熟悉OOP理论和技术;本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。

1 美化界面之开题篇相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面:图1 瑞星杀毒软件的精美界面程序的功能如何如何强大是一回事,它的用户界面则是另一回事。

千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。

“受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。

2 美化界面之基础篇美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免……2.1Windows下的绘图操作熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现一个点,红的、或者黄的,随你的便。

你也可以花点时间画个按钮,画个你自己的菜单,等等……Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。

要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC封装的设备环境类和图形对象类。

2.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:简单绘图操作,如:绘制矩形框Ellipse and Polygon Functions:椭圆/多边形操作Text Functions:文字输出操作Printer Escape Functions:打印操作Scrolling Functions:滚动操作*Bitmap Functions:位图操作*Region Functions:区域操作*Font Functions:字体操作*Color and Color Palette Functions:颜色/调色板操作其中,标注*项会用到相应的图形对象类,参见2.1.2内容。

2.1.2图形对象类设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外, Windows还有其他一些图形对象用来储存绘图特征。

这些附加的功能包括从画线的宽度和颜色到画文本时所用的字体。

图形对象类封装了所有六个图形对象。

下面的表格列出了MFC的图形对象类:MFC类 图形对象句柄 图形对象目的CBitmap HBITMAP 内存中的位图CBrush HBRUSH 画刷特性—填充某个图形时所使用的颜色和模式CFont HFONT 字体特性—写文本时所使用的字体CPalette HPALETTE 调色板颜色CPen HPEN 画笔特性—画轮廓时所使用的线的粗细CRgn HRGN 区域特性—包括定义它的点表1 图形对象类和它们封装的句柄使用CDC和图形对象类,在Windows里绘图还算是很简单的。

观察以下的画面:图2 使用CDC绘制出的按钮该画面通过以下代码自行绘制的假按钮:BOOL CUi1View::PreCreateWindow(CREATESTRUCT& cs){//设置背景色//CBrush CUi1View::m_Backm_Back.CreateSolidBrush(::GetSysColor(COLOR_3DFACE));cs.lpszClass = AfxRegisterWndClass(0, 0, m_Back, NULL);return CView::PreCreateWindow(cs);}int CUi1View::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CView::OnCreate(lpCreateStruct) == -1)return -1;//创建字体//CFont CUi1View::m_Fontm_Font.CreatePointFont(120, "Impact");return 0;}void CUi1View::OnDraw(CDC* pDC){//绘制按钮框架pDC->DrawFrameControl(CRect(100, 100, 220, 160), DFC_BUTTON, DFCS_BUTTONPUSH);//输出文字pDC->SetBkMode(TRANSPARENT);pDC->TextOut(120, 120, "Hello, CFan!");}呵呵,不好意思,这并不是真的Windows按钮,它只是一个假的空框子,当用户在按钮上点击鼠标时,放心,什么事情都不会发生。

2.2Windows的幕后绘图操作在Window中,如果所有的界面操作都由用户代码来实现,那将是一个很浩大的工程。

笔者曾经在DOS设计过窗口图形界面,代码上千行,但实现的界面还是很古板、难看,除了我那个对编程一窍不通的女友,没有一个人欣赏它L;而且,更要命的是,操作系统,包括别的应用程序并不认识你的界面元素,这才是真正悲哀的。

认识这些界面的只有你的程序,图2中的按钮永远只是一个无用的框子。

有了Windows,一切都好办了,Windows将诸如按钮、菜单、工具栏等等这些通用界面的绘制及动作都交给了系统,程序员就不用花心思再画那些按钮了,可以将更多的精力放在程序的功能实现方面。

所有的标准界面元素都被Windows封装好了。

Windows知道怎么画你的菜单以及你的标注着“Hello, Cfan!”的按钮。

当CFan某个快乐的小编(譬如:小飞)点击这个按钮的时候,Windows也明白按钮按下去的时候该有的模样,甚至,当这个友好的按钮获取焦点时,Windows也会不失时机地为它准备一个虚框……有利必有弊。

你的不满这时候产生了:你既想使用Windows的True Button,可也嫌它的界面不够好看,譬如,你喜欢用蓝色的粗体表达你对CFan的无限情怀(正如图2那样)——人心不足,有办法吗?有的。

3 美化界面之实现篇Windows还是给程序员留下了很多后门,通过一些途径还是可以美化界面的。

本章节我们系统学习一下Windows界面美化的实现。

3.1美化界面的途径如何以合法的手段来达到美化界面的效果?一般美化界面的方法包括:1.使用MFC类的既有函数,设定界面属性;2.利用Windows的消息机制,截获有用的Windows的消息。

通过MFC的消息映射(MessageMapping)和反射(Message Reflecting)机制,在Windows准备或者正在绘制该元素时,偷偷修改它的状态和行为,譬如:让按钮的边框为红色;3.利用MFC类的虚函数机制,重载有用的虚函数。

在MFC框架调用该函数的时候,重新定义它的状态和行为;一般来说,应用程序可以通过以下两种途径来实现以上的方法:1.在父窗口里,截获自身的或者由子元素(包括控件和菜单等元素)传递的关于界面绘制的消息;2.子类化子元素,或者为子元素准备一个新的类(一般来说该类必须继承于MFC封装的某个标准类,如:CButton)。

在该子元素里,截获自身的或者从父窗口反射过来的关于界面绘制的消息。

譬如:用户可以创建一个CXPButton类来实现具有XP风格的按钮,CXPButton继承于CButton。

对于应用程序,使用CXPButton类的途径相对于对话框窗口和普通窗口分成两种:① 对话框窗口中,直接将原先绑定按钮的CButton类替换成CXPButton类,或者在绑定变量时直接指定Control类型为CXPButton,如图3所示:图3 为按钮指定CXPButton类型②在普通窗口中,直接创建一个CXPButton类对象,然后在OnCreate()中调用CXPButton 的Create方法;以下的章节将综合地使用以上的方法,请读者朋友留心观察。

3.2使用MFC类的既有函数在界面美化的专题中,MFC也并非一无是处。

MFC类对于界面美化也做了部分的努力,以下是一些可以使用的,参数说明略去。

CWinApp::SetDialogBkColorvoid SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) );指定对话框的背景色和文本颜色。

CListCtrl::SetBkColorCReBarCtrl::SetBkColorCStatusBarCtrl::SetBkColorCTreeCtrl::SetBkColorCOLORREF SetBkColor( COLORREF clr );设定背景色。

CListCtrl::SetTextColorCReBarCtrl::SetTextColorCTreeCtrl::SetTextColorCOLORREF SetTextColor( COLORREF clr );设定文本颜色。

CListCtrl::SetBkImageBOOL SetBkImage( LVBKIMAGE* plvbkImage );BOOL SetBkImage( HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);BOOL SetBkImage( LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0 );设定列表控件的背景图片。

相关文档
最新文档