用VC实现异形窗口_第1页
用VC实现异形窗口_第2页
用VC实现异形窗口_第3页
用VC实现异形窗口_第4页
用VC实现异形窗口_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——用VC实现异形窗口151505183.doc7-1

用VC++实现异形窗口.

随着Microsoft依据Windows在操作系统上取得的巨大成绩,Windows用户界面也日益成为业界标准。统一的界面给广大用户对应用软件的学习与使用带来了很大便利。但每天都面对同一副面孔,日久天长难免会产生一些厌倦,开发一些“离经叛道〞,一改Windows应用程序千篇一律的“标准〞界面,一定会给你带来一种清爽的感觉。

标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形〞对话框/窗口也主要是颜色与外形上动手脚。

1.改变背景颜色

改变对话框(窗口)的背景颜色是最简单的改变Windows应用程序外观的方法,根据Windows创立与管理机理,一般有两种方法。一种是处理WM_CTLCOLOR消息,首先创立所选背景颜色的刷子,然后调用SetBkColor()或SetDialogBkColor()以所创立的刷子来绘制窗口或对话框的背景。需要重画窗口或对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。另外一种是响应Windows的WM_ERASEBKGND消息,Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用VC++的ClassWizard重载该消息的缺省处理程序来擦除背景(实际是用刷子画),并返回TRUE以防止Windows擦除窗口。

2.改变窗口外形

通过使用新的SDK函数SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,因此实际上是使窗口成为指定的不规则形状(区域形状)。“区域〞是WindowsGDI中一种强有力的机制,区域是设备上的一块空间,可以是任意形状,繁杂的区域可以由各个小区域组合而成。Windows内含的区域创立函数有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通过CombineRgn()来组合区域,即可得到繁杂形状的区域,获得繁杂形状的窗口外形。

通过上面的方法虽然可以得到“异形〞窗口,但感觉颜色单调,外形也不够“COOL〞,能否获得更酷的“异形〞对话框/窗口呢?回复是确定的。下面就介绍利用位图和蒙板创立“异形〞对话框/窗口的方法。

3.利用位图创立异形对话框窗口

利用位图创立异形对话框原理是根据象素的颜色来进行“扣像〞处理,对所有非指定颜色象素区域进行区域组合。利用这一技术,实际上就是实现对话框/窗口的位图背景,并且对指定的颜色区域进行透明处理。下面就以透明位图为背景的对话框为例来说明:

首先用绘图软件如PhotoShop绘制编辑一幅拟做对话框背景用的图片,用BMP格式保存,假设存为Back.Bmp。需要说明的是,虽然VisualC++集成开发环境的资源编辑器只能编辑不超过16色的位图,但完全我们可以以真彩色方式存储,不必搭理VisualC++的警告。下一步是用VisualC++的AppWizard创立一个基于对话框的应用程序假定命名为Trans。用资源编辑器引入背景图片Back.Bmp,假使是高彩色,不必搭理出现的警告信息,点击OK确认即可。为了明确,修改默认的资源ID标识IDB_BITMAP1为IDB_BACKBMP。然后修改对话框的Style为Popup,Border为None,如图1。

151505183.doc7-2

图1

向CTransDlg类添加区域处理功能模块voidCTransDlg::SetupRegion(CDC*pDC/*对话框窗口DC*/,UINTBackBitmapID/*背景位图资源ID*/,UINTMaskBitmapID/*区域处理位图资源ID*/,COLORREFTransColor=0x00000000/*透明颜色值,默认为黑色*/)。到目前为止,我们暂时认为MaskBitmapID等同于BackBitmapID。其核心工作是根据MaskBitmapID指示位图的象素颜色进行区域组合。完整的代码如下:

voidCTransDlg::SetupRegion(CDC*pDC/*对话框窗口DC*/,

UINTBackBitmapID/*背景位图资源ID*/,

UINTMaskBitmapID/*区域处理位图资源ID*/,COLORREFTransColor/*透明颜色值*/){

CDCCBitmap

memDC;cBitmap;

pOldMemBmp=NULL;cl;

cRect;x,y;

wndRgn,rgnTemp;

CBitmap*COLORREFCRectUINTCRgn

//取得窗口大小

GetWindowRect(//背景位图资源ID

m_BackBitmapID=BackBitmapID//装载位图

cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);

pOldMemBmp=memDC.SelectObject(//首先创立默认的完整区域为完整的窗口区域

wndRgn.CreateRectRgn(0,0,cRect.Width(),cRect.Height());

151505183.doc7-3

//下面的两层循环为检查背景位图象素颜色,进行透明区域处理;//当象素颜色为指定的透明值时,即将该点从区域中剪裁掉。//其中用到的几个成员变量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth

//和m_CaptionHeight,其作用后面再作说明,此时可全部当作0来处理。for(x=m_FrameWidth+m_MaskLeftOff;

xBitBlt(0,0,rect.Width(),rect.Height(),

if(pOldMemBmp)memDC.SelectObject(pOldMemBmp);//删除系统却省的OnEraseBkgnd功能//returnCDialog::OnEraseBkgnd(pDC);returnTRUE;

接下来是在WM_PAINT的消息处理函数OnPaint()中添加代码。由于当背景位图比较大时,进行区域处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误会。再一种方法就是在OnPaint()处理,但为了避免重复处理,可以加上一个判断标志。以下是OnPaint()的代码,正体为AppWizard生成,粗体为自己添加内容。

voidCTransDlg::OnPaint(){

if(IsIconic()){??}else{

if(m_nFirstRun){//首次运行标志//修改鼠标光标为等待方式BeginWaitCursor();

//设置背景区域

SetupRegion(GetWindowDC(),

IDB_BACKBMP,IDB_BACKBMP,0x00FFFFFF/*白色*/);

//恢复鼠标光标为正常模式

}

}

EndWaitCursor();m_nFirstRun=0;

CDialog::OnPaint();

}

剩下的工作就是根据背景位图的大小来设置对话框窗口的大小和位置,这可以在

151505183.doc7-5

OnInitDialog()中通过调用MoveWindow()来实现。再添加一些变量的声名和初始化,即可编译运行。图2为运行结果例如:

图2

4.进一步的探讨

前面实现了单一模式的异形对话框,但有些状况下又需要不同的样式,如有标题栏、边框等,或者只作局部的处理,这就是前面两个成员变量m_FrameWidth和m_CaptionHeight作用,通过在OnInitDialog()判断窗口样式,使m_FrameWidth和m_CaptionHeight取不同的值。这部分的代码为:

BOOLCTransBmpDlg::OnInitDialog(){??

//TODO:Addextrainitializationherem_nFirstRun=1;

//数据设置,窗口左上角坐标:m_Left=0,m_Top=0//背景位图宽高:m_Width=535,m_Height=105

SetSize(0,0,535,105);

//蒙板处理区域与窗口边框的距离

m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;

//窗口边框与标题栏象素值

m_FrameWidth=m_CaptionHeight=0;

//取得窗口样式

LONGstyle

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论