CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

怎样画一个将一个圆形图贴在button上

楼主jacking007(复活岛)2003-09-03 14:51:56 在 VC/MFC / 界面 提问

我的dialog是个变形的dialog。贴了个颜色渐变的蓝色图,显示形状为一个圆。我的button是自己派生的button子类。在DrawItem里可以画出要的圆来。但是圆以外的颜色没有透明。结果看起来还是个正方形。怎么才可以将自绘的button周围的颜色变成透明的阿。因为dialog的底图是渐变的。所以不可能将button的圆形外的地方用某种单色填充,只能将其透明化。麻烦帮帮忙。最好有关键地方的源码。 问题点数:100、回复次数:8Top

1 楼whoishere(我来也)回复于 2003-09-03 15:32:11 得分 100

如下,在你的按钮初始化的时候调用SetWindowRgn设置其区域,  
  static   CRgn   rgn;  
  rgn.CreateEllipticRgn(   0   ,   0   ,   50   ,   50   );   //   设置一个圆形区域,具体大小请自己计算  
  SetWindowRgn(   (HRGN)rgn   ,   TRUE   );  
   
  这样,该圆形区域以外就不属于该按钮,也就自然透明了Top

2 楼jacking007(复活岛)回复于 2003-09-03 16:10:45 得分 0

在哪初始化阿,我在drawitem和onpaint、button中都试过了,全部会报错,在drawitem中看到效果了,可是我的button是用来移的,一动就报错了。Top

3 楼jacking007(复活岛)回复于 2003-09-03 16:38:18 得分 0

移动问题搞好了。在问一下。我移动时,还是会有很多小点没有刷新阿。有办法搞定么?Top

4 楼whoishere(我来也)回复于 2003-09-03 17:10:18 得分 0

这我也不清楚了,SetWindowRgn按说应该不会有这方面的问题。  
  试着先确定小点产生的原因吧,是因为按钮窗口的刷新产生的还是其他控件刷新引起的问题Top

5 楼jacking007(复活岛)回复于 2003-09-04 09:22:00 得分 0

是botton周围的那个pen的问题,老有遗留。有办法将pen去掉么。我用PS_NULL参数试过了,会留白边。拖动botton时一样会留下白点。而且CreateEllipticRgn的范围还必须比我的button范围大才行(及画的button为(0,0,20,20),createellipticrgn(0,0,21,21)才行),要不button边上老闪动。Top

6 楼whoishere(我来也)回复于 2003-09-04 09:47:28 得分 0

"botton周围的那个pen",我不太明白啊?看来是没法继续帮你了Top

7 楼jacking007(复活岛)回复于 2003-09-04 14:15:09 得分 0

阿,我把代码贴出来得了  
   
  void   CButtonMove::DrawItem(LPDRAWITEMSTRUCT   lpDrawItemStruct)    
  {  
   
  CRgn   rgn;  
  rgn.CreateEllipticRgn(   0   ,   0   ,   21   ,   21   );  
  SetWindowRgn(   (HRGN)rgn   ,   TRUE   );  
   
  //使用刷子画图时的情况  
  CDC *pDC   =CDC::FromHandle(lpDrawItemStruct->hDC);  
                    CRect rtControl(lpDrawItemStruct->rcItem);  
  CPen pen(PS_SOLID,1,RGB(255,0,0)),*old_pen;  
  CBrush *old_brush;  
  CString     strText;  
   
  rtControl.EqualRect(rtControl);  
  //   Resource   handle   to   bitmap.  
  HRSRC   hRes;          
  //   Global   handles   to   bitmap   resource.  
  HGLOBAL   hData,   hLockedData;        
  CBrush   brush;  
   
  //   Find   the   resource   handle.  
  hRes   =   ::FindResource(AfxGetResourceHandle(),  
  MAKEINTRESOURCE(IDB_POINTBMP),   RT_BITMAP);  
  if   (hRes   !=   NULL)  
  {  
        //   Lock   and   Load   (or   Load   and   Lock).  
        if   (((hData   =   ::LoadResource(AfxGetResourceHandle(),  
        hRes))   !=   NULL)   &&    
      ((hLockedData   =   (HGLOBAL)::LockResource(hData))   !=   NULL))  
        {  
      //   Initialize   the   brush.  
      brush.CreateDIBPatternBrush(hLockedData,  
      DIB_RGB_COLORS);  
   
        }  
  }  
  old_brush=pDC->SelectObject(&brush);  
  old_pen     =pDC->SelectObject(&pen);  
   
   
  pDC->Ellipse(rtControl);  
  //字体背景是否为透明  
  pDC->SetBkMode(TRANSPARENT);  
  GetWindowText(strText);  
  pDC->DrawText(strText,rtControl,DT_SINGLELINE|DT_CENTER|DT_VCENTER);  
   
   
  }  
   
  就是pen上面有部分的点会残留。帮帮忙啊Top

8 楼jacking007(复活岛)回复于 2003-09-04 14:18:42 得分 0

有没有办法把那些残留的点刷掉。在我移动button的过程中。在mousemove时候的问题,还是drawitem时候出的问题阿。我都不知道这个问题怎么查。以前很少做关于界面方面的东西。所以对刷新问题不是很明白。Top

相关问题

  • 如何做一个椭圆形的button,并且上面还有自己画的位图?急用!谢谢
  • 如何画一个圆形按键
  • 网页中的圆形绘图
  • 如何把vb.net中的Button按钮变成圆形
  • 在web中,toolbar中要用一些圆形的图片,可是它的button却是方形的,不知怎么解决,郁闷!!!
  • 请问怎样在DREAMEVER中做一个圆形的动画?  
  • 画出的圆形或者弧怎么总是有锯齿
  • 怎样将一个方形位图转换成圆形的?
  • 怎么把图片往一个椭圆形里面填充呢?
  • 圆形是一种几何图形能反映is-a关系吗?

关键词

  • 区域
  • null
  • 圆形
  • rgn
  • hlockeddata
  • drawitem
  • createellipticrgn
  • setwindowrgn
  • lpdrawitemstruct
  • hres

得分解答快速导航

  • 帖主:jacking007
  • whoishere

相关链接

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

广告也精彩

反馈

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