A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
效果: 透明背景的一个滚动字幕(文字或图象, 可以直接显示于Desktop之上), 滚动
过程中, 文字或图象逐渐由透明变成完全显示, 又逐渐变成透明而消失.
滚动方向: 上->下, 下->上, 左->右, 右->左
任意角度文字, 文字或图象本身可以具有gradient的face(任意方向gradient, 可以定义
光源点)
设计思路:
主要通过window的region实现.
1. 取得前景的region--FaceRgn:
文字: 用drawtext画到一幅bitmap上(背景颜色为font.color的反色, 并记为透明色),
以后处理与图象处理相同.
图象: 根据透明色生成非透明色部分的region.
2. 构筑3D效果中边界部分的region--BorderRgn:
for i := 1 to borderwidthdo
begin
用ExtCreateRegion复制FaceRgn.
offsetrgn
combinergn(...,RGN_OR)
end;
combineRgn(...., RGN_DIFF).
3. 生成前景的face--FaceEffect:
create一幅与背景同样大小的bitmap
文字: 用gradient算法充填FromColor, ToColor
图象: gradient充填与图象各点本色结合生成新颜色值
4. 生成3D Border的Face--BorderEffect:
同3.
只是起始和终止颜色不同.
5. 生成淡入淡出时的透明度(0%-100%)--FaceMask:
create与背景同样大小的bitmap
用gradient算法充填0-100的颜色(代替百分比)
6.合成最终效果图:
根据FaceMask结合背景图,faceEffect -> TargetFace
根据FaceMask结合背景图,borderEffect -> TargetBorder
7. 开始显示:
OffsetRgn(facergn, StartX, StartY);
OffsetRgn(BorderRgn, StartX, StartY);
Wait OnTimer:
SelectClipRgn(TargetDC, FaceRgn);
BitBlt(TargetDC, TargetX, TargetY, TargetWidth, TargetHeight,
TargetFace.Canvas.handle, 0, 0, SRCCOPY);
SelectClipRgn(TargetDC, BorderRgn);
BitBlt(TargetDC, TargetX, TargetY, TargetWidth, TargetHeight,
TargetBorder.Canvas.handle, 0, 0, SRCCOPY);
SelectClipRgn(TargetDC, 0);
OffsetRgn(FaceRgn, OffsetX, OffsetY);
OffsetRgn(BorderRgn, OffsetX, OffsetY);
Wait Next OnTimer ....
原代码:
太长. 不好贴. (也没来得及调试)
改进:
我看了大量的例子, 发觉实现透明很少用Region(除了做不规则form)的, 都是用几幅位图
通过mask方式实现. 可以认为用bitmap比用Region快多了?(region占用的资源并不比
bitmap多)
希望看到用bitmap通过mask方式实现上述效果的例子.
大家多提提建议.
过程中, 文字或图象逐渐由透明变成完全显示, 又逐渐变成透明而消失.
滚动方向: 上->下, 下->上, 左->右, 右->左
任意角度文字, 文字或图象本身可以具有gradient的face(任意方向gradient, 可以定义
光源点)
设计思路:
主要通过window的region实现.
1. 取得前景的region--FaceRgn:
文字: 用drawtext画到一幅bitmap上(背景颜色为font.color的反色, 并记为透明色),
以后处理与图象处理相同.
图象: 根据透明色生成非透明色部分的region.
2. 构筑3D效果中边界部分的region--BorderRgn:
for i := 1 to borderwidthdo
begin
用ExtCreateRegion复制FaceRgn.
offsetrgn
combinergn(...,RGN_OR)
end;
combineRgn(...., RGN_DIFF).
3. 生成前景的face--FaceEffect:
create一幅与背景同样大小的bitmap
文字: 用gradient算法充填FromColor, ToColor
图象: gradient充填与图象各点本色结合生成新颜色值
4. 生成3D Border的Face--BorderEffect:
同3.
只是起始和终止颜色不同.
5. 生成淡入淡出时的透明度(0%-100%)--FaceMask:
create与背景同样大小的bitmap
用gradient算法充填0-100的颜色(代替百分比)
6.合成最终效果图:
根据FaceMask结合背景图,faceEffect -> TargetFace
根据FaceMask结合背景图,borderEffect -> TargetBorder
7. 开始显示:
OffsetRgn(facergn, StartX, StartY);
OffsetRgn(BorderRgn, StartX, StartY);
Wait OnTimer:
SelectClipRgn(TargetDC, FaceRgn);
BitBlt(TargetDC, TargetX, TargetY, TargetWidth, TargetHeight,
TargetFace.Canvas.handle, 0, 0, SRCCOPY);
SelectClipRgn(TargetDC, BorderRgn);
BitBlt(TargetDC, TargetX, TargetY, TargetWidth, TargetHeight,
TargetBorder.Canvas.handle, 0, 0, SRCCOPY);
SelectClipRgn(TargetDC, 0);
OffsetRgn(FaceRgn, OffsetX, OffsetY);
OffsetRgn(BorderRgn, OffsetX, OffsetY);
Wait Next OnTimer ....
原代码:
太长. 不好贴. (也没来得及调试)
改进:
我看了大量的例子, 发觉实现透明很少用Region(除了做不规则form)的, 都是用几幅位图
通过mask方式实现. 可以认为用bitmap比用Region快多了?(region占用的资源并不比
bitmap多)
希望看到用bitmap通过mask方式实现上述效果的例子.
大家多提提建议.