按钮被遮挡问题

xuxian02092213 2010-01-22 05:11:48
老问题,仍未解决。
问题是当我的按钮被另外的应用程序窗口遮挡住的时候,能不能获得按钮被遮挡住部分的大小,或者说获得未被遮挡住部分的大小??? 还请高手们帮帮忙啊。。。。。
...全文
659 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxian02092213 2010-02-02
  • 打赏
  • 举报
回复
我用了一个HOOK,勉勉强强实现了透明效果。我希望的透明是不需要按钮以外的代码来辅助实现,如楼上的有说在对话框画背景的时候将DC传给按钮,那样实现确实可以,但那就是用的一些辅助实现部分,我是不希望要这部分,所以使用了一个HOOK,但效果并不好,需要强制刷新。。。
fandh 2010-01-28
  • 打赏
  • 举报
回复
个人感觉楼主可以换一个思路,换一种方法!
楼主是否可以用一个缓存来记录你每次画的?而不用考虑界面上面其它程序的干扰?
这样,你下次画的时候,直接读取上次的缓存,然后加上画的,贴出来,当然,结果一样存缓存,准备给下一次用!
不知道我理解的是否正确!楼主那段文字我看了半天,呵呵
cnzdgs 2010-01-27
  • 打赏
  • 举报
回复
说说具体哪些部分要透明。例如按钮使用不规则形状,只要SetWindowRgn即可。
xuxian02092213 2010-01-27
  • 打赏
  • 举报
回复
9#的做法我也尝试过,而且我在上面也说了,可以实现,但是这需要Dialog将MemDC传送给Button,OK,是吧,但是一个控件(我的想法是做一个.ocx控件,现在尚未实现,仅仅是在重写阶段)拖到dialog上,然后就直接实现透明了,而不dialog传个什么东西给Button然后再实现透明。。。。
当然了,不管怎么样,都很谢谢各位支持,呵呵。。。。。
yangcuncunzhang 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xuxian02092213 的回复:]
我要实现一个透明按钮,那么按钮上的颜色是按钮背后的颜色。

有这样个问题,打开任务管理器(默认任务管理器在窗口最上面),我的按钮写好了,运行,任务管理器遮挡住了按钮,移开任务管理器的时候,按钮上色彩,不是按钮背后的颜色,而是任务管理器上的那些个数字之类的东西,导致的原因是:透明按钮点击的时候,整个按钮要向右下offset(1,1),以达到一个动态的效果,所以按钮可以再第一次绘制的时候(按钮上的字尚未写到按钮上,以及图标之类的东西尚未画到按钮上)可以记录下背景色,然后存储起来,以后再重绘时,将原先第一次获取的没有任何干扰颜色的图片,贴到按钮上已实现重绘。但是如果任务管理器遮挡程序的时候,第一次绘制按钮,得到背景色,会出现问题,也就是程序背景没有画,如果按钮要取背景色,CDC会将本来要画背景地方的颜色给你(刚好就是任务管理器的那些东西),所以导致这个问题。如果每次重画时都去获取背景色,那么问题是上次绘制在按钮上的字体、图标等会影响这次绘制内容。

所以我的想法是:按钮判断整个应用程序当前要绘制的区域是否包含按钮,如果包含按钮,,则去背景色,以后不再取色,将第一次画背景的颜色保留起来。这也带来一个问题。

问题是:如果任务管理器只遮挡按钮的部分呢?那就只能绘制部分按钮,故要取到按钮要绘制的区域,且还必须先前没有绘制过的,如果绘制过,则通过交集获取需要绘制的部分。。。想法感觉是这样,但是刚刚又想到一个问题,不过现在的这个问题还没有解决,不知道这个思路是否有问题,还请高人们看看,给个更好的思路啊。。。。。
[/Quote]

呵呵,楼主,你想复杂了!

我做了很多透明控件了,包括Dialog,Button, CStatic, ListBox, Edit等等。如果你在程序中需要更新控件的地方才去保存控件背景的话,这样的问题100%会出来打扰你,因为Windows是多任务的,可以随时将其他窗口切换上来,从而遮住你的一部分控件。

我的解决办法:在建立Dialog时,建立一个MemDC,将背景画在里面。需要更新某个控件所在位置的背景是,就将控件所在位置的背景MemDC中的内容重画在屏幕上!这样就能解决你的问题了。

看我的测试程序界面:

cnzdgs 2010-01-25
  • 打赏
  • 举报
回复
你的思路太复杂了,建议你按照我在上一个帖子中提出的方法来做,如果你认为方法不适合或者有其它疑问,可继续讨论。最好具体描述一下按钮的哪些部分要透明。
  • 打赏
  • 举报
回复
GDI+
xuxian02092213 2010-01-25
  • 打赏
  • 举报
回复
我要实现一个透明按钮,那么按钮上的颜色是按钮背后的颜色。

有这样个问题,打开任务管理器(默认任务管理器在窗口最上面),我的按钮写好了,运行,任务管理器遮挡住了按钮,移开任务管理器的时候,按钮上色彩,不是按钮背后的颜色,而是任务管理器上的那些个数字之类的东西,导致的原因是:透明按钮点击的时候,整个按钮要向右下offset(1,1),以达到一个动态的效果,所以按钮可以再第一次绘制的时候(按钮上的字尚未写到按钮上,以及图标之类的东西尚未画到按钮上)可以记录下背景色,然后存储起来,以后再重绘时,将原先第一次获取的没有任何干扰颜色的图片,贴到按钮上已实现重绘。但是如果任务管理器遮挡程序的时候,第一次绘制按钮,得到背景色,会出现问题,也就是程序背景没有画,如果按钮要取背景色,CDC会将本来要画背景地方的颜色给你(刚好就是任务管理器的那些东西),所以导致这个问题。如果每次重画时都去获取背景色,那么问题是上次绘制在按钮上的字体、图标等会影响这次绘制内容。

所以我的想法是:按钮判断整个应用程序当前要绘制的区域是否包含按钮,如果包含按钮,,则去背景色,以后不再取色,将第一次画背景的颜色保留起来。这也带来一个问题。

问题是:如果任务管理器只遮挡按钮的部分呢?那就只能绘制部分按钮,故要取到按钮要绘制的区域,且还必须先前没有绘制过的,如果绘制过,则通过交集获取需要绘制的部分。。。想法感觉是这样,但是刚刚又想到一个问题,不过现在的这个问题还没有解决,不知道这个思路是否有问题,还请高人们看看,给个更好的思路啊。。。。。
lllyyy2403 2010-01-22
  • 打赏
  • 举报
回复
好像没有直接得到结果的API函数。但是既然OS能感知到哪些部分被遮盖,应该有办法得到遮盖部分才对。
gamedragon 2010-01-22
  • 打赏
  • 举报
回复
同3楼问,你先说要干什么,然后再看你的想法是否合理
cnzdgs 2010-01-22
  • 打赏
  • 举报
回复
为什么要“获得按钮被遮挡住部分的大小”?你具体要实现什么样的效果?
wangk 2010-01-22
  • 打赏
  • 举报
回复
按Z-Order顺序取窗口,然后按Z-Order顺序计算被遮盖的区域。

参考信息: MSDN Windows Z-Order

marrco2005 2010-01-22
  • 打赏
  • 举报
回复
获取需要刷新的矩形区域
CDC::GetClipBox()

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧