当前位置: 首页 > news >正文

再学 GDI+[29]: TGPPen - 自定义复合画笔 - SetCompoundArray

为什么80%的码农都做不了架构师?>>>   hot3.png

本例效果图:

26153054_01xS.gif

代码文件:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    LabeledEdit1: TLabeledEdit;
    RadioGroup1: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure LabeledEdit1Change(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  arr1: array[0..5] of Single; {用于均分线复合画笔; 数组大小没有限制, 可用动态数组}
  arr2: array[0..3] of Single; {用于粗细线复合画笔; 数组大小没有限制, 可用动态数组}

procedure TForm1.FormCreate(Sender: TObject);
begin
  {均分线复合画笔; 6 个元素决定 3 条子线; 数组元素为百分比, 应在 0-1 之间}
  arr1[0] := 0.00; {第一线起点}
  arr1[1] := 0.10; {第一线终点}
  arr1[2] := 0.45; {第二线起点}
  arr1[3] := 0.55; {第二线终点}
  arr1[4] := 0.90; {第三线起点}
  arr1[5] := 1.00; {第三线终点}

  {粗细线复合画笔; 4 个元素决定 2 条子线; }
  arr2[0] := 0.00; {第一线起点}
  arr2[1] := 0.50; {第一线终点}
  arr2[2] := 0.90; {第二线起点}
  arr2[3] := 1.00; {第二线终点}

  LabeledEdit1.EditLabel.Caption := '笔宽';
  LabeledEdit1.Text := '10';
  RadioGroup1.Caption := '线型';
  RadioGroup1.Items.CommaText := '单实线,均分线,粗细线';
  RadioGroup1.ItemIndex := 0;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  r: TRect;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  g.Clear($FFFFFFFF);
  p := TGPPen.Create(aclCoral);

  p.SetWidth(StrToFloatDef(LabeledEdit1.Text, 10));

  case RadioGroup1.ItemIndex of
    1: p.SetCompoundArray(@arr1, Length(arr1));
    2: p.SetCompoundArray(@arr2, Length(arr2));
  end;

  g.DrawLine(p, 0, 0, ClientWidth, ClientHeight);
  r := ClientRect;
  g.DrawEllipse(p, MakeRect(r));
  InflateRect(r, -ClientWidth div 4, -ClientHeight div 4);
  g.DrawLine(p, 0, 0, ClientWidth, ClientHeight);
  g.DrawRectangle(p, MakeRect(r));

  p.Free;
  g.Free;
end;

procedure TForm1.LabeledEdit1Change(Sender: TObject);
begin
  Repaint;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  Repaint;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 206
  ClientWidth = 339
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object LabeledEdit1: TLabeledEdit
    Left = 264
    Top = 19
    Width = 67
    Height = 21
    EditLabel.Width = 61
    EditLabel.Height = 13
    EditLabel.Caption = 'LabeledEdit1'
    TabOrder = 0
    OnChange = LabeledEdit1Change
  end
  object RadioGroup1: TRadioGroup
    Left = 264
    Top = 46
    Width = 67
    Height = 66
    Caption = 'RadioGroup1'
    TabOrder = 1
    OnClick = RadioGroup1Click
  end
end

 
 
 
 
 

 

 

  

转载于:https://my.oschina.net/hermer/blog/319299

相关文章:

  • WinAPI: PolyBezierTo - 绘制贝塞尔线(更新当前位置)
  • Delphi 与 DirectX 之 DelphiX(44): TDIB.DoAddColorNoise();
  • MVC与MVP(转)
  • IDisposable资源释放接口
  • 多角度看.NET面试题
  • java/.net-常用工具下载地址常用学习网址快捷键
  • 財哥面京东dm的经历【帮財哥发的】
  • 基于数据访问的集合类型-领域驱动设计的又一种特定对象
  • LVS负载均衡中arp_ignore和arp_annonuce参数配置的含义
  • Flex入门(三)——微架构之Cairngorm
  • Clink(Powerful Bash-style command line editing )
  • 通俗理解C#委托和事件
  • Select Year,Month,Day date from DropDownList control in ASP.NET
  • Codeforces Round #261 (Div. 2) D 树状数组应用
  • MFC三种不同方式实现图形的保存和重绘---方法一:通过集合类CPtrArray保存点的坐标...
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 11111111
  • AHK 中 = 和 == 等比较运算符的用法
  • css选择器
  • MySQL-事务管理(基础)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从0实现一个tiny react(三)生命周期
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 思考 CSS 架构
  • 学习使用ExpressJS 4.0中的新Router
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • C# - 为值类型重定义相等性
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 如何在招聘中考核.NET架构师
  • #Ubuntu(修改root信息)
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.13) SiK无线电高级配置(五)
  • (8)STL算法之替换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (规划)24届春招和25届暑假实习路线准备规划
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (四) 虚拟摄像头vivi体验
  • (学习日记)2024.01.19
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .naturalWidth 和naturalHeight属性,
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET中使用Protobuffer 实现序列化和反序列化
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @JsonSerialize注解的使用
  • @Pointcut 使用
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ IOS ] iOS-控制器View的创建和生命周期