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