今天客户需要在软件上需要添加一个自己公司的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函数需要加载这个类库。

TransparentBlt函数的使用注意事项的更多相关文章

  1. 程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)

    主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static ...

  2. memset函数用法及注意事项

    头文件 #include<cstring>// or #include<memory.h> ------------------------------------------ ...

  3. C++ vector erase函数的使用注意事项

    最近使用了顺序容器的删除元素操作,特此记录下该函数的注意事项. 在C++primer中对c.erase(p) 这样解释的:  c.erase(p)    删除迭代器p所指向的元素,返回一个指向被删元素 ...

  4. Linux system 函数的一些注意事项

    在日常的代码编程中 , 我们可以利用system  函数去调用一些我们自己想调用的命令 , 并获取他的返回值. 函数的原型如下: int system(const char *command); 上一 ...

  5. Python的内置函数open()的注意事项

    用法 : open("file_address","open_mode")例子 : f = open("D:\PycharmProjects\log. ...

  6. 【C】——使用creat()函数需要注意的事项

    #include<fcntl.h> int creat(const char *pathname, mode_t mode); 若成功则返回为只写打开的文件描述符,若出错则返回-1: 有时 ...

  7. Java String.split()函数分隔回车注意事项

    作者:Sun1956 原文:https://blog.csdn.net/sun1956/article/details/45096117 --------------------- 我们在Java中如 ...

  8. sql强大的行转列功能(内置函数pivot及注意事项)

    语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) ) ...

  9. 79)PHP,session函数编写的注意事项

    (1)先执行  session_set_save_handler()  在session_start(). (2)那么开启session_start(),有两种方法,一个就是session_start ...

随机推荐

  1. 3款强大的BootStrap的可视化制作工具推荐

    http://www.25xt.com/html5css3/7342.html 25学堂看到最近很多朋友在学习Bootstrap前端主题框架.顾让25学堂的小编给大家找来了3款适合Bootstrap初 ...

  2. minify合并js和css文件

    压缩 JavaScript 和 CSS,是为减少文件大小,节省流量开销:合并 JavaScript 和 CSS,是为了减少请求数量,减轻服务器压力.而这些枯燥又没有技术含量的工作,我们以前通常会手动处 ...

  3. Java_Hbase Timeout issue

    设置参数hbase.rpc.timeout <property><name>hbase.regionserver.lease.period</name><va ...

  4. Apache以及PHP的默认编码问题解决(详解)

    如果你在网上搜索 “apache配置”,搜到的页面大多都会建议你在httpd.conf中加上这么一句:AddDefaultCharset GB2312.对于新手而且是只用GB2312编码的开发人来说, ...

  5. mysql中 case when的使用

    SELECT a.hsid, a.house_code, a.sale_date, a.pjid, COUNT( sdid ) AS num, b.hsid, b.pscid, b.hscode, b ...

  6. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  7. Calendar Game

    http://poj.org/problem?id=1082 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4820   A ...

  8. cocos2d-x混合BlendFunc的使用

    1.什么是混合模式 “混合”是指两种颜色的叠加方式.在新图片将要渲染画到屏幕上的时候,将用在新图片中的红.绿.蓝和透明度信息,与屏幕上已经存在的图片颜色信息相融合. 说的具体一点,就是把某一像素位置上 ...

  9. iOS银行卡合法性校验

    项目中用到了校验银行卡,就拿来贴上来了 + (BOOL)checkCardNo:(NSString*)cardNo;//判断银行卡 + (BOOL)checkCardNo:(NSString*)car ...

  10. Android之ListView常用技巧

    ListView是一个非常常用的列表控件,虽然在5.x时代ListView的风头正在逐渐的被RecyclerView抢去,但是ListView的使用范围依然十分广泛. 接下来的ListView的常用技 ...