Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用自定义样式(delphi)在画布上绘制一条线_Delphi_Styles_Line - Fatal编程技术网

使用自定义样式(delphi)在画布上绘制一条线

使用自定义样式(delphi)在画布上绘制一条线,delphi,styles,line,Delphi,Styles,Line,我需要在画布上画一些线,但我需要使用自定义样式,没有标准样式,如实心、圆点等 例如,我需要画一条线作为“\uuuuu.\uuuuu.\uuuuu”或“.\uuuu.\uuuuuu.\uuuu”。我所有的线条都是破折号和圆点的混合体,我还需要设置破折号长度、破折号和圆点宽度 我不想使用GDI+或其他外部库 有简单的方法吗?您也可以使用API。当然,钢笔样式(正如Andreas Rejbrand所建议的)要快得多,但是LineDDA允许您以不同的颜色绘制线条的各个部分 var DottedLin

我需要在画布上画一些线,但我需要使用自定义样式,没有标准样式,如实心、圆点等

例如,我需要画一条线作为“\uuuuu.\uuuuu.\uuuuu”或“.\uuuu.\uuuuuu.\uuuu”。我所有的线条都是破折号和圆点的混合体,我还需要设置破折号长度、破折号和圆点宽度

我不想使用GDI+或其他外部库

有简单的方法吗?

您也可以使用API。当然,钢笔样式(正如Andreas Rejbrand所建议的)要快得多,但是LineDDA允许您以不同的颜色绘制线条的各个部分

var
  DottedLineDrawCounter: Integer;

procedure DDAProc(AX, AY: Integer; ACanvas: TCanvas); stdcall;
begin
  if DottedLineDrawCounter mod 4 = 0 then
    ACanvas.Pixels[AX, AY] := clRed
  else
    ACanvas.Pixels[AX, AY] := clBlack;
  Inc(DottedLineDrawCounter);
end;

...
begin
  // Usage
  DottedLineDrawCounter := 0;
  LineDDA(X1, Y1, X2, Y2, @DDAProc, LPARAM(Canvas));
end;

您可以使用普通GDI执行此操作:

procedure TForm1.FormPaint(Sender: TObject);
const
  pattern: array[0..3] of cardinal = (10, 1, 1, 1);
var
  lb: TLogBrush;
  pen, oldpen: HPEN;
begin
  lb.lbStyle := BS_SOLID;
  lb.lbColor := RGB(255, 0, 0);
  pen := ExtCreatePen(PS_COSMETIC or PS_USERSTYLE, 1, lb, length(pattern), @pattern);
  if pen <> 0 then
    try
      oldpen := SelectObject(Canvas.Handle, pen);
      Canvas.MoveTo(0, 0);
      Canvas.LineTo(ClientWidth, ClientHeight);
      SelectObject(Canvas.Handle, oldpen);
    finally
      DeleteObject(pen);
    end;
end;
程序TForm1.FormPaint(发送方:TObject);
常数
模式:基数=(10,1,1,1)的数组[0..3];
变量
lb:TLogBrush;
钢笔,旧钢笔:HPEN;
开始
lb.lbStyle:=BS_固体;
lb.lbColor:=RGB(255,0,0);
pen:=ExtCreatePen(PS_化妆品或PS_用户样式,1磅,长度(图案),@pattern);
如果是0,那么
尝试
oldpen:=选择对象(Canvas.Handle,笔);
Canvas.MoveTo(0,0);
Canvas.LineTo(ClientWidth、ClientHeight);
选择对象(Canvas.Handle、oldpen);
最后
删除对象(笔);
结束;
结束;

ExtCreatePen函数允许创建用户风格的笔(有一些限制)可能重复投票关闭此…@Jerry-投票是我的,原因是问题是完全重复的,答案也是。按照链接…我会称之为部分重复,不准确。前面的问题是“更改虚线的大小”,而这个问题是“如何创建自定义样式线”-虽然实现这两个的方法相同,但每个的最终目标都不同。为什么我不能更改宽度参数?马丁:我想GDI化妆品笔只能有单位宽度。如果我将“pattern:array[0..3]of cardinal”更改为“pattern:array of cardinal”,然后使用“SetLength(pattern,4);”并将数组值设置为10、1、1和1,我总是会得到一条连续线。为什么?在创建新笔之前,有没有办法设置数组长度并更改值?@Martin:因为动态数组是指针,所以不会“就地”存储在内存中。因此,如果使用动态数组,则必须将
@pattern
替换为
@pattern[0]