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<unsigned char *>

(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+实现完美不规则窗体。

时间: 2024-11-03 18:03:27

VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规)的相关文章

VC++玩转炫酷悬浮窗1---悬浮窗的实现

?? 目标实现像迅雷那样炫酷的悬浮窗.计划&方案首先第一步要实现一个悬浮窗,窗体无边框,能够随意拖动.对于一个窗体来说,只有我们把鼠标放到标题栏中才进入到拖拽模式.由于是无边框的窗体,默认是不能够移动的.我们尝试用两种办法使其跟随鼠标移动.一个是用OnNcHitTest函数,另一个是在OnLButtonDown时发消息.实践一. OnNcHitTest方案这个CWnd类的一个方法,我们可以捕捉鼠标点击的坐标,然后将其HTCLIENT结果偷换成HTCAPTION,这样就可以让系统误以为鼠标左键点击

VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体

?? 目标上一篇不规则窗体虽然实现了,但是图形有锯齿,给人以上世纪的老古董感觉,跟酷炫不搭边.今天就要用高级一些的技术做出完美的光滑的无锯齿的不规则窗体.计划&方案PNG图片本身就是带透明效果的,把此图片作为窗体,用GDI+将其实现.那么什么是GDI+呢?先要说一说GDI, Graphics Devices Interface,图形设备接口,负责系统与绘图程序之间的信息交换,处理所有Windows图形程序的输出.而GDI+是其增强版,xp时代是其一个子系统,负责在显示屏幕和打印设备输出信息.程序

Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

Android 自定义控件玩转字体变色 打造炫酷ViewPager指示器

Android 悬浮窗各机型各系统适配大全

这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时,感兴趣或者找到其他机型适配方法的请留言告诉我,或者加群544645972一起交流一下,非常感谢~ 相关权限请看我的另一篇博客:android permission权限与安全机制解析(下),或者关于权限的案例使用:android WindowManager解析与骗取QQ密码案例分析. 转载请注明出处

关于MIUI悬浮窗权限问题的解决方案

先扯会....好久没写Blog了....这段时间有点小忙...瞎忙.....忙的自己都感觉都不应该.....严重影响了生活质量......生活的幸福指数!!!.....到现在还特么的单身!!!求介绍啊...... MIUI是我个人非常喜欢的ROM....虽然有诸多的不爽....但是搞开发就能理解.....写好一个产品是多么的不易.....好多东西的不可控....精力的有限! 现在买手机都看能不能刷MIUI..不能刷的就犹豫了..... ===============盗链....盗内容的都是Erb

8个超炫酷仿HTML5动画源码

1.jQuery万年历插件 带农历老皇历功能 这是一款基于jQuery的日历插件,这款日历插件和之前分享的日历控件有很大差异,它是一本万年历,包含了农历已经老皇历的功能,是一个挑好日子的工具.同时日历还可以查看本年度的放假安排,功能非常强大.有兴趣的朋友可以下载学习. 在线演示 源码下载 2.CSS3发光进度条动画 超炫酷的样式 这次我们要来分享一款非常炫酷的CSS3进度条动画,其样式风格类似于星球大战里面的那些激光剑效果.页面初始化时,可以设定进度条的值,但是我们也可以利用其配套的借口来动态改

11个炫酷的Linux终端命令大全

导读 今天给大家分享用了十年的Linux总结出来的11个炫酷的Linux终端命令大全,通过今天这篇文章我将向大家展示一系列的Linux命令.工具和技巧,希望能够帮助到大家. 1.命令行日常快捷键 如下的快捷方式非常有用,能够极大的提升你的工作效率: CTRL + U 剪切光标前的内容 CTRL + K 剪切光标至行末的内容 CTRL + Y 粘贴 CTRL + E 移动光标到行末 CTRL + A 移动光标到行首 ALT + F 跳向下一个空格 ALT + B 跳回上一个空格 ALT + Bac

超炫酷的jQuery/HTML5应用效果及源码

jQuery非常强大,我们之前也用jQuery分享过很多实用的插件.HTML5可以让网页变得更加绚丽多彩,将HTML5和jQuery结合使用那将发挥更棒的效果. 今天向大家收集了一些关于HTML5和jQuery的应用及其源码,一起来看看. HTML5动感的火焰燃烧动画特效 这又是一款基于HTML5的超炫动画特效,是一款动感的火焰燃烧动画效果.这款HTML5动画火焰燃烧非常逼真. 核心jQuery代码: $( document ).ready(function() { // Set canvas

炫酷的手风琴效果

你一定用过书签,也一定给你的书本加过书签,那么你见过书签式的导航吗? 你一定见过手风琴,也一定知道弹奏手风琴时的它的外形变化,那么你见过手风琴式的导航吗? 如果没有,请往下看: 前面的话: 这篇博文先通过Javascript做一个简单的手风琴效果,让大家对手风琴效果有一定的了解:紧接着,我们换jquery做类似的手风琴效果.前面的两个例子都很简单,接下来要放大招了,我想用JQ或是原生的JS去做类似淘宝网中用到的手风琴效果.继续回到书签问题,既然JQ和JS都能实现那么炫酷的效果,我们用CSS3能不