关于"半透明panel",答CJ的email(0分)

  • 主题发起人 Another_eYes
  • 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
可以称为完成吗?
.运行时一切正常
.见鬼的是, 设计时怎么变换属性都不能直接反映出来? 我漏了什么?
不满意的地方:
1. 计算屏幕色彩速度太慢. 我现在用的方法是:
......
ForeColor:=ColorToRGB(FColor);
for i:=Height-1do
wnto 0do
for j:=Width-1do
wnto 0do
begin
BkColor:=GetPixel(ftempdc1,j,i);
r:=round(byte(ForeColor)+(byte(BkColor)-byte(ForeColor))*FTransparent);
g:=round( byte(ForeColor shr 8)+
(byte(BkColor shr 8)-byte(ForeColor shr 8))
*FTransparent);
b:=round( byte(ForeColor shr 16)+
(byte(BkColor shr 16)-byte(ForeColor shr 16))
*FTransparent);
SetPixelV(ftempdc1,j,i,RGB(r,g,b));
end;
......
有没有更好的方法? 如果是256色,我可以改变当前pallete内的颜色值, 这样最
多是256次单循环. 但是256色以上的图象颜色信息都在每个点上, pallete内
为空, 难道只能用上述的循环修改颜色值吗(200*200的panel大约要计算0.5
秒(p120+32M))?
2. 我已经尽量cache了原始的屏幕背景和变色之后的屏幕, 因此只是在第一次
生成时或者屏幕背景改变时才重新计算. 为了动画弹出和缩回的效果流畅,
我是在不改变当前panel大小的情况下, 通过不断重画当前panel(部分屏幕背
景+部分前景)来实现, 在动画效果完成后(或者动画开始前)置visible属性,
这样当前未展开的panel不会遮住原来屏幕上其他控件的鼠标或键盘输入焦点.
现在的问题是一旦置visible属性, delphi必然erase background然后paint
这样就会出现闪烁, 尽管时间很短, 但是感觉很怪(panel未弹出前屏幕先闪一
下, 然后慢慢展开panel, 或者panel慢慢缩回后屏幕又闪一下), 我想了2天,
还是没想出好办法. 根据vcl源码显示, 置visible时首先perform
CM_VISIBLECHANGED, (perform的message没办法截取吧?), 然后在CM_VISIBLECHANGED中
invalidaterect(...., 删除背景) , 而且visible是个public属性,set
visible的几个过程没一个能override的. :(
这也就是我问"关于message的几个问题"的目的.
如果您觉得这些bug都无伤大碍的话, 我可以给你现在的控件.
不过最好能等一等, 或者帮我出出主意. 谢谢了.
 
不好意思,下了网研究!我COPY了一份!
 
接受答案了.
 

Similar threads

I
回复
0
查看
720
import
I
I
回复
0
查看
931
import
I
I
回复
0
查看
559
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部