界面背景用位图+位图按钮,刷新整个背景时,按钮会消失!!!
如题
我在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




