VC编程之VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规)
小标 2018-11-15 来源 : 阅读 1344 评论 0

摘要:本文主要向大家介绍了VC编程之VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规),通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规),通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规)

目标不规则窗体也称为异型窗体,像迅雷的飞鸟型窗体就是啦。这篇文章就是要实现这样的窗体。计划&方案根据上一篇文章继续扩展。我们有几种方案实现不规则窗体。迅雷就是用一张图片作为窗体的形状,那么图片的类型我们也要考虑进来。现在是png图片的天下,自带背景透明;对于bmp图片,需要程序处理一下。对于常规图形如圆形,只需要SetWindowRgn就可以搞定。对于复杂图形,需要用一点技巧来做。下面用例子来演示圆形和复杂图形的不规则窗体。关于SetWindowRgn,参见官方文档。实践一、 圆形窗体这里还要借助另一个类CRgn,它作为SetWindowRgn的主要参数,通过CreateEllipticRgn方法初始化出圆形区域。具体代码如:    CRgn rgn;

    rgn. CreateEllipticRgn(0,0,96,96);
    SetWindowRgn(rgn,TRUE);接下来封装一个方法来加载png图片:void ShowPicture()
{
    CImage img;    
    HRESULT result = img.Load(_T("prime.png")); 
    //加强透明化
    for(int i = 0; i < img.GetWidth(); i++)  
    {  
        for(int j = 0; j < img.GetHeight(); j++)  
        {  
            unsigned char* pucColor = reinterpret_cast

(img.GetPixelAddress(i , j));  
            pucColor[0] = pucColor[0] * pucColor[3] / 255;  
            pucColor[1] = pucColor[1] * pucColor[3] / 255;  
            pucColor[2] = pucColor[2] * pucColor[3] / 255;  
        }  
    }     
    CDC *pDC = GetWindowDC();
    int nX = img.GetWidth();
    int nY = img.GetHeight();

    img.Draw( pDC->m_hDC,0,0); 
    ReleaseDC( pDC );
}二、 复杂图形窗体引用vckbase的文章《Windows 中不规则窗体的编程实现》中“根据图像创建region”一节。技巧:选一种图片中没有的颜色作为背景色(文章中用蓝色),程序将扫描图片的每一个像素,如果不是背景色,那么就在此位置创建此像素的region,然后把所有这样的region合并起来构成图片,就好像去掉了背景色一样,成为背景透明。这里又用到一个合并region的api  CombineRgn:int CombineRgn( 
   CRgn* pRgn1, 
   CRgn* pRgn2, 
   int nCombineMode  
);合并的模式我们选择完全合并:RGN_OR   Combines both regions in their entirety (union).例子如下:void CAfoatWindowMessageDlg::SetupRegion(
    CDC *pDC, //DC of this window
    CBitmap &cBitmap, 
    COLORREF TransColor //the color need remove
    )
{    CDC memDC;
    //temporary DC
    memDC.CreateCompatibleDC(pDC);

    CBitmap *pOldMemBmp=NULL;
    //Load bmp file
    pOldMemBmp=memDC.SelectObject(&cBitmap);
   
    CRgn wndRgn; // window region
    //window region init
    wndRgn.CreateRectRgn(0,0,0,0);
 
    BITMAP bit;   
    cBitmap.GetBitmap (&bit);//get the value of bmp file    
   
    int y;
    for(y=0;y<=bit.bmHeight  ;y++)
    {
     CRgn rgnTemp; //temporary region            
        int iX = 0;
        do
        {
            //skip TransColor
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) == TransColor)
                iX++;

            //record this point
            int iLeftX = iX;

            //Skip none transColor
            while (iX <= bit.bmWidth  && memDC.GetPixel(iX, y) != TransColor)
                ++iX;

            //create temporary “region”
            rgnTemp.CreateRectRgn(iLeftX, y, iX, y+1);

            //combine "region".
            wndRgn.CombineRgn(&wndRgn, &rgnTemp, RGN_OR);
                
      //delete temporary "region"
            rgnTemp.DeleteObject();
        }while(iX <bit.bmWidth );
        iX = 0;
    }

    if(pOldMemBmp)
        memDC.SelectObject(pOldMemBmp);
    
    CWnd * pWnd = pDC->GetWindow();
    pWnd->SetWindowRgn(wndRgn,TRUE);    
    pWnd->SetForegroundWindow();    
}源码在此!通过对比,用常规方法都会产生锯齿,如何消除锯齿?引出我的下文,用GDI+实现完美不规则窗体。

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程