zoukankan      html  css  js  c++  java
  • TransparentBlt函数的使用注意事项

      今天客户需要在软件上需要添加一个自己公司的Logo,要求使用镂空透明的形式展现,本来以为很简单的工作没想到在MFC下这么复杂。
    Logo为BMP格式,白色背景。

      以为和在按钮上显示控件差不多,先导入BITMAP资源,比如叫IDB_BITMAP1,按钮名比如叫IDC_BUTTON1,
    按钮上贴图的代码:
    CBitmap m_bmp;
    m_bmp.LoadBitmap(IDB_BITMAP1);
    HBITMAP hBitmap = (HBITMAP)m_bmp.GetSafeHandle();
    ((CButton*)GetDlgItem(IDC_BUTTON1))->SetBitmap(hBitmap);

      本来以为和Delphi里面的按钮一样,设置熟悉为Transparent以后会自动根据BMP图片左上角的像素颜色作为透明色,结果是让人失望的。
    这个属性只有在显示文字时有用。

      无奈只好派生CStatic类重载OnPaint函数,在函数里使用TransparentBlt将白色设置为透明色。

    代码大致如下:

    CPaintDC dc(this);
    CDC memDc;
    memDc.CreateCompatibleDC(&dc);
    BITMAP bm;
    m_bitmap.GetBitmap(&bm);
    memDc.SelectObject(&m_bitmap);
    dc.TransparentBlt(10, 10, bm.bmWidth, bm.bmHeight, &memDc, 0, 0, bm.bmWidth, bm.bmHeight, RGB(255, 255, 255));

      修改完成后运行程序,居然显示不出图像,怎么回事?改为BitBlt测试一切正常。经过调试后发现原来是TransparentBlt参数的问题。
    原来TransparentBlt的倒数第2,3个参数必须小于图片实际大小,这个行为和BitBlt不同,需要格外注意。修改完成后,运行达到要求。

      忘了还有,#pragma comment( lib, "msimg32.lib" )TransparentBlt函数需要加载这个类库。

  • 相关阅读:
    html页面自适应宽度
    Angularjs Select获取数组下标
    spring boot集成mybatis分页插件
    百度分享实现https
    nginx自定义错误页面
    nginx代理tomcat
    Nginx配置SSL证书
    Nginx安装
    xmlns:amq="http://activemq.apache.org/schema/core"报错
    ActiveMQ
  • 原文地址:https://www.cnblogs.com/cartler/p/3287797.html
Copyright © 2011-2022 走看看