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表示是一个应用程序框架类函数,哪里都可用。

VC++界面美化

VC++界面美化

file:///C|/Documents and Settings/Administrator/桌面/新建 Microsoft Word 文档1.html[2011-3-15 19:35:24]
VC++界面美化 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); // 重画关闭button rtButtons.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(pBitmap); 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(); // 重画最大化/ 恢复button rtButtons.right = rtButtons.left - 3; rtButtons.left = rtButtons.right - 16; if (IsZoomed()) pBitmap->LoadBitmap(IDB_RESTORE_NORMAL); else pBitmap->LoadBitmap(IDB_MAX_NORMAL); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap);

vc美化编程

vc美化编程

使用SkinMagic Toolkit美化界面每个人都希望自己的程序看起来漂亮些,一切都自己来做显得不太现实,选择一个成熟的第三方界面库是一条快速的捷径。

关于界面美化的第三方程序库也有很多,如BCGControlBar、XTP、SkinMagic等。

对于新手而言,能快速上手的程序库是首选。

在众多的界面程序库中,SkinMagic是最容易上手,最容易使用的。

本文介绍了如何建立一个简单的SkinMagic程序以及几个基本的SkinMagic API,当然,仅仅是作为入门之用☺。

开发平台:VC6 + SkinMagic2.21示例代码+SkinMagic下载●准备工作1、下载SkinMagic Toolkit,复制SkinMagicTrial.dll、SkinMagicTrial.lib、SkinMagicLib.h以及皮肤文件corona.smf至项目的目录下。

(这样比较简单☺,可以在这下载。

)2、在stdafx.h中加入头文件和库的引用,如下:#i nclude "SkinMagicLib.h"#pragma comment(lib, "SkinMagicTrial.lib")●使用SkinMagic1、初始化SkinMagic库:int __stdcall InitSkinMagicLib( HINSTANCE hInstance,LPCTSTR lpApplication ,LPCTSTR lpReserved1,LPCTSTR lpReserved2 );在CxxxApp::InitInstance()中加入初始化SkinMagic库的代码:VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));2、调入皮肤文件:皮肤的调用有两种方法,一是直接从皮肤文件中调用,另一种方法是从资源文件中调用,分别说明如下:1)从皮肤文件中调用皮肤:i nt __stdcall LoadSkinFile( LPCTSTR lpSkinFile );2)从资源文件中调用皮肤:int __stdcall LoadSkinFromResource(HMODULE hModule,LPCTSTR lpSkinName ,LPCTSTR lpType);现在CxxxApp::InitInstance()中的代码如下:BOOL CxxxApp::InitInstance(){VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));VERIFY( 1 == LoadSkinFile("corona.smf"));AfxEnableControlContainer();//…..下略}3、将皮肤应用到程序上int __stdcall SetWindowSkin( HWND hWnd , LPCTSTR lpSkinName );int __stdcall SetDialogSkin( LPCTSTR szSkinName );1)对话框程序代码位置:BOOL CxxxApp::InitInstance(){//...上略m_pMainWnd = &dlg;VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));VERIFY( 1 == SetDialogSkin( "Dialog" ) );int nResponse = dlg.DoModal();//…下略}2)文档视图程序代码的位置BOOL CxxxApp::InitInstance(){ //…上略m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));VERIFY( 1 == SetDialogSkin( "Dialog" ) );return TRUE;}4、释放SkinMagic资源void __stdcall ExitSkinMagicLib();重载应用程序的ExitInstance()函数,添加如下代码:int CxxxApp::ExitInstance(){ExitSkinMagicLib();return CWinApp::ExitInstance();}结论经过简短的4步,程序就换上了新装。

vc++6.0的界面设计与资源编辑器

vc++6.0的界面设计与资源编辑器

vc++6.0的界面设计与资源编辑器vc++6.0的界面设计与资源编辑器一、资源与界面:windows95/98将应用程序常用到的一些“数据”归纳定义成可共享的资源,例如vc++6.0中将某些静态的、可归类的和可共享的数据以资源形式处理,主要包括菜单、图标、对话框、位图、快捷键、工具栏、光标、描述信息和字符串表等。

以资源作为线索,增强了编程的逻辑条理,简化了开发过程。

其中还为编辑菜单、对话框、工具栏等资源的程序界面设计提供了直观、可视的设计方法,即程序的界面设计在很大程度上就是对相关资源的编辑处理。

因而熟练掌握资源编辑器,对界面设计及整个应用程序资源的逻辑关系都是非常重要的。

二、资源管理:资源管理包括各种资源的创建和维护,vc++6.0中提供了一整套处理资源的方法,通过workspace 的“resource view”(资源视图)的导航,可以创建资源或激活各种资源相应的资源编辑器以执行可视化编辑。

1.打开应用程序:fileàopen workspace2.浏览应用程序的资源:调入应用程序后,在workspace窗口的“resourceview”中显示应用程序所涉及资源的列表。

如果workspace 窗口未打开,则在“view”下拉菜单中选择“workspace”选项。

accelearator(快捷键)、dialog(对话框)、icon(图标)、menu(菜单)、string table(字符串表)、toolbar(工具栏)、version(描述)。

各资源类中包含有具体资源项,这些资源项组成了应用程序自己的资源,程序员也可添加新的资源或资源项。

3.增加新资源:增加新资源的常用方法是从“insert”下拉菜单中选择“resource”选项,或右击workspace中资源项,在vc++6.0的快捷菜单中,选择“insert”项。

选择后,vc++6.0显示“insert resource”对话框,选择所需资源以增加,同时,并新建一个名为“idb_xxx”的资源项。

VC6编程,让程序有系统皮肤

VC6编程,让程序有系统皮肤

VC6编程,让程序有系统皮肤Windows下的动态链接库可能存在多个版本,比如系统提供的基本控件所在的Comctl32.dll 就包括版本6.0和之前的版本。

在新版本之前编写的程序能否保证绝对和新版本的动态链接库兼容呢?只能说,一般情况下可以,但是不能绝对保证。

Windows提供了解决办法,那就是设定程序执行的Active Context。

对于客户自己编写的动态链接库,同样也存在这样的问题。

这里说的是动态链接库,如果考虑动态链接库的其他应用,就涉及到更广阔的应用范围了,可能是普通的动态链接库,可能是COM服务器等,这些都是可以通过配置程序执行环境来改变具体使用哪个动态链接库。

配置程序执行上下文,实际就是配置程序执行的组件配置,这里的组件只要是指动态链接库。

对组件进行配置,简单来说,就是配置程序使用什么动态链接库。

这种配置具体是怎么实现的呢?其实就是在Windows程序真正启动之前增加了一层处理。

这层处理就是把程序执行所需要的环境先建立好,直接点说就是把需要的动态链接库准备好。

上面说到,配置组件就是在程序真正执行之前准备好需要的动态链接库,这项工作可以由Windows系统的Module Loader或者应用程序自己完成。

具体的实现方式有三种:1.文件级的配置:在应用程序所在的目录下创建一个.exe.manifest文件,这个文件中说明组件配置的具体信息,具体的信息格式可以查询MSDN。

在VS2003及以上的版本,新建工程时,会自动生成一个manifest文件在res目录下。

2.资源级的配置:创建资源,类型:RT_MANIFEST(值为24),ID:CREATEPROCESS_MANIFEST_RESOURCE_ID(值为1),内容为上面的manifest文件的内容。

Module Loader在加载EXE之后,执行程序之前,会检测到程序的资源表中是否有类型为24,ID为1的资源,如果有这项配置信息,就会按照配置信息中的配置,加载对应的动态链接库了。

跟我学做c#皮肤美化(二)

跟我学做c#皮肤美化(二)

跟我学做c#皮肤美化(二)跟我学做c#皮肤美化(二)--Button控件的制作概述与导航这一篇的QLFUI按钮.zip 先来看看我们最终要做的效果图(分别对应普通、悬停、按下时的状态):下面就开始正式做。

首先让我们新建一个控件库项目,命名为QLFUI。

如图:然后将默认的UserControl1重命名为Button。

接下来,我们就要在这上面来做文章了。

先来稍稍设置一下,让这个用户控件看起来更像一个按钮吧!Button的Size: 78,30 BackgroundImageLayout:Stretch然后拖一个label控件到这个用户控件上,并设置label1的属性为AutoSize:false , Dock:fill,TextAlign:MiddleCenter, BackColor: Transparent, Font: 宋体, 9pt这几个属性。

好了,是不是开始像一个按钮了呢?哦,差点忘了最后还要将整个控件(BUTTON)的背景色设置为Trasparent透明色。

因为如果不设置成透明色那么透明的图片下面就会显示出button的背景色(默认灰色),不好看。

好了,现在样子的已经大概有了,接下来就是编程了。

先贴代码,然后我一个一个解释:代码[DefaultEvent('Click')]public partialclass Button: UserControl{#region 变量//三种不同状态下的图片Image _normalImage =null; Image _moveImage =null; Image _downImage =null;#endregion#region 属性[Category('QLFSkinDll')] public ImageNormalImage {get{return_normalImage;}set{_normalImage = value;}[Category('QLFSkinDll')] public ImageDownImage {get{ return _downImage; } set{_downImage = value;}}[Category('QLFSkinDll')] public ImageMoveImage {get{ return _moveImage; } set{_moveImage = value;}}[Category('QLFSkinDll')]public stringCaption{get{ bel1.Text;} //控件运行时会自动运行get方法得到值set{bel1.Text= value;}}#endregion#region 构造函数public Button(){this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);//默认的是自带的图片样式,如果使用该按钮则必须手工指定当前按钮你想要的背景图片_normalImage =Image.FromStream(Assembly.GetExecutingAssembly().G etManifestResourceStream(@'QLFUI.Res.button.btnnoma l.bmp'));_moveImage =Image.FromStream(Assembly.GetExecutingAssembly().G etManifestResourceStream(@'QLFUI.Res.button.btnfore.b mp'));_downImage =Image.FromStream(Assembly.GetExecutingAssembly().G etManifestResourceStream(@'QLFUI.Res.button.btndown .bmp'));MakeTransparent(_normalImage);MakeTransparent(_moveImage);MakeTransparent(_downImage);InitializeComponent();this.BackgroundImage= _normalImage;}#endregion#region 辅助函数private voidMakeTransparent(Image image){Bitmapbitmap = image as Bitmap;bitmap.MakeTransparent(Color.FromArgb(255, 0, 255)); }#endregion#region 事件private voidlabel1_MouseEnter(object sender, EventArgs e){this.BackgroundImage= _moveImage;}private voidlabel1_MouseDown(object sender, MouseEventArgs e){this.BackgroundImage= _downImage;}private voidlabel1_MouseLeave(object sender, EventArgs e){this.BackgroundImage= _normalImage;}private voidlabel1_MouseUp(object sender, MouseEventArgs e){this.BackgroundImage= _normalImage;}private voidlabel1_Click(object sender, EventArgs e){this.OnClick(e);}#endregion} 先看第一句:[DefaultEvent('Click')],这句话是什么意思呢?我们知道平常我们拖一个按钮后,在设计模式下双击这个按钮就会自动产生这个按钮的Click事件。

VC实现超眩qq界面的模拟(附源码)

VC实现超眩qq界面的模拟(附源码)

关键字: QQ界面换肤自绘控件透明窗口Vista样式免费开发包随着计算机技术的发展与普及,计算机逐渐走进了人们的日常生活当中。

人们通过它来学习,娱乐,信息的交互等等.并且对应需而生的各种各样的软件产品的要求也有了一定的提高。

除了基本功能外,对软件易操作性,界面的美观性等也是一个成功软件必不可少的重要因素。

美观个性化的界面是一个软件吸引和留住用户的法宝之一,通讯软件QQ/MSN就是这类产品中的一个典型的代表,下面将用VC++对QQ的界面进行模拟实现,供广大朋友参考。

相信各位对QQ已经相当熟悉,因此对其外观特性等不作累叙.我们将选用Visual C++来进行进行实现。

在这之前,有必要向读者介绍一下大体情况。

其实,整个过程最重要的部分是个性化界面自绘部分,也是难度最大的部分。

关于界面编程方面的知识,诚然这是一个较为大的体系结构,我们不能奢求通过简短的篇幅就能对它进行较为全面的描述,并且现在软件开发行业也有缩短开发周期,提高开发效率的趋势,于是将这一难度问题借用外在控件协助我们完成.关于换肤控件的选择,这里也向大家简单介绍一下,当然这只是个人的观点,仅供参考了解。

当前市场提供多个换肤出名的换肤产品(SkinMagic,Skin++,USkin,AppFace,SkinCrafte,等),其中SkinMagic,AppFace,USkin等都是做得比较马虎的,界面的某些元素效果做得让人不太满意.而Skin++和SkinCrafte在这方面做得比较出色.客观的说Skin++目前应该说,是国内较为出色的产品,其占用资源消耗比俄国产品SkinCrafte要出色,而俄国产品SkinCrafte在外观性能上做到的效果比Skin++要优秀点,COOL一点.虽然如此,本实现没有选用以上任何一产品,原因是这里有一个新起之秀SkinBeauty,它无论是性能和外观做出的效果都比较嚣张,更甚的是宣称提供良好的键盘操作支持同时并号称在Win2K和XP等系统可以做出Vista的玻璃磨沙效果。

我整理的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));。

美化主界面——使用VB进行可视化软件开发

美化主界面——使用VB进行可视化软件开发

美化主界面——使用VB进行可视化软件开发一、教材分析这节课内容采用广东教育出版社《信息技术》高中版第四册的第二章第三节,教材以任务形式详细地介绍了在VisualBasic中使用定时器美化主界面的操作方法,本章使用数学八宝箱的程序实例要求学生通过形象的任务展开VisualBasic的学习达到高二学生对面向对象程序设计初步理解并可以独立完成简单的可视化系统的开发,作为课本第一章是学习程序设计语言QBASIc的基础,可以说第一章的结构化程序设计的基本语句为第二章的可视化开发系统奠定基础,并本章的前二节分别讲述了VisualBasic的工作界面、VisualBasic开发平台特点及设计流程、如何使用控件创建对象、对象的属性设置、编写事件程序代码等内容。

在本节课中的主要学习任务要求学生在第一章的相关语句及本章前二节的内容上达到知识迁移并通过研究性自主学习、教师指导,学会并理解编写VisualBasic程序的基本步骤,最终应用在以后的章节的学习中。

信息技术课的宗旨是利用所学的知识技能去获取、加工处理信息,并在基础上有所创新,所以本节在内容安排上不仅是书中的相关操作,同时还采用现实生活相关实例,做到教学内容与语文、数学、美术等学科相结合,将一些开发好的作品、世界名车图片以文件的形式放于网上,学生在学习VisualBasic编程时,欣赏这些作品、图片使整个学习内容更丰富,掌握的知识更全面。

二、教学对象分析高二这届学生从小学四年级开始开设信息技术课程并在初二时学习使用的是广东省新世纪出版社的教材,教材内容是程序设计及使用QBASIc作画和发声(一学年),且两年同班共同学习使学生之间彼此非常熟悉,由于上述原因教学过程可达到自主学习和协作学习相结合。

这届学生经过几年电脑学习具备一定的计算机操作能力、实践能力,他们对信息技术的认知能力、实际操作能力、知识水平已达到一定的水平。

在学习本节课内容时,已掌握一定的编程基础,学习兴致非常高,并基于他们年龄的特征,他们对抽象理论性强的知识点已能够较好理解,对问题的解决处理已有一定见解和方法。

VC++界面设计

VC++界面设计
Message Maps Member variables
事件响应
Message Maps:
Project Class name Object IDs:组件ID列表 Messages:消息响应 Member functions:对应的成员函数
选中一个Object IDs后,在Messages中是其对应的 消息响应,双击某message(如:COMMAND)添 加相应的成员函数。双击该函数,调整至该函数体 就可编辑代码了。
位图处理
在位图(棋盘)上绘制其他图形 打印字符串:
MemDC.TextOut(200, 200, "Hello World!"); 但字串会有白色的背景,把下面语句添加到上面语句之前,设置透明背景。 MemDC.SetBkMode(TRANSPARENT);
绘制棋子: (1) 导入图片:insert->resource->bitmap->import (ID:IDB_CHESS) (2) 创建CImageList对象实例:CImageList m_Queen; (3) m_Queen关联位图:
事件响应
Member variables: Project Class name Control IDs:可添加变量的控件ID列表 对某一控件添加一个变量:
选中该控件ID -> Add Variable ->编辑
如,对IDC_TEXT添加成员变量m_stext
数据处理
数据层:处理数据 图形界面层:根据数据显示图形化界面 CMyData类,数据处理类
位图处理
1. 添加static text组件,调整位置与大小 2. 修改属性:ID(IDC_BOARD),caption,style选中notify (消息响应) 3. 导入位图:insert->resource->bitmap->import. ID修改为IDB_BOARD 1. 创建CWnd、CDC对象实例: CDC *pboardDC; CWnd *pBoardWnd; 5. 初始化,CWnd与Static text ID关联,并获取设备上下文 pBoardWnd=GetDlgItem(IDC_BOARD); pboardDC=pBoardWnd->GetDC(); 6. 加载位图(棋盘): 防止屏幕闪烁,缓冲技术

VC之美化界面篇

VC之美化界面篇

VC之美化界面篇本文专题讨论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设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。

这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。

这也就是Windows的设备无关性。

  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 );设定列表控件的背景图片。

相关文档
最新文档