CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

界面背景用位图+位图按钮,刷新整个背景时,按钮会消失!!!

楼主pizicai105(蓝冰)2006-03-18 11:05:18 在 VC/MFC / 界面 提问

如题  
   
  我在OnPaint()中画背景(用双缓冲无闪烁),但是这样刷新的时候按钮就会消失  
   
  所以我在该函数画完背景后  
  用GetDlgItem(IDC_B_SEND)->Invalidate();令按钮重刷一遍,  
  这是是可以解决按钮消失问题  
   
  但是,这样就造成了我动一下窗口,界面上的所以按钮都在动(背景没闪,因为我用双缓冲)  
   
  怎么解决这个问题??请高手指点》》》》》》》 问题点数:50、回复次数:28Top

1 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-03-18 11:12:03 得分 0

位图按钮是一个按钮类?  
   
  WM_ERASEBKGND?Top

2 楼huguyue6670(美丽海洋)回复于 2006-03-18 11:21:02 得分 0

楼主   用双缓冲无闪烁   是什么意思?  
  我也这么做的但是没有出现楼主说的这个问题!!Top

3 楼huguyue6670(美丽海洋)回复于 2006-03-18 11:21:55 得分 0

http://www.pconline.com.cn/pcedu/empolder/gj/vc/0507/653941.htmlTop

4 楼pizicai105(蓝冰)回复于 2006-03-18 13:01:36 得分 0

我不是背景闪  
   
  而是背景画完后,我要使按钮能浮在背景之上  
  所以用了GetDlgItem(IDC_B_SEND)->Invalidate();令界面上所有的按钮重刷一遍  
   
  导致按钮闪,  
   
  我是想问有什么办法可以使按钮又可以浮在背景最上面,又可以不用在OnPaint()中使用GetDlgItem(IDC_B_SEND)->Invalidate();Top

5 楼Snow_Ice11111(雪上加冰)回复于 2006-03-18 13:56:02 得分 10

先算好按钮的位置,在界面背景用的位图中按钮位置处“挖”一个矩形区域,用透明色填充,这样显示的时候这一个区域就会显示出按钮了。Top

6 楼pizicai105(蓝冰)回复于 2006-03-18 14:16:41 得分 0

楼上的方法的确不错  
  不过对我来说可能不太适用  
   
  1、我的背景不是整张,而是很多小图片构成,有的是平铺的,有的是拉伸的  
  2、并且按钮如果比较多呢?  
   
  不过楼上的方法倒很值得一试  
  不管怎么样这是个好办法,先谢谢楼上的经验交流Top

7 楼pizicai105(蓝冰)回复于 2006-03-18 14:28:19 得分 0

楼上的高手,请问我用SubtractRect()减掉了一个RECT之后  
   
  用哪个API可以画这种不规格的图片?  
   
  本来我是用dc.StretchBlt();拉伸图片  
   
  现在要用哪个API?Top

8 楼Snow_Ice11111(雪上加冰)回复于 2006-03-18 15:32:28 得分 0

我上面的方法在背景图中直接用图像处理软件做会方便一些;如果你的图片都是动态或在运行时才指定图片的话,那就用CDC::SetPixel把那个区域填充成透明色,麻烦一点,不知道楼下有没有更好的方法?Top

9 楼pizicai105(蓝冰)回复于 2006-03-18 16:54:39 得分 0

SetPixel应该是很慢的,   不太实际啊Top

10 楼xiao_fang(frank)回复于 2006-03-18 19:10:51 得分 10

设置clip   region,在刷新时去掉按钮区域  
  CRgn   clipRgn;  
  clipRgn.CreateRectRgnIndirect(&rcClient);  
  pDC->SelectClipRgn(&clipRgn);  
  pDC->ExcludeClipRect(&rcButton);  
  Top

11 楼iswjh(哪天我才会Turbo C)回复于 2006-03-18 20:27:03 得分 10

RECT   rcClient;  
  GetClientRect(hwnd,&rcClient);  
  HRGN   hrgn=CreateRectRgn(rcClient.left,rcClient.top,rcClient.right,rcClient.bottom);  
  SelectClipRgn(hdc,hrgn);  
  ExcludeClipRect(hdc,rcClient.left,rcClient.top,rcClient.right,rcClient.bottom);  
   
  //在这里加上你自己的绘制code  
   
  注:     这是一种简单的情况:即将绘制的window和button都是矩形的.  
  如果你将button设为圆形的,那会怎么样呢?你自己可以试试看.Top

12 楼psbeond(LibUIDK界面库客服)回复于 2006-03-18 20:36:15 得分 10

什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。Top

13 楼Mackz(在相互)回复于 2006-03-18 23:15:31 得分 0

ValidateRectTop

14 楼chehw(chehw)回复于 2006-03-19 00:24:49 得分 0

窗口属性   |WS_CLIPCHILDRENTop

15 楼bugzhao(阿辉)回复于 2006-03-19 15:15:50 得分 10

psbeond(psbeyond)   (   )   信誉:98     2006-3-18   20:36:15     得分:   0      
           
  什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。  
   
  应该不是吧  
   
       
     
  Top

16 楼qkhhgutg(太子)回复于 2006-03-19 15:42:55 得分 0

接分呀  
   
  Top

17 楼psbeond(LibUIDK界面库客服)回复于 2006-03-20 13:15:18 得分 0

bugzhao(阿辉)   (   )   信誉:98     2006-03-19   15:15:00     得分:   0      
     
     
        psbeond(psbeyond)   (   )   信誉:98     2006-3-18   20:36:15     得分:   0      
           
  什么都不用,一定是你画错了。你是在CPaintDC中画的还是在CClientDC或CWindowDC中画的?另外你可以指定父窗口的属性为WM_CLIPCHILD.这样在画父窗口的时候就不会画它里面子窗口中的部分了。  
   
  应该不是吧  
   
       
  是的。其实你只要在Button中画Button,在父窗口中画父窗口就可以了。最多就是有闪烁,不可能被盖住的。看一下我的界面库就知道了。Top

18 楼huguyue6670(美丽海洋)回复于 2006-03-20 16:16:29 得分 0

借这个机会我也向高手问一个问题,我在程序种重绘标题栏,但是在程序弹出子窗口时重回的标题栏没有了,这是怎么回事?在弹出资窗口时,父窗口作了什么工作?Top

19 楼Snow_Ice11111(雪上加冰)回复于 2006-03-20 17:37:33 得分 0

楼上朋友可以把重绘标题栏的代码或函数放在WM_CTLCOLOR消息响应函数中。Top

20 楼pizicai105(蓝冰)回复于 2006-03-27 12:56:24 得分 0

//设置对话框属性  
  ModifyStyle(   WS_CAPTION,    
  WS_SYSMENU   |   WS_MINIMIZEBOX   |   WS_CLIPCHILDREN,    
  SWP_DRAWFRAME   );  
   
  我已经设置过对话框的属性  
  这样的属性不行吗?  
   
  我是在::OnPaint()中画背景及更新一些按钮的  
  在该函数中用CDC   *pDC   =   GetWindowDC();  
  然后用双缓冲画图,背景重画不闪,只是在该函数中我也要相应更新位图按钮,  
  例如:m_MAbout.Invalidate();  
  这样每次刷新背景,这个按钮都会先变灰,再画上图  
  所以感觉界面很闪Top

21 楼ricky460(阿酷)回复于 2006-03-27 15:43:47 得分 0

在OnPaint里最好不要用GetWindowDC()   ,   这么绘制会有问题   .   .    
   
  最好改成   CPaintDC   dc(this);    
   
  然后用这个dc来绘制即可   ,   并在此函数中去除按钮的刷新   .   .   .    
   
  楼主试试看!Top

22 楼pizicai105(蓝冰)回复于 2006-03-27 17:15:21 得分 0

楼上的我试过了,可以去掉按钮的刷新并且按钮也没被盖住  
   
  不过出现了界面一直在重画的现象  
   
  会不会是因为我在OnPaint中用了  
                    CRect   rect;  
  GetClientRect(&rect);  
  CRgn   rgnWin;  
  DrawMainDlgBK(dc,   rect,   rgnWin);//根据图片处理rgnWin  
  SetWindowRgn(rgnWin,TRUE);  
  造成的?  
   
  而这东西又不能放在OnInitDialog()里,因为OnInitDialog里没有CPaintDC,  
  怎么办?Top

23 楼pizicai105(蓝冰)回复于 2006-03-27 17:37:57 得分 0

其实如果要放在OnInitDialog()也行  
   
  不过我窗口如果拉大缩小的话,这个就不好处理了Top

24 楼ricky460(阿酷)回复于 2006-03-29 15:48:35 得分 0

绝对不要在OnPaint里SetWindowRgn(。。)  
  因为SetWindowRgn会改变窗口   ,一改变窗口就会调用OnPaint重绘一次   。  
  然后OnPaint又调用SetWindowRgn(..)   结果可能会导致循环   。   。   。   。  
   
  窗口拉大缩小的话,   可以重载OnSize(...)   ,每次窗口大小变换的时候都会调用这个函数。  
  Top

25 楼dirdirdir3(风)回复于 2006-03-29 16:17:11 得分 0

应该在OnEraseBKgnd()中画背景。  
  Top

26 楼pizicai105(蓝冰)回复于 2006-03-30 15:29:36 得分 0

嗯明白了  
   
  可是我想ListCtrl或TreeCtrl默认的滚动条改成位图形式的或XP形式的要怎么做???  
   
  这个应该是做界面最基本的问题吧!  
   
  请高手指点Top

27 楼ricky460(阿酷)回复于 2006-04-01 20:08:37 得分 0

重载ListCtr或者TreeCtrl   ,   在DrawItem里自己绘制   。   。Top

28 楼pizicai105(蓝冰)回复于 2006-04-04 10:13:04 得分 0

有没有相关的例子或说明?  
   
  重绘滚动条我不懂Top

相关问题

  • 界面刷新的问题
  • 界面的刷新问题
  • wince下的界面刷新
  • 界面刷新的问题
  • 如何刷新程序界面
  • 怎样刷新整个程序界面
  • 如何刷新Windows的整个界面?
  • 关于界面刷新的问题?
  • 关于界面刷新的问题
  • 虚拟示波器的界面按钮

关键词

  • 界面
  • 函数
  • 属性
  • 信誉
  • 区域
  • 按钮
  • rcclient
  • 背景
  • 刷新
  • onpaint

得分解答快速导航

  • 帖主:pizicai105
  • Snow_Ice11111
  • xiao_fang
  • iswjh
  • psbeond
  • bugzhao

相关链接

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

广告也精彩

反馈

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