给你的程序扮酷.doc_第1页
给你的程序扮酷.doc_第2页
给你的程序扮酷.doc_第3页
给你的程序扮酷.doc_第4页
全文预览已结束

下载本文档

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

文档简介

给你的程序扮酷蒋智这是一个扮酷的年代,有人把自己的头发染黄,有人把自己的身体绣花,作为编程者的你,有没有想过要把自己所编程序的窗口界面装扮得跟别人的程序不一样,甚至不是一个矩形,让用户过目不忘,比如设计成周润发的脸的形状或者周润发手中那把枪的形状,也许你会问这能做到吗,会不会很难,答案是非常简单,WINDOWS已经为你做好了所有的准备工作,让我们来了解一下它的工作原理,先去网上找一幅你认为足够酷的图片绘在程序窗口中,然后根据图片的形状和尺寸量身定做程序窗口的形状和尺寸,使程序窗口与图片配合得天衣无缝,以达到酷的效果。 下面让我们来实战一下吧: 1、在VC+中新建一个对话框类型的项目(用单文档类型也大同小异),设置对话框的属性,将其设置为无标题栏、无边框,再把要绘在窗口中的图片添加到位图资源中,设置其ID号为“IDB_BITMAP”。 2、在对话框窗口类中添加一个位图类成员变量:CBitmap m_Bitmap; 3、在对话框的OnInitDialog()函数中设置程序的窗口区域的形状和尺寸,对此WINDOWS已经为我们做了一些准备工作,如果要设置程序的窗口区域,可以通过使用WindowsAPI函数SetWindowRgn(),它可以将窗口的显示区域和窗口的鼠标响应区域限定在窗口的某些局部区域,注意不要试图用SetWindowRgn()函数将区域设置在原窗口之外。SetWindowRgn()函数的使用比较简单,其定义如下:int SetWindowRgn(HWND hWnd, /所要设置区域的窗口句柄HRGN hRgn, /所要设置的区域句柄BOOL bRedraw /调用本函数后是否重绘窗口); 其中关键的参数是所要设置的区域句柄,区域句柄怎么产生呢?Windows中有不少创建区域句柄的API函数:/创建矩形窗口区域HRGN CreateRectRgn(int x1, int y1, int x2, int y2);/创建椭圆窗口区域HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2);/创建多边形窗口区域HRGN CreatePolygonRgn(CONST POINT * lpPoints, int nCount, int nMode); 也许你会担心,你要创建的窗口区域根本不是规则的形状,该怎么办呢?不用担心,Windows还为你准备了一个API函数:int CombineRgn(HRGN Rgn1, HRGN Rgn2, HRGN Rgn3, int nCombineMode);它可以将两个区域合并产生一个新的区域,其中参数Rgn2和Rgn3为用来合并的区域句柄,参数Rgn1为合并后产生的新区域句柄,你还可以通过参数nCombineMode设置合并的模式,具体有如下几种合并模式:#define RGN_AND 1 /Rgn1为Rgn2和Rgn3两区域逻辑与,即两区域的交集#define RGN_OR 2 /Rgn1为Rgn2和Rgn3两区域逻辑或,即两区域的并集#define RGN_XOR 3 /Rgn1为Rgn2和Rgn3两区域逻辑异与,即两区域的并集减去交集#define RGN_DIFF 4 /Rgn1为Rgn2区域减去Rgn2和Rgn3两区域交集,即在Rgn2中但不含Rgn3的区域#define RGN_COPY 5 /Rgn1为Rgn2区域的复制#define RGN_MIN RGN_AND /同区域逻辑与#define RGN_MAX RGN_COPY /同区域复制 你可以根据窗口区域形状的不同采用不同的创建区域句柄函数及不同的合并模式,我采取的方法是,先根据图片的尺寸大小用CreateRectRgn()函数创建一个矩形区域,然后逐行扫描图片,找出作为背景色的区域,用CreateRectRgn()函数创建一段段线状区域,再将两者用RGN_DIFF模式合并,去除图片的背景色区域,得出实际的图片形状区域。具体代码如下:BOOL CWndRgnDlg:OnInitDialog()./VC+自动生成的代码省略/ TODO: Add extra initialization here/因为窗口没有标题栏,如果你不想在任务栏上显示为空白,需加上下面这行代码。SetWindowText(我的程序酷不酷);/加载位图资源m_Bitmap.LoadBitmap(IDB_BITMAP);BITMAP bm;/填写BITMAP结构,以便获取位图大小m_Bitmap.GetObject(sizeof(BITMAP), &bm );/获取窗口视频设备上下文CDC *pDC=GetWindowDC();CDC MemDC;/创建一个与视频设备上下文兼容的位图设备上下文MemDC.CreateCompatibleDC(pDC);CBitmap *pOldBitmap;/将CBitmap对象选入最新创建的设备上下文中,并保存指向旧位图的指针pOldBitmap=(CBitmap *)MemDC.SelectObject(&m_Bitmap);/*下面三行代码是将窗口尺寸设置为与图片一致,位置在桌面中央,当窗口默认尺寸比图片尺寸大时不一定要设置两者尺寸一致,但是当窗口默认尺寸比图片尺寸小时则一定要设置窗口尺寸,否则图片会被裁掉。*/int cx=:GetSystemMetrics(SM_CXSCREEN)/2;int cy=:GetSystemMetrics(SM_CYSCREEN)/2;MoveWindow(cx-bm.bmWidth/2,cy-bm.bmHeight/2,bm.bmWidth,bm.bmHeight);/定义窗口区域句柄和背景色区域句柄HRGN WndRgn,BkRgn;/根据图片的尺寸创建一个矩形区域句柄WndRgn=CreateRectRgn(0,0,bm.bmWidth,bm.bmHeight);int x,y,left=-1,right;/设置图片中的背景颜色为白色,你可以根据需要自己定义。COLORREF BkColor=RGB(255,255,255);COLORREF Color;for(y=0;y=bm.bmHeight;y+)/逐行扫描图片 for(x=0;xm_hWnd,WndRgn,TRUE);/上面这一行代码可以用CWnd类中的同名成员函数代替如下:/SetWindowRgn(WndRgn,TRUE);return TRUE; / return TRUE unless you set the focus to a control4、在对话框的OnPaint()函数中绘制图片,具体代码如下:void CWndRgnDlg:OnPaint() ./VC+自动生成的代码省略ElseBITMAP bm;m_Bitmap.GetObject(sizeof(BITMAP), &bm );CDC *pDC=GetWindowDC();CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap *pOldBitmap;pOldBitmap =(CBitmap *)MemDC.SelectObject(&m_Bitmap);/绘制位图到窗口pDC-BitBlt( 0, 0, bm.bmWidth, bm.bmHeight, &MemDC,0, 0, SRCCOPY );MemDC.SelectObject(pOldBitmap);CDialog:OnPaint();5、因为窗口没有标题栏,所以不能将窗口在桌面上拖动,如果想要拖动窗口的话,则需要拦截WM_NCHITTEST消息,在其中添加处理代码,该消息函数不能通过ClassWizard自动产生,所以必须手工添加消息映射代码。、在对话框窗口类头文件中加入WM_NCHITTEST消息处理函数的定义afx_msg UINT OnNcHitTest(CPoint point);、在对话框窗口类实现文件中加入WM_NCHITTEST消息映射宏BEGIN_MESSAGE_MAP(CWndRgnDlg, CDialog)/AFX_MSG_MAP(CWndRgnDlg).ON_WM_NCHITTEST()/AFX_MSG_MAPEND_MESSAGE_MAP()、在对话框窗口类实现文件中

温馨提示

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

评论

0/150

提交评论