如何实现透明;如显示按钮下的图象,100分少不少,我不知道这的行情!(100分)

  • 主题发起人 主题发起人 Rich
  • 开始时间 开始时间
原理:
把前景和背景图象合并。一般需要以下几步:
1. 把屏幕上的背景部分读入
2. 生成黑白图象
3. 生成前景的黑白图象
4. 把两副黑白图象合并
5. 把这作为mask和背景合并(把背景上需要显示前景的地方按前景的形状抠个洞)
6. 反色的mask和前景合并(挖去前景中需要背景的地方)
7. 合并前景和背景
实际应用中还需要注意一些地方
如果是继承自TWinControl的控件(有handle, 有windows管理)需要透明
建立时要修改创建参数(通过继承该控件的CreateParams方法), 不然windows建立该
控件时自动把它的底色清空, 这样就读不到背景图案了(如TButton, TEdit...)
如果是继承自TGraphicControl的控件(没有handle, 由delphi管理)则容易得多(如TSpeedbutton)
程序懒得写了, 你可以到已答问题中找或看看vcl的原代码
 
我想做个带阴影的Edit,是从TcustomControl,Tcustomedit中那个继承好!
如何得到Tbutton或Tedit的底色!多谢!
 
简单办法:
使用TSpeedButton控件,可以实现显示按钮下的图象。
如还有什么特殊需要,可以从该控件继承下来,自己写一个。
 
你可以用“透明”检索一下,可能会有收获
 
要对edit动手脚看来只有直接继承TCustomControl才有机会获得下面的底图。从TCustomEdit
继承没用,因为你inherited的TCustomEdit Create时已经把底图清掉了。
不过继承TCustomControl的话你得自己控制输入,包括光标的定位,显示,所有按键
的操作....(想想要干的活我就晕了)
理论上讲, 要获得TWinControl类控件的背景, 得override CreateParams方法
在该方法中将原来的param中加上WS_EX_TRANSPARENT(用or运算), 这样windows建立
该控件时不会自动将背景清空, 你就可以读到了.
 
1.搜索
2.TCUSTONCONTROL
 
实际上TcustomEdit是win已经注册的类,你大部分无法改变!
如果真的要写,可以使用剪贴板,把Tcustomcontrol的代码copy!
 
比如有Edit,我如何得知他下面得bmp图象!
 
最简单的办法: 把edit.visible置为false......嘿嘿嘿嘿
如果想做透明edit的话麻烦大喽,原因如上所述
不如去找别人的控件然后修改
 
建议或者是警告, 尽量不要使用或去做透明的WinControl, 效率低, 浪费系统资源!
eYes的做法可以得到透明的窗口, 但是不要忘记每一次更新Edit中的内容后必须使用
ReCreateWnd方法来更新, 否则背景不回自动刷新, 新的text与原来的text重叠.
 
>建议或者是警告, 尽量不要使用或去做透明的WinControl, 效率低, 浪费系统资源!
这话没错。不过小范围地用用还行。
>eYes的做法可以得到透明的窗口, 但是不要忘记每一次更新Edit中的内容后必须使用
>ReCreateWnd方法来更新, 否则背景不回自动刷新, 新的text与原来的text重叠.
这倒不一定。还是eYes的方法,用Parent.PaintTo方法,可把Parent自身和其上所有
可视控件画到一个DC上去。在此过程中,自身要屏蔽WM_Paint和WM_EraseBackGround
消息.取到了背景,怎么处理都行了。
BTW:eYes,我的透明Fire做好了,多谢你的帮助。想看看吗?
 
To tqz:
Parent.paintto不能用的, 不信你试试。屏蔽自身WM_ERASEBACKGRND的结果是
这块要么显示的是当前application下面的背景(也就是Desktop上的东东)要么是
一块空方格(因为该控件建立时没有CW_EX_TRANSPARENT)
 
Agree eYES
To tqz: 是那个在TORRY上的?
 
我开始写了!已经完成字符显示!不过任重而道远!
键盘处理是个难题,尤其是方向键!
这东西真练功力!
 
多人接受答案了。
 
后退
顶部