【问题标题】:GDI+ DrawLine draws nothingGDI+ DrawLine 什么都不画
【发布时间】:2021-03-26 11:58:51
【问题描述】:

开始在 Delphi 中使用 GDI+。需要画几条平滑的直线。例如,试图在表单上绘制对角线(从左上角到右下角)但什么也没有出现。该代码有什么问题(Delphi XE3、Windows 10 x64)?

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.GDIPAPI, Winapi.GDIPOBJ;

type
  TForm2 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormPaint(Sender: TObject);
var
  graphics: TGPGraphics;
  gpPen: TGPPen;
begin
  graphics := TGPGraphics.Create(Self.Canvas.Handle);
  try
    graphics.SetSmoothingMode(SmoothingModeAntiAlias8x8);
    gpPen := TGPPen.Create(clBlue, 3);
    try
      graphics.DrawLine(gpPen, 0, 0, ClientWidth, ClientHeight);
    finally
      gpPen.Free;
    end;
  finally
    graphics.Free;
  end;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
  Repaint;
end;

end.

【问题讨论】:

    标签: delphi gdi+


    【解决方案1】:

    问题在于颜色。

    这是一个 GDI+ colour,与本质上是 Win32 的 TColor 不同COLORREF

    你传递了clBlue = $00FF0000,它现在被(错误地)解释为(alpha,red,green,blue)=($00,$FF,$00,$00)。由于 alpha 值为 0,所以线条是完全透明的。

    如果你这样做

    gpPen := TGPPen.Create(clBlue or $FF000000, 3);
    

    相反,您将获得完全的不透明度。但是你会得到红色,而不是蓝色,因为 TColor$00BBGGRR 而不是 $00RRGGBB。所以如果你这样做了

    gpPen := TGPPen.Create($FF0000FF, 3);
    

    你得到你想要的蓝色。

    也许更好的是使用MakeColor函数:

    gpPen := TGPPen.Create(MakeColor(0, 0, $FF), 3)
    

    ColorRefToARGB:

    gpPen := TGPPen.Create(ColorRefToARGB(clBlue), 3)
    

    【讨论】:

    • 太棒了!它正在工作。非常感谢,安德烈亚斯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2012-01-16
    相关资源
    最近更新 更多