文档章节

再学 GDI+[37]: TGPPen - TGPCustomLineCap、SetCustomStartCap、SetCustomEndCap

涂孟超
 涂孟超
发布于 2014/09/26 15:35
字数 424
阅读 7
收藏 0
点赞 0
评论 0
GDI+ 可以自定义线帽, 本例定义的起始线帽是一个小矩形、终止线帽是一个小三角形.

本例效果图:



代码文件:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  ph1,ph2: TGPGraphicsPath;
  cap1,cap2: TGPCustomLineCap;
  x1,y1,x2,y2: Integer;
  f: Boolean;
  PenColor: TColor;

procedure TForm1.FormCreate(Sender: TObject);
const
  pts: array[0..2] of TGPPoint = ((X:-3; Y:0),(X:3; Y:0),(X:0; Y:3));
begin
  {起始线帽需要的路径}
  ph1 := TGPGraphicsPath.Create;
  ph1.AddRectangle(MakeRect(-2, 0, 4, 3));

  {终止线帽需要的路径}
  ph2 := TGPGraphicsPath.Create;
  ph2.AddPolygon(PGPPoint(@pts), Length(pts));

  {自定义两个线帽}
  cap1 := TGPCustomLineCap.Create(nil, ph1);
  cap2 := TGPCustomLineCap.Create(nil, ph2);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ph1.Free;
  ph2.Free;
  cap1.Free;
  cap2.Free;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  f := True;
  x1 := X;
  y1 := Y;
  x2 := X;
  y2 := Y;

  Randomize;
  PenColor := Random($FFFFFF);              {给画笔一个随机颜色}
  Canvas.Pen.Color := $FFFFFF xor PenColor; {取画笔反色, 为了在 pmXor 模式下显示真实的颜色}
  Canvas.Pen.Width := 3;
  Canvas.Pen.Mode := pmXor;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if not f then Exit;

  Canvas.MoveTo(x1, y1);
  Canvas.LineTo(x2,y2);

  x2 := X;
  y2 := Y;

  Canvas.MoveTo(x1, y1);
  Canvas.LineTo(x2,y2);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  g: TGPGraphics;
  p: TGPPen;
begin
  if not f then Exit;

  f := False;

  g := TGPGraphics.Create(Canvas.Handle);
  p := TGPPen.Create(ColorRefToARGB(PenColor), 3);

  {使用自定义线帽}
  p.SetCustomStartCap(cap1);
  p.SetCustomEndCap(cap2);

  g.DrawLine(p, x1, y1, x2, y2);

  p.Free;
  g.Free;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 193
  ClientWidth = 296
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnMouseDown = FormMouseDown
  OnMouseMove = FormMouseMove
  OnMouseUp = FormMouseUp
  PixelsPerInch = 96
  TextHeight = 13
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/06/15/1222741.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
使用GDI+绘制的360风格按钮控件

unit u360StyleButton; interface uses SysUtils, Classes, Controls, StdCtrls,Graphics, Messages, Windows, GDIPAPI, GDIPOBJ, GDIPUTIL; type TBtn360Style = class(TButton) private FB......

jingshishengxu ⋅ 2016/06/14 ⋅ 0

实战开发:新手小白如何用C++制作经典网游DNF

十年前,那时候的网吧还不叫网咖,那时候没有王者荣耀也没有英雄联盟,那时候梦幻西游刚推出珍宝阁系统,那时候巫妖王的灵魂还封闭在冰封王座。 寻仙、穿越火线、征途、天龙八部……同时在线...

stone15165 ⋅ 05/05 ⋅ 0

VS2012通过makefile编译OpenGL红宝书的示例代码

通过创建新VC项目,然后设置一堆属性,对于懒人来说还是太复杂了。既然它自带了makefile,可以尝试下使用nmake。 需要注意的是VS2012的安装目录里面已经没有GL的头文件和库文件。这个改动应该...

开源中国驻成都办事处 ⋅ 2014/07/19 ⋅ 0

C# WinForm开发系列 - GDI+

UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序。UI编程体现在两个方...

长征2号 ⋅ 2017/11/14 ⋅ 0

VC 6.0 配置和使用gdi+

GDI+ GDI+是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C++类实现的应用程序编程接口。顾名思义,GDI+是以前版本GDI的继承者,出于兼容性考虑,W...

junwong ⋅ 2012/03/23 ⋅ 0

vs 2005 添加GDI配置

在VS2005当中由于自带了GDI+的开发包,所以不需要在安装GDI开发包,这些头文件的位置由VS中的$(WindowsSdkDir)/include自动包含进来了 下午自己添加了好几次,总是出现有报错,,在 stdafx.h...

种地瓜 ⋅ 2015/12/08 ⋅ 0

C# chart控件绘制曲线

在.NET中以前经常用GDI去绘制,虽然效果也不错,自从.NET 4.0开始,专门为绘制图表而生的Chart控件出现了,有了它,就可以轻松的绘制你所需要的曲线图、柱状图什么的了。 参考文章 1. 使用....

橘子红了呐 ⋅ 2017/11/07 ⋅ 0

win图形编程与打印驱动

最近一个项目做打印属性的二次开发,目前的情况是利用虚拟打印机服务管理打印机和打印任务。原先没有做过这种经验,把最近看的东西整理一下。 1.windows编程 鉴于原先看过Petzold的书或者有过...

im天行 ⋅ 2012/11/20 ⋅ 0

链接错误 undefined reference to `SetStretchBltMode@8'

我已经把 gdi32.lib的库文件放到目录下了。尝试了没用 把gdi32.dll放进去也没用。 我查了MSDN了这个函数是在Gdi32.lib中的。并且我查看了gdi32.lib 和gdi32.dll的导出函数里面的确有这些函数...

Mario_Q ⋅ 2013/08/20 ⋅ 1

深度解读 - Windows 7核心图形架构细致分析(转贴)

原帖地址:http://technet.microsoft.com/zh-cn/library/ee921514.aspx 如现在大家所想的那样, Windows7 其实是 Windows Vista 的改进版。 Windows 7 在 Windows Vista 的基础上进行了大量的...

迈克老狼1 ⋅ 2012/12/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 27分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 44分钟前 ⋅ 0

001. 深入JVM学习—Java运行流程

1. Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存...

影狼 ⋅ 59分钟前 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部