void DrawTransparentBitmap(HDC  hdc,  HBITMAP  hBitmap,  short  xStart,  short  yStart,  COLORREF  cTransparentColor);

函数的实现:

void CLoginPanel::DrawTransparentBitmap(HDC  hdc,  HBITMAP  hBitmap,  short  xStart,  short  yStart,  COLORREF  cTransparentColor)  
     {  
     BITMAP          bm;  
     COLORREF      cColor;  
     HBITMAP        bmAndBack,  bmAndObject,  bmAndMem,  bmSave;  
     HBITMAP        bmBackOld,  bmObjectOld,  bmMemOld,  bmSaveOld;  
     HDC                hdcMem,  hdcBack,  hdcObject,  hdcTemp,  hdcSave;  
     POINT            ptSize;  
 
     hdcTemp  =  CreateCompatibleDC(hdc);  
     SelectObject(hdcTemp,  hBitmap);      //  Select  the  bitmap  
 
     GetObject(hBitmap,  sizeof(BITMAP),  (LPSTR)&bm);  
     ptSize.x  =  bm.bmWidth;                        //  Get  width  of  bitmap  
     ptSize.y  =  bm.bmHeight;                      //  Get  height  of  bitmap  
     DPtoLP(hdcTemp,  &ptSize,  1);            //  Convert  from  device  
 
                                                                         //  to  logical  points  
 
     //  Create  some  DCs  to  hold  temporary  data.  
     hdcBack      =  CreateCompatibleDC(hdc);  
     hdcObject  =  CreateCompatibleDC(hdc);  
     hdcMem        =  CreateCompatibleDC(hdc);  
     hdcSave      =  CreateCompatibleDC(hdc);  
 
     //  Create  a  bitmap  for  each  DC.  DCs  are  required  for  a  number  of  
     //  GDI  functions.  
 
     //  Monochrome  DC  
     bmAndBack      =  CreateBitmap(ptSize.x,  ptSize.y,  1,  1,  NULL);  
 
     //  Monochrome  DC  
     bmAndObject  =  CreateBitmap(ptSize.x,  ptSize.y,  1,  1,  NULL);  
 
     bmAndMem        =  CreateCompatibleBitmap(hdc,  ptSize.x,  ptSize.y);  
     bmSave            =  CreateCompatibleBitmap(hdc,  ptSize.x,  ptSize.y);  
 
     //  Each  DC  must  select  a  bitmap  object  to  store  pixel  data.  
     bmBackOld      = (HBITMAP)SelectObject(hdcBack,  bmAndBack);  
     bmObjectOld  =  (HBITMAP)SelectObject(hdcObject,  bmAndObject);  
     bmMemOld        = (HBITMAP)SelectObject(hdcMem,  bmAndMem);  
     bmSaveOld      = (HBITMAP)SelectObject(hdcSave,  bmSave);  
 
     //  Set  proper  mapping  mode.  
     SetMapMode(hdcTemp,  GetMapMode(hdc));  
 
     //  Save  the  bitmap  sent  here,  because  it  will  be  overwritten.  
     BitBlt(hdcSave,  0,  0,  ptSize.x,  ptSize.y,  hdcTemp,  0,  0,  SRCCOPY);  
 
     //  Set  the  background  color  of  the  source  DC  to  the  color.  
     //  contained  in  the  parts  of  the  bitmap  that  should  be  transparent  
     cColor  =  SetBkColor(hdcTemp,  cTransparentColor);  
 
     //  Create  the  object  mask  for  the  bitmap  by  performing  a  BitBlt  
     //  from  the  source  bitmap  to  a  monochrome  bitmap.  
     BitBlt(hdcObject,  0,  0,  ptSize.x,  ptSize.y,  hdcTemp,  0,  0,  
                   SRCCOPY);  
 
     //  Set  the  background  color  of  the  source  DC  back  to  the  original  
     //  color.  
     SetBkColor(hdcTemp,  cColor);  
 
     //  Create  the  inverse  of  the  object  mask.  
     BitBlt(hdcBack,  0,  0,  ptSize.x,  ptSize.y,  hdcObject,  0,  0,  
                   NOTSRCCOPY);  
 
     //  Copy  the  background  of  the  main  DC  to  the  destination.  
     BitBlt(hdcMem,  0,  0,  ptSize.x,  ptSize.y,  hdc,  xStart,  yStart,  
                   SRCCOPY);  
 
     //  Mask  out  the  places  where  the  bitmap  will  be  placed.  
     BitBlt(hdcMem,  0,  0,  ptSize.x,  ptSize.y,  hdcObject,  0,  0,  SRCAND);  
 
     //  Mask  out  the  transparent  colored  pixels  on  the  bitmap.  
     BitBlt(hdcTemp,  0,  0,  ptSize.x,  ptSize.y,  hdcBack,  0,  0,  SRCAND);  
 
     //  XOR  the  bitmap  with  the  background  on  the  destination  DC.  
     BitBlt(hdcMem,  0,  0,  ptSize.x,  ptSize.y,  hdcTemp,  0,  0,  SRCPAINT);  
 
     //  Copy  the  destination  to  the  screen.  
     BitBlt(hdc,  xStart,  yStart,  ptSize.x,  ptSize.y,  hdcMem,  0,  0,  
                   SRCCOPY);  
 
     //  Place  the  original  bitmap  back  into  the  bitmap  sent  here.  
     BitBlt(hdcTemp,  0,  0,  ptSize.x,  ptSize.y,  hdcSave,  0,  0,  SRCCOPY);  
 
     //  Delete  the  memory  bitmaps.  
     DeleteObject(SelectObject(hdcBack,  bmBackOld));  
     DeleteObject(SelectObject(hdcObject,  bmObjectOld));  
     DeleteObject(SelectObject(hdcMem,  bmMemOld));  
     DeleteObject(SelectObject(hdcSave,  bmSaveOld));  
 
     //  Delete  the  memory  DCs.  
     DeleteDC(hdcMem);  
     DeleteDC(hdcBack);  
     DeleteDC(hdcObject);  
     DeleteDC(hdcSave);  
     DeleteDC(hdcTemp);  
     }

https://blog.csdn.net/goodowxy/article/details/2038014

程序中图片透明 函数(使用SetBkColor API函数)的更多相关文章

  1. C#中图片透明【转】

    C#中图片透明 /// <summary> /// 处理图片透明操作 /// </summary> /// <param name="srcImage" ...

  2. Visual C++中最常用的类与API函数

    这篇文章能让初学者快速了解visual C++ MFC中常见的核心的类与函数,虽然全部看下来有点枯燥,但对初学者快速了解MFC的框架结构很有好处. 常用类 CArchive类:用于二进制保存档案 CB ...

  3. C#中可直接调用WIN32的API函数--USER32.DLL

    Win32的API函数可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候直接调用Win32的API,可以很高效的实现想要的效果. using System; using System ...

  4. 微信小程序中图片上传阿里云Oss

    本人今年6月份毕业,最近刚在上海一家小公司实习,做微信小程序开发.最近工作遇到一个小问题. 微信小程序图片上传阿里云服务器Oss也折腾了蛮久才解决的,所以特意去记录一下. 第一步:配置阿里云地址: 我 ...

  5. 软件看门狗--别让你地程序无响应(使用未公开API函数IsHungAppWindow,知识点较全)

    正文一.概述一些重要的程序,必须让它一直跑着:而且还要时时关心它的状态——不能让它出现死锁现象.当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误.我们首要做的事是,把这个Bug揪出来.但如果 ...

  6. 在 Windows 8、Windows 10 桌面模式下的 .NET Framework 程序中,引用 Windows.Runtime 的 API。

    参考:1.https://www.cnblogs.com/webtojs/p/9675956.html 2.http://jennal.com/2016/04/28/using-windows-run ...

  7. C#API函数

    API函数是构筑Windows应用程序的基石,是Windows编程的必备利器.每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法,或者是调用Windows A ...

  8. 替换应用程序exe图标,主要使用BeginUpdateResource,UpdateResource API函数

    替换应用程序exe图标,主要使用的API函数是BeginUpdateResource(),UpdateResource(),EndUpdateResource()来使用自定义的ico文件类替换exe程 ...

  9. API函数ShellExecute与ShellExecuteEx用法

    ShellExecute: 1.函数功能:你可以给它任何文件的名字,它都能识别出来并打开它.2.函数原型: HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpO ...

随机推荐

  1. BZOJ3130: [Sdoi2013]费用流(二分,最大流)

    Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识.    最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...

  2. shell脚本的if判断语句

    if条件判断语句 if (表达式) #if ( Variable in Array ) 语句1 else 语句2 fi 1.测试数字大小 #!/bin/sh NUM=100 if (( $NUM &g ...

  3. Android布局之RelativeLayout

    RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...

  4. 【Uva 10618】Tango Tango Insurrection

    [Link]: [Description] 玩跳舞机. 有一定的约束. 归纳起来就是以下三点 1.两只脚不能同时踩一个位置 2.如果左脚踩在了右键上,那么下一次移动的一定要是左脚 3.如果右脚踩在了左 ...

  5. 洛谷 P2080 增进感情

    P2080 增进感情 题目背景 小明和小红的感情,是慢慢发展起来的. 题目描述 他们对对方分别有一个好感值.定义两人的亲密程度为两人的好感值之和. 如果他们的亲密程度达到V,则他们将走到一起.他们以后 ...

  6. Android ScrollView滚动实现大众点评、网易云音乐评论悬停效果

    今天听着网易云音乐,写着代码,真是爽翻了. http://blog.csdn.net/linshijun33/article/details/47910833 网易云音乐这个产品亮点应该在评论这一模块 ...

  7. php 图片局部打马赛克

    php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,添加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起.就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...

  8. java基本的语法

     Java语言发展史 课程大纲: Java语言发展史: 1.sun公司1995年推出,2009年Oracle公司收购sun: 下载: 1.到Oracle官网下载 Java体系与特点 课程大纲: J ...

  9. Hbuilder开发app实战-识岁06-face++的js实现【完结】

    前言 因为识岁app比較简单.所以这节就完结吧, 当然另一些能够优化完好的地方,可是个人兴趣不是非常大, 有想继续完好的,源代码在这里:https://github.com/uikoo9/shisui ...

  10. js---14公有私有成员方法

    var ns1 = {}; //命名空间 ns1.ns11 = {};//子命名空间 ns1.module1 = {name:"a",m:function(){}}; consol ...