MFC异形窗体控件设计

4 篇文章 0 订阅

        传统的MFC窗口和控件对于任何人都比较熟悉,但是怎样才能够让人们感觉到设计的程序能够引起注意并吸引眼球呢,那就是设计异形窗口和控件,给人一种新颖的感觉。本片文章就是介绍怎么设计异形窗口和控件。

        何谓异形窗口和控件,传统的窗口和控件基本上都是矩形范畴的。现在就是在之前的应用基础上设计透明,半透明,不规则形状,添加不规则的图片等方法,从而提升应用的效果。

1.创建矩形区域

        函数原型:HRGN CreateRectRgn( int nLeftRect, int nTopRect,  int nRightRect,  int nBottomRect);     //CRgn类中也存在此成员函数

        参数含义:

        int nLeftRect:指定区域的左上角的x坐标。

        int nTopRect:指定区域的左上角的y坐标。

        int nRightRect:指定区域的右下角的x坐标。

        int nBottomRect:指定区域的右下角的y坐标。

2.创建圆角矩形

        函数原型:HRGN CreateRoundRectRgn(int nLeftRect,int nTopRect,int nRightRect,int nBottomRect,int nWidthEllipse, int nHeightEllipse);    //CRgn类中也存在此成员函数

        参数含义:

        int nLeftRect:指定区域的左上角的x坐标。

        int nTopRect:指定区域的左上角的y坐标。

        int nRightRect:指定区域的右下角的x坐标。

        int nBottomRect:指定区域的右下角的y坐标。

        int nWidthEllipse:指定创建圆角的宽度。

        int nHeightEllipse:指定创建圆角的高度。

3.合并两个区域

        函数原型:int CombineRgn( HRGN hrgnDest, HRGN hrgnSrc1, HRGN hrgnSrc2,  int fnCombineMode);    //CRgn类中也存在此成员函数

        参数含义:

        HRGN hrgnDest:两个区域合并后的区域句柄

        HRGN hrgnSrc1合并前的区域。

        HRGN hrgnSrc2:合并前的区域。

        int fnCombineMode:区域合并的模式(详细请参照MSDN)

4.设置窗口的形状

        函数原型:int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw);

        参数含义:

        HWND hWnd:需要裁减的窗口句柄。

        HRGN hRgn:设置的窗口区域,如果是NULL,那么就没有处理区域。

        BOOL bRedraw:指定是否设置窗口后重绘窗口,如果窗口是可见的建议设置为TRUE。

        通过调用SetWindowRgn裁减窗口的大小,但是与原始窗口相比,它只是设置了一个窗口的区域,只有包含在这个区域内的地方才会被重绘,而不在区域内的部分系统将不会显示。

5.设置窗口的透明度(透明/半透明)

        函数原型:BOOL WINAPI SetLayeredWindowAttributes(HWND hWnd,  COLORREF crKey,  BYTE bAlpha,  DWORD flag);

        参数含义:

       HWND hWnd::设置透明度的窗口句柄。

       COLORREF crKey::掩码颜色,当flag取值为LWA_COLORKEY时,窗口中颜色值等于crKey的地方将变为全透明。否则此参数无效。

       BYTE bAlpha:窗口的透明度,取值范围0~255,当flag含有LWA_ALPHA标识时有效。

       DWORD flag: 透明方式,可取两个值:LWA_COLORKEY(0x1)和LWA_ALPHA(0x2)可取二者的组合。

       在MFC中的调用方法:SetLayeredWindowAttributes(m_hWnd, RGB(0, 0, 0), 200, 0x1 | 0x2);

 

       需要注意的是,在VC6.0中,头文件没有这个函数的声明,因此只能采用以下方法先加载含有此函数的DLL模块,然后寻找到该函数入口地址再调用之。
       HMODULE hUserWnd = LoadLibrary("user32.dll");
       if(hUserWnd)
       {
               typedef BOOL (WINPAI*SETALPHA)(HWND, COLORREF, BYTE, DWORD); //定义函数指针类型
               SETALPHA SetAlpha = (SETALPHA)GetProcAddress(hUserWnd, "SetLayeredWindowAttributes");
               if(SetAlpha)

              {
                        SetAlpha(m_hWnd, RGB(0, 0, 0), 200, 0x1 | 0x2);

              }

               FreeLibrary(hInst);
       }

6.更新分层窗口的大小,形状,位置,内容和透明度

       分层窗口的含义:通过CreateWindowEx函数创建窗口时,指定窗口的属性是WS_EX_LAYERED。

       其中在Windows8系统,WS_EX_LAYERED样式支持顶层窗口和子窗口。

       Windows8之前的Windows版本支持WS_EX_LAYERED只为顶层窗口。

 

       函数原型:BOOL WINAPI UpdateLayeredWindow( HWND hwnd, HDC hdcDst, POINT *pptDst, SIZE *psize, HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend, DWORD dwFlags);

       参数含义:

       HWND hwnd:分层窗口的句柄。

       HDC hdcDst:屏幕的DC句柄,用于调色板配色时窗口内容更新,如果设置为NULL,默认调色板将被使用,如果hdcSrc为NULL,hdcDst必须为NULL。

       POINT *pptDst:指定了分层窗口新的位置,如果位置不发生变化,hdcDst可以为NULL。

       SIZE *psize:指定了新的分层窗口的大小,如果窗口的位置不会改变可以设置为NULL,如果hdcSrc为NULL,psize必须为NULL。

       HDC hdcSrc:分层窗口界面的DC句柄,如果该窗口的形状等没有发生改变可以设置为NULL。

       POINT *pptSrc:指示分层窗口的位置。如果hdcSrc为NULL,那么pptSrc也因该是NULL。

       COLORREF crKey:指定分层窗口要使用的颜色键。要生成一个COLORREF,可以使用RGB宏。

       BLENDFUNCTION *pblend:指定分层窗口要使用的透明度。

       DWORD dwFlags:分层窗口的标识,详细请参照MSDN。

 

       调用例子:

       CPoint ImagePoint(0,0);
       CClientDC ClientDC(this);

       BLENDFUNCTION BlendFunction;
       ZeroMemory(&BlendFunction,sizeof(BlendFunction));

       BlendFunction.BlendOp=0;
       BlendFunction.BlendFlags=0;
       BlendFunction.AlphaFormat=AC_SRC_ALPHA;
       BlendFunction.SourceConstantAlpha=cbAlpha;

       CImage ImageBuffer;
       ImageBuffer.Create(Image.GetWidth(),Image.GetHeight(),32);

       CImageDC ImageDC(ImageBuffer);
       CDC * pDCImage=CDC::FromHandle(ImageDC);

       ASSERT(pDCImage!=NULL);
       if (pDCImage!=NULL) Image.DrawImage(pDCImage,0,0);


       BITMAP Bitmap;
       ZeroMemory(&Bitmap,sizeof(Bitmap));
       CBitmap * pBitmap=pDCImage->GetCurrentBitmap();
       if (pBitmap!=NULL) pBitmap->GetBitmap(&Bitmap);

       CSize SizeImage;
       SizeImage.SetSize(Bitmap.bmWidth,Bitmap.bmHeight);
       ASSERT((SizeImage.cx>0)&&(SizeImage.cy>0));
       if ((SizeImage.cx==0)||(SizeImage.cy==0)) return;


       UpdateLayeredWindow(&ClientDC,NULL,&SizeImage,pDCImage,&ImagePoint,0L,&BlendFunction,ULW_ALPHA);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值