GdiPlus[11]: IGPLinearGradientBrush 的第一种构建方式


第一种构建方式: TGPLinearGradientBrush.Create(点1, 点2, 颜色1, 颜色2);

本例测试效果图:

o_09121401.gif

为了方便测试, 在 Unit2 单元从 TShape 继承了一个 TMyShape 类, 用来模拟一个可活动的颜色点.

其主要功能: 1、可用鼠标左键拖动; 2、可用鼠标右键改变颜色.

Unit2 的代码:

unit Unit2;

interface

uses
  Classes, Controls, ExtCtrls, Dialogs;

type
  TMyShape = class(TShape)
  private
    fMouseFlag: Boolean;
    fx, fy: Integer;
  protected
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X: Integer; Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{ TMyShape }

constructor TMyShape.Create(AOwner: TComponent);
begin
  inherited;
  Parent := TWinControl(AOwner);
  Width := 9;
  Height := 9;
  Pen.Color := $FFFFFF;
end;

procedure TMyShape.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if Button = mbLeft then
  begin
    fx := X;
    fy := Y;
    fMouseFlag := True;
  end;
end;

procedure TMyShape.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if fMouseFlag then
  begin
    Left := Left + X - fx;
    Top := Top + Y - fy;
    TWinControl(Owner).Repaint;
  end;
end;

procedure TMyShape.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  fMouseFlag := False;
  if Button = mbRight then
  begin
    with TColorDialog.Create(Owner) do if Execute then Brush.Color := Color;
  end;
  TWinControl(Owner).Repaint;
end;

end.

Unit1 代码:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GdiPlus, GdiPlusHelpers, Unit2;

var
  Shape1, Shape2: TMyShape;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Shape1 := TMyShape.Create(Self);
  Shape1.Left := 10;
  Shape1.Top := 10;
  shape1.Brush.Color := clRed;

  Shape2 := TMyShape.Create(Self);
  Shape2.Left := ClientWidth - 10 - Shape2.Width;
  Shape2.Top := ClientHeight - 10 - Shape2.Height;
  Shape2.Brush.Color := clBlue;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  Brush: IGPLinearGradientBrush;
  Pt1,Pt2: TGPPoint;
  Color1, Color2: TGPColor;
  Rect: TRect;
begin
  Pt1.Initialize(Shape1.Left + Shape1.Width div 2, Shape1.Top + Shape1.Height div 2);
  Pt2.Initialize(Shape2.Left + Shape2.Width div 2, Shape2.Top + Shape2.Height div 2);
  Color1 := TGPColor.CreateFromColorRef(Shape1.Brush.Color);
  Color2 := TGPColor.CreateFromColorRef(Shape2.Brush.Color);

  Brush := TGPLinearGradientBrush.Create(Pt1, Pt2, Color1, Color2);

  Rect := ClientRect;
  InflateRect(Rect, -ClientWidth div 10, -ClientHeight div 10);
  Canvas.ToGPGraphics.FillEllipse(Brush, TGPRect.Create(Rect));
end;

end.
`Gdiplus::Bitmap::FromStream` 是 GDI+ 库中的一个函数,用于从流中加载图像。其函数原型如下: ```c++ Gdiplus::Status FromStream( IStream *stream, BOOL useEmbeddedColorManagement = FALSE ); ``` 其中,`stream` 参数是一个指向 `IStream` 接口的指针,用于指定要加载的流对象;`useEmbeddedColorManagement` 参数是一个布尔值,用于指定是否使用嵌入的颜色管理数据。 `Gdiplus::Bitmap::FromStream` 函数返回一个 `Gdiplus::Status` 枚举值,表示加载图像的结果。如果加载成功,返回值为 `Gdiplus::Ok`,否则返回其他错误代码。 使用示例: ```c++ Gdiplus::Bitmap* bmp = NULL; // 图像对象指针 IStream* istream = NULL; // 流对象指针 // 创建流对象 CreateStreamOnHGlobal(NULL, TRUE, &istream); // 将数据写入流 // ... // 从流中加载图像 Gdiplus::Status status = Gdiplus::Bitmap::FromStream(istream, &bmp); // 检查是否成功加载图像 if (status != Gdiplus::Ok || bmp == NULL) { // 加载失败,处理错误 // ... } // 成功加载图像,可以使用 bmp 对象进行绘制等操作 // ... // 释放资源 delete bmp; istream->Release(); ``` 在使用 `Gdiplus::Bitmap::FromStream` 函数加载图像时,需要注意以下几点: - 流对象必须在使用完毕后释放,否则会造成内存泄漏; - 图像对象也必须在使用完毕后释放; - 加载图像时需要检查返回值和图像对象是否为空,避免出现错误。 希望这可以帮助到你。如果你有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值