CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

如何用一张透明位图覆盖整个窗口?

楼主long33(阿龙)2006-07-03 15:34:07 在 VC/MFC / 界面 提问

一张位图,四个角是透明的,重载OnNcPaint消息后,直接贴图,边框贴上了,但没有实现透明,四个角是黑色的...并且Client区域并没有贴上图..请问该如何实现将一张透明位图贴满整个窗口?     有没有这方面的简单代码?谢谢.         longxiaokunhoo@163.com 问题点数:50、回复次数:4Top

1 楼long33(阿龙)回复于 2006-07-03 15:54:20 得分 0

补充一点,窗体已经通过SetLayeredWindowAttributes   使其透明.Top

2 楼long33(阿龙)回复于 2006-07-03 16:25:30 得分 0

或者不用边框,自己代码实现窗口拉伸...谁能给个例子?Top

3 楼mynamelj(风之羽翼)回复于 2006-07-03 16:35:50 得分 50

void   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       =   SelectObject(hdcBack,   bmAndBack);  
        bmObjectOld   =   SelectObject(hdcObject,   bmAndObject);  
        bmMemOld         =   SelectObject(hdcMem,   bmAndMem);  
        bmSaveOld       =   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);  
  }  
  Top

4 楼mynamelj(风之羽翼)回复于 2006-07-03 16:36:48 得分 0

但是你的窗体四角还要自已处理Top

相关问题

关键词

得分解答快速导航

  • 帖主:long33
  • mynamelj

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo