高分求教,关于画刷的问题……

孤独的行者牛 2011-11-18 07:29:16
在一个DC上填充了一块区域,产生画刷和填充的代码如下:

var
b:TLogBrush;
Brush : HBRUSH;
begin
b.lbStyle:=0;
b.lbColor:=clBlue;
b.lbHatch:=1;
Brush := CreateBrushIndirect(b);
SelectObject(DC,Brush);
Rectangle(DC, Space, Space, cWidth, CHeight );
end;

效果如下所示(左图):

效果地址,好像不能正常显示
http://hi.csdn.net/attachment/201111/17/300306_13215725335t9T.jpg
我需要实现右边的效果,我分析应该是通过加一个画刷蒙版的方式实现的
因为这个颜色是可以设置变化的
网上有一下加画刷蒙版的代码,不是太看的懂
求教有经验的高手了…………
谢谢
...全文
223 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独的行者牛 2011-11-21
  • 打赏
  • 举报
回复
十分感谢………………
mdejtod 2011-11-20
  • 打赏
  • 举报
回复
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Gdiplus,GdipUtil;

type
TScrollBox = class(Forms.TScrollBox)
private
procedure WMPaint(var msg : TMessage);message WM_PAINT;
public
end;

type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TScrollBox }

procedure TScrollBox.WMPaint(var msg: TMessage);
var dc : HDC;
gp : TGpGraphics;
gBrush : TGpBrush;
rc : TGpRect;
tagbrush : tagLOGBRUSH;
hB : HBRUSH;
begin
inherited;
dc := GetDC(Handle);
gp := TGpGraphics.Create(dc);
rc := GpRect(0,0,Width,Height);
tagbrush.lbStyle := BS_SOLID;
tagbrush.lbColor := clWhite;
hB := CreateBrushIndirect(tagbrush);
FillRect(dc,Rect(0,0,Width,Height),hB);
gBrush := TGpLinearGradientBrush.Create(rc,ARGBFromTColor(255,clBlue),ARGBFromTColor(100,clBlue));
gp.FillRectangle(gBrush,rc);
DeleteObject(hB);
FreeAndNil(gp);
FreeAndNil(gBrush);
ReleaseDC(Handle,dc);
end;

end.
//正常显示,你所谓的从一种颜色向透明的渐变,最终要看的画布底色是什么,如果上面的DC上有获取控件的背景图像数据,那结果就像PAINTBOX上画半透明的图片一样,如果是白色,那结果就是由蓝向白过渡
孤独的行者牛 2011-11-20
  • 打赏
  • 举报
回复
谢谢您了
不好意思,查了一下,可能是邮箱满了,1000封了,呵呵
再次请教您了
我现在直接在想在ScrollBox上绘制,我重载了ScrollBox的WMPaint
在里面GetDC,然后用GDI绘制是可以的
但换面GDI+绘制就不行了,不知道为什么噢
麻烦能试一下么?
再次感谢您了!
mdejtod 2011-11-19
  • 打赏
  • 举报
回复
你的邮箱发不到,退信,你可以自己到网上找下阿发伯大侠修改的GDI+,去他的博客就有
mdejtod 2011-11-19
  • 打赏
  • 举报
回复
发个阿发伯大侠修改的GDI+单元文件给你吧
孤独的行者牛 2011-11-19
  • 打赏
  • 举报
回复
10楼的高手今天能再看一下么? 坐等噢
mdejtod 2011-11-18
  • 打赏
  • 举报
回复
FAlphas
为颜色透明度
mdejtod 2011-11-18
  • 打赏
  • 举报
回复
var gBrush : TGpBrush;
gp : TGpGraphics;
r : TGpRect;
begin
gBrush := TGpLinearGradientBrush.Create(FRect,ARGBFromCOLORREF(FAlphas,color1), ARGBFromCOLORREF(FAlphaE,color2),lmHorizontal);
gp := TGpGraphics.Create(dc);
gp.FillEllipse(gBrush,r);
freeandnil(gBrush);
freeandnil(gp);
end;
mdejtod 2011-11-18
  • 打赏
  • 举报
回复
使用GDI+的 TGpLinearGradientBrush
孤独的行者牛 2011-11-18
  • 打赏
  • 举报
回复
再次求教高手了
孤独的行者牛 2011-11-18
  • 打赏
  • 举报
回复
谢谢各位

因为颜色是要让用户设置的

所以类似 b.lbColor:=RGB(0, 255 - i, 0); 这样的代码应该不太可能

还有,应该不会用 for 循环实现,因为效率较低,量大的时候(很多个这个控件) 程序的反应速度会很低

必须一次性绘制

继续坐等各位的指点

再次感谢了

孤独的行者牛 2011-11-18
  • 打赏
  • 举报
回复
ARGBFromCOLORREF
仅引用 GDIPAPI, GDIPOBJ; 这两个文件,总是会报
ARGBFromCOLORREF 未定义噢
怎么办呢?
某某某 2011-11-18
  • 打赏
  • 举报
回复
晕倒,你这样写要实现右边的效果是不可能的。按照下面写,你可以调整参数实现你自己的效果:

如果你的高度小于255
y1 := Space;
y2 := Space;
for i:=0 to CHeight do
begin
b.lbColor:=RGB(0, 255 - i, 0);
...
y2 = Space + i;
Rectangle(DC, Space, y1, cWidth, y2 + i);
y1 = y2;

end;
金卯刀 2011-11-18
  • 打赏
  • 举报
回复
封装得很好,可以直接使用JVCL中的TJvGradient
金卯刀 2011-11-18
  • 打赏
  • 举报
回复
建议参考JVCL控件中,比如jvGradientHeaderPanel,Gradient相关的属性,看看他的实现源码
孤独的行者牛 2011-11-18
  • 打赏
  • 举报
回复
10楼的兄弟啊,能不能给详细点啊
用GDI+肯定要用一些文件
我下载了GDIPOBJ,GDIPAPI,GDIPUNTIL
还有什么 GDIPLUS………………
等等
我自己还用的Graphics, 搞的晕呼呼的
不是少这个,就是少那个!全部搞全了,又是类型不对啥的
搞死人了,能不能给详细点啊
把一些必须的文件发我邮箱行么?
十分感谢……
funxu 2011-11-18
  • 打赏
  • 举报
回复
白色到蓝色渐变不行么?
孤独的行者牛 2011-11-18
  • 打赏
  • 举报
回复
谢谢
线性画刷明显从一种颜色到另一种颜色的渐变
但我上面的图例应该是从一种颜色向透明的渐变
网上找很多,感觉用画刷蒙版实现比较好

当然了,只要实现效果就可以了

晚上回去试一下您给的参考,再次现感谢了

期待还有人能够指点一二了!
funxu 2011-11-18
  • 打赏
  • 举报
回复
线性渐变画刷就可以
http://houke2004.blog.163.com/blog/static/20863165200952525747443/
Frank.WU 2011-11-18
  • 打赏
  • 举报
回复
GDI+ 的东西,一般是用 gdiplus
加载更多回复(4)

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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