VC++界面美化
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没有效果甚至导致程序崩溃之类的问题、这里有一个可用的破解版本(包含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创建漂亮的图形用户界面应用程序作者:刘汇丹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是个方便而且功能强大的界面加强型组件包。
只要在程序的任何一个窗体里加入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皮肤以及XP风格实现

本文章由三部分组成:1.利用XPButton类实现XP风格的按钮。
2.无负担实现XP风格界面。
3.VC皮肤的使用。
良好的程序界面会给客户留下好的印象。
通过本文介绍的三种方法,可以在实际编程中满足一些对界面要求不是很高的软件的需求。
第一部分:利用XPButton类实现XP风格的按钮。
此部分主要用到一个网上流传的类:XPButton。
具体使用步骤如下:1.创建基于对话框的MFC工程假设命名为:XPButtonTest,将XPButton.cpp和XPButton.h放到当前工程目录,通过Project->Add to project->Add file to project将XPButton.cpp和XPButton.h 导入到工程中。
2.在CXPButtonTestDlg.h添加头文件#include "XPButton.h".3.关闭工程,将工程目录下的.clw文件删除,重新打开工程,为对话框添加一个按钮控件。
通过类向导为此按钮控件添加一个变量,变量类型(Variable type)选择CXPButton。
在此步骤中如果不删除.clw文件,则在选择变量类型的时候下拉列表中不会出现CXPButton选项,可以选择CButton,然后手动到CXPButtonTestDlg.h中将变量类型修改为CXPButton。
4.编译运行就可以看到按钮具有XP风格。
注意:此方法只能使变量类型修改为CXPButton的按钮控件实现XP风格效果,对于没有作第三步的按钮,还保持原来的样式。
第二部分:无负担实现XP风格界面关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文件名改一下,比如.exe文件为test.exe,就将这个.manifest文件改名成test.exe.manifest,并将其和test.exe放在同一个目录里,这样test.exe在XP或2003(必须启动Themes服务)下运行时就会呈现XP界面风格。
我整理的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);HBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(IDB_BITMAP2));p->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);p->SetBitmap(hBitmap);详解:CStatic *p =(CStatic *)GetDlgItem(IDC_SHOWBMP); //获得指向IDC_SHOWBMP的指针,并将其强制转换为CStatic*类型,并赋值给pHBITMAPhBitmap=::LoadBitmap(AfxGetResourceHandle(),MAKEINTRESO URCE(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));。
让你的软件界面更漂亮[VC][二]
![让你的软件界面更漂亮[VC][二]](https://img.taocdn.com/s3/m/6e0ff798c67da26925c52cc58bd63186bceb92a1.png)
让你的软件界面更漂亮[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++软件框架窗口界面设计.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 派生而来的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++界面美化VC开发程序单调的界面相信大家都是深有感触,提到界面美化编程,人们都会说做界面不要用VC写,太难了。
一句俗语:难者不会,会者不难。
VC的美化界面编程并没有人们想像的那么难。
这篇文章是我写的一个用户登录界面,但界面被我美化了,下面将一步一步的来讲解它的美化界面的实现步骤。
相信有了这篇文章,你的VC界面从此也能绚丽多彩。
实现步骤:第一步:美化界面的非客户区(重绘标题栏和界面边框)。
关键代码如下:// 函数名:DrawTitleBar// 功能描述:绘制标题栏、边框颜色,绘制标题内容、图标和按钮// 输入参数:pDC:设备指针// 输出参数:void// 创建日期:2006-2-20// 修改日期:2006-2-20// 作者:joinclear// 附加说明:无void CTitleBarColorDlg::DrawTitleBar(CDC *pDC){if (m_hWnd){CBrush Brush(RGB(187,200,143));CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons;GetWindowRect(&rtWnd);//取得标题栏的位置//SM_CXFRAME 窗口边框的边缘宽度//SM_CYFRAME 窗口边框的边缘高度//SM_CXSIZE 窗口标题栏宽度//SM_CYSIZE 窗口标题栏高度rtTitle.left = GetSystemMetrics(SM_CXFRAME);rtTitle.top = GetSystemMetrics(SM_CYFRAME);rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);CPoint point;//填充顶部框架point.x = rtWnd.Width(); point.y = GetSystemMetrics(SM_CYSIZE) +GetSystemMetrics(SM_CYFRAME) + 0;pDC->PatBlt(0, 0, point.x, point.y, PATCOPY); //填充左侧框架point.x = GetSystemMetrics(SM_CXFRAME) -1;point.y = rtWnd.Height()- 1;pDC->PatBlt(0, 0, point.x, point.y, PATCOPY); //填充底部框架point.x = rtWnd.Width();point.y = GetSystemMetrics(SM_CYFRAME);pDC->PatBlt(0, rtWnd.Height()-point.y, point.x, point.y, PATCOPY);//填充右侧框架point.x = GetSystemMetrics(SM_CXFRAME);point.y = rtWnd.Height();pDC->PatBlt(rtWnd.Width()-point.x, 0, point.x, point.y, PATCOPY);//重画标题栏图标m_rtIcon.left = rtTitle.left ;m_rtIcon.top = rtTitle.top;m_rtIcon.right = m_rtIcon.left + 16;m_rtIcon.bottom = m_rtIcon.top + 15;::DrawIconEx(pDC->m_hDC, m_rtIcon.left,m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME),m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);m_rtIcon.OffsetRect(rtWnd.TopLeft());CBitmap* pBitmap = new CBitmap;CBitmap* pOldBitmap;CDC* pDisplayMemDC=new CDC;pDisplayMemDC->CreateCompatibleDC(pDC);//重画关闭buttonrtButtons.left = rtTitle.right - 16;rtButtons.top = rtTitle.top - 1;rtButtons.right = rtButtons.left + 16;rtButtons.bottom = rtButtons.top + 15;pBitmap->LoadBitmap(IDB_EXIT_FOCUS);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0,0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);m_rtButtExit = rtButtons;m_rtButtExit.OffsetRect(rtWnd.TopLeft());pBitmap->DeleteObject();//重画最大化/恢复buttonrtButtons.right = rtButtons.left - 3;rtButtons.left = rtButtons.right - 16;if (IsZoomed())pBitmap->LoadBitmap(IDB_RESTORE_NORMAL);elsepBitmap->LoadBitmap(IDB_MAX_NORMAL);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);m_rtButtMax = rtButtons;m_rtButtMax.OffsetRect(rtWnd.TopLeft());pBitmap->DeleteObject();//重画最小化buttonrtButtons.right = rtButtons.left - 3;rtButtons.left = rtButtons.right - 16;pBitmap->LoadBitmap(IDB_MIN_NORMAL);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);m_rtButtMin = rtButtons;m_rtButtMin.OffsetRect(rtWnd.TopLeft());pBitmap->DeleteObject();//重画captionint nOldMode = pDC->SetBkMode(TRANSPARENT);COLORREF clOldText=pDC->SetTextColor(RGB(255, 255, 255));CFont m_captionFont;m_captionFont.CreateFont(18, // 字体的高度0, // 字体的宽度0, // 字体显示的角度0, // 字体的角度FW_BOLD, // 字体的磅数FALSE, // 斜体字体FALSE, // 带下划线的字体0, // 带删除线的字体ANSI_CHARSET, // 所需的字符集OUT_DEFAULT_PRECIS, // 输出的精度CLIP_DEFAULT_PRECIS, // 裁减的精度DEFAULT_QUALITY, // 逻辑字体与输出设备的实际字体之间的精度DEFAULT_PITCH | FF_SWISS, // 字体间距和字体集 _T("Arial")); // 字体名称CFont* pOldFont = NULL;pOldFont = pDC->SelectObject(&m_captionFont);rtTitle.left += m_rtIcon.Width ()+3;rtTitle.top = rtTitle.top;rtTitle.bottom = rtTitle.top + 30;CString m_strTitle;GetWindowText(m_strTitle);pDC->DrawText(m_strTitle, &rtTitle, DT_LEFT); pDC->SetBkMode(nOldMode);pDC->SetTextColor(clOldText);ReleaseDC(pDisplayMemDC);delete pDisplayMemDC;delete pBitmap;}}还有在非客户区绘制鼠标的消息。
分别为:void CTitleBarColorDlg::OnNcLButtonDown(UINT nHitTest, CPoint point){if (m_rtButtExit.PtInRect(point)) //关闭SendMessage(WM_CLOSE);else if (m_rtButtMin.PtInRect(point)) //最小化SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y));else if (m_rtButtMax.PtInRect(point)){if (IsZoomed()) //最大化{SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y));CRect rtWnd;GetWindowRect(&rtWnd);CRgn rgn;rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd .Height(),5,5);SetWindowRgn((HRGN)rgn,true);Invalidate();}else{SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y));CRect rtWnd;GetWindowRect(&rtWnd);CRgn rgn;rgn.CreateRoundRectRgn(0,0,rtWnd.Width(),rtWnd .Height(),5,5);SetWindowRgn((HRGN)rgn,true);Invalidate();}}else if (!IsZoomed())Default();}void CTitleBarColorDlg::OnNcMouseMove(UINT nHitTest, CPoint point){CWindowDC dc(this);CWindowDC* pDC = &dc;CDC* pDisplayMemDC=new CDC;pDisplayMemDC->CreateCompatibleDC(pDC);CBitmap* pBitmap = new CBitmap;CBitmap* pOldBitmap;CRect rtWnd, rtButton;if (pDC){GetWindowRect(&rtWnd);//关闭buttonif (m_rtButtExit.PtInRect(point))pBitmap->LoadBitmap(IDB_EXIT_NORMAL);elsepBitmap->LoadBitmap(IDB_EXIT_FOCUS);rtButton = m_rtButtExit;rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);pBitmap->DeleteObject();//最大化/恢复buttonif (m_rtButtMax.PtInRect(point)){if (IsZoomed())pBitmap->LoadBitmap(IDB_RESTORE_FOCUS); elsepBitmap->LoadBitmap(IDB_MAX_FOCUS);}else{if (IsZoomed())pBitmap->LoadBitmap(IDB_RESTORE_NORMAL); elsepBitmap->LoadBitmap(IDB_MAX_NORMAL);}rtButton = m_rtButtMax;rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);pBitmap->DeleteObject();//最小化buttonif (m_rtButtMin.PtInRect(point))pBitmap->LoadBitmap(IDB_MIN_FOCUS);elsepBitmap->LoadBitmap(IDB_MIN_NORMAL);rtButton = m_rtButtMin;rtButton.OffsetRect(-rtWnd.left, -rtWnd.top);pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(p Bitmap);pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY);pDisplayMemDC->SelectObject(pOldBitmap);pBitmap->DeleteObject();}pDisplayMemDC->DeleteDC();delete pDisplayMemDC;delete pBitmap;CDialog::OnNcMouseMove(nHitTest, point);}大部分实现如上代码所示具体实现请参照程序附带的源代码。