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); 
     }

程序中图片透明 函数相关推荐

  1. C程序中图片调用技巧(程序来自潜艇大站游戏)

    C程序中图片调用技巧 摘要:介绍如何在C程序中调用图片,这将有助于加强C程序的界面的美观性. 关键词: VGA .BMP.13h.h.TIMER.H.Logo. 一.问题的引入:   C语言使用愈来愈 ...

  2. C程序中图片调用技巧

    C程序中图片调用技巧 摘要:介绍如何在C程序中调用图片,这将有助于加强C程序的界面的美观性. 关键词: VGA .BMP.13h.h.TIMER.H.Logo. 一.问题的引入: C语言使用愈来愈普及 ...

  3. C语言中fun的功能是将字符串,下列给定的程序中,fun()函数的功能是:将p所指字符串中......

    下列给定的程序中,fun()函数的功能是:将p所指字符串中每个单词的最后一个字母改成大写(这里的"单词"是指有空格隔开的字符串).例如,若输入: I am a student to ...

  4. 本地方法(JNI)——从java 程序中调用C函数

    [0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法--从java 程序中调用C函数 的基础知识 : 2) for source code, ...

  5. 在一个C程序中,main()函数可以放在哪?

    C语言规定,在一个C程序中,main()函数的位置(). A.必须在系统调用的库函数之后 B.必须在程序的开始 C.必须在程序的最后 D.可以在任意位置 答案:D [解析] 每个C程序有且只有一个主函 ...

  6. 小程序中图片太大应该怎么处理

    在小程序中图片格式为png时任然特别大的时候应该先将图片放在服务器上,然后从服务器上选取所用的图片 在小程序中有放置请求接口的配置文件config.js 在小程序页面中要使用大图时候 (1)先引入co ...

  7. 在应用了皮肤的程序中制作透明的文本编辑控件(如:TcxMemo)

    我要在程序中显示一段信息,因为需要让文字的背景透明,我首先使用静态文本控件来实现 遇到需要进行编辑的时候,静态文本控件就不能满足要求了,这就使我想到了可不可以制作一个透明的文本编辑控件 首先上网查了一 ...

  8. linux平台下通过mcr方式从c++程序中调用matlab函数

    小细节很多,所以容易出错. 平台:linux gcc matlab2010a 1 在matlab中写好函数例如branch,调用命令 mcc -W cpplib:libbranch -T link:l ...

  9. 在C语言程序中 当调用函数时,c语言程序设计第2版) 教学课件 作者 梅创社试题库 期末试卷一.docx...

    期末试卷一 一.单项选择题(每题1分,共45分)1.在计算机系统中,可以执行的程序是( )A.源程序 B.汇编语言程序C.机器语言程序 D.ASCII码2.C语言程序的基本单位是( )A.程序行 B. ...

最新文章

  1. Celt Codec简单使用方法
  2. MySQL常见备份与恢复方案
  3. php集合与数组的区别,java集合与数组的区别
  4. [TJOI2017]城市(未解决)
  5. AutoCAD VBA天圆地方的放样展开图
  6. 抓包红色_抓包三部曲 WebSocket 协议原理抓包分析
  7. Django获取request header信息
  8. FMS 中文帮助 (下载)
  9. PostgreSQL 12系统表(9)pg_settings
  10. splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
  11. dmg文件转换iso ultraiso_Ultraiso软盘如何制作U盘启动盘
  12. 5个性能强悍的黑科技APP,请低调收藏,高调使用!
  13. 人工智能导论学习笔记
  14. java 多线程m3u8下载
  15. C语言习题二:比赛评分系统
  16. 自己合成制作支付宝、微信、QQ三合一万能收款码
  17. 加强c语言,加强学法指导 提高C语言学习能力
  18. 【QA单】柿饼派及柿饼M3模块相关QA(持续更新....)
  19. Anaconda创建环境中途退出后重新创建出错
  20. QT ACTIVEX最新操作WORD文档的一些心得

热门文章

  1. 【深度学习小知识】ROI到ROI pooling 再到ROI Align
  2. 一个跑步时用的轨迹记录和计步器APP
  3. win7 64位虚拟机安装
  4. intel(r)wireless-ac9462异常//笔记本电脑网络无法连接???吐血后总结 :一次解决,史上最全,N种方案
  5. 正则表达式大全(超详细正则校验内容)
  6. 【K8S实战】-超详细教程(二)
  7. 【解决方案】宠物医院如何实现顾客医院联动的安全监控?EasyCVR视频图像智能分析远程监控方案介绍
  8. 万用表测量二极管方法
  9. 使用jinja2自动生成交换机接口配置脚本
  10. Jenkins连接svn报E170001错误的解决办法