zoukankan      html  css  js  c++  java
  • 程序中图片透明 函数(使用SetBkColor API函数)

     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

  • 相关阅读:
    mysql常见的优化方法
    Mac 怎么通过自带终端连接linux服务器
    基于 appium 的 UI 自动化测试
    sourcetree在mac上的使用
    mac下git安装和使用
    mac 上更改环境变量
    Mac环境下svn的使用
    jira常用配置
    influxDB基本操作
    Collectd 和 InfluxDB 的部署和使用
  • 原文地址:https://www.cnblogs.com/findumars/p/9122162.html
Copyright © 2011-2022 走看看