清泛IT社区

搜索
App Inventor 2 中文社区 轻松创建Apps

扫码访问移动社区 移动社区,您的掌上技术专家

关注我,精彩不错过! 关注我,精彩不错过!

扫码安装最新版AI伴侣 最新版AI伴侣v2.69

Aia Store .aia 源码一站式解决方案 发布日志AI2连接测试ai2Starter模拟器

开通VIP送小红花App Inventor 2 拓展有奖征文 VIP会员享专有教程,免费赠送基础版*技术支持服务! AI2入门必读中文文档中文教程IoT专题

查看: 377|回复: 0
打印 上一主题 下一主题

截图软件截图区域以外背景变灰的实现--AlphaBlend

  • TA的每日心情
    开心
    2024-03-14 20:36
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    70

    主题

    117

    帖子

    1365

    积分

    金牌会员

    Rank: 6Rank: 6

    积分
    1365
    跳转到指定楼层
    楼主
    发表于 2015-01-20 09:53:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    OnPaint()方法中:
                 // ------------画黑色背景----------------
                            COLORREF bgColor = RGB(0, 0, 0);
                            char alpha = (255 * 30) / 100;
                            int screenX = GetSystemMetrics(SM_CXSCREEN);
                            int screenY = GetSystemMetrics(SM_CYSCREEN);

                            CDC memdc;
                            memdc.CreateCompatibleDC(&dc);
                            CBitmap bmp, *pOldBitmap;
                            bmp.CreateCompatibleBitmap(&dc, screenX, screenY);
                            pOldBitmap = memdc.SelectObject(&bmp);
                            // 拷贝背景位图到内存DC
                            memdc.BitBlt(0, 0, screenX, screenY, &dc, 0, 0, SRCCOPY);

                            CRgn rgnScreen, rgnTracker;
                            rgnScreen.CreateRectRgn(0, 0, screenX, screenY);
                            CRect rect = m_rectTracker.m_rect;
                            rect.DeflateRect(-1, -1, -1, -1);
                            rgnTracker.CreateRectRgn(rect.left, rect.top, rect.right, rect.bottom);
                            
                            // 屏幕区域减去截图区域
                            rgnScreen.CombineRgn(&rgnScreen, &rgnTracker, RGN_DIFF);

                            CBrush brush;
                            brush.CreateSolidBrush(bgColor);
                            // 指定区域填充背景色
                            memdc.FillRgn(&rgnScreen, &brush);
                            brush.DeleteObject();

                            BLENDFUNCTION bf;
                            bf.BlendOp = AC_SRC_OVER;
                            bf.BlendFlags = 0;
                            bf.SourceConstantAlpha = alpha;
                            bf.AlphaFormat = 0;
                            // 内存DC透明映射到绘图DC
                            dc.AlphaBlend(0,0,screenX,screenY,&memdc,0,0,screenX,screenY,bf);
                            memdc.SelectObject(pOldBitmap);

    效果图:



    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2024 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2024-05-19 18:13 , Processed in 0.014572 second(s), 31 queries .