Delphi GDI+ 绘图 (1)

绘图需要有纸、画笔、画刷; Delphi 有 Canvas、Pen、Brush.

Canvas  :就是画布, 譬如窗体的 Canvas 属性, 就是窗体的画布;
Pen :是画笔, 可以设置笔色、笔宽等等;
Brush: 是画刷, 可以设置填充颜色等等.


//举例:
{绘制直线}
procedure TForm1.Button1Click(Sender: TObject);
begin
  Canvas.Pen.Color := clRed; {设置画笔颜色}
  Canvas.Pen.Width := 2;     {设置画笔宽度}

  Canvas.MoveTo(10,10);      {直线起点}
  Canvas.LineTo(100,100);    {直线终点}

{这里的 Canvas 是简写, 也可以写做: Self.Canvas 或 Form1.Canvas }
end;

{矩形填充}
procedure TForm1.Button2Click(Sender: TObject);
begin
  Canvas.Brush.Color := clYellow; {设置画刷颜色, 也就是填充色}
  Canvas.FillRect(ClientRect);    {填充窗体客户区}
end;
 

最好用 TPaintBox 并在其 OnPaint 事件中绘图。而不是在Image控件中Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);



TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别

TGraphic 是 TBitmap 的父类, 很多绘图函数的参数是 TGraphic, 但我们经常给函数的是 TBitmap;

TBitmap 的很多功能都是继承自 TGraphic, 譬如:
Width、Height、LoadFromFile、SaveToFile、LoadFromStream、SaveToStream;
还有 Palette(调色板)、Transparent(是否透明) 等等.

TGraphic 实用举例:


var
  g: TGraphic;
begin
  g := TBitmap.Create;
  g.LoadFromFile('c:\temp\test.bmp');
  Self.Canvas.StretchDraw(ClientRect, g);
  g.Free;
end;


TCanvas 是一个绘图表面, 像画圆、画方、画笔、画刷等等都是它的功能;

控件的 Canvas 属性就是一个 TCanvas, 譬如:


var
  cvs: TCanvas;
begin
  cvs := Self.Canvas;
  cvs.Brush.Color := clYellow;
  cvs.Font.Color := clRed;
  cvs.Font.Name := '宋体';
  cvs.Font.Style := [fsBold];
  cvs.Font.Size := 24;
  cvs.TextOut(10, 10, '万一的 Delphi 博客');
end;


有些控件没有直接给 Canvas 属性, 我们也可以通过 TCanvas 获取它的绘图表面;
一切看得见的控件都应该有绘图表面, 不然系统是怎么画的?

譬如 TPanel 和 TButton 就没有 Canvas 属性, 没有是因为不常用, 如果需要可以这样:


var
  cvs: TCanvas;
begin
  cvs := TCanvas.Create;
  cvs.Handle := GetDC(Panel1.Handle);
  cvs.Pen.Width := 2;
  cvs.Pen.Color := clRed;
  cvs.Brush.Color := clYellow;
  cvs.Rectangle(5, 5, 50, 30);
  cvs.Free;
end;


再说 TBitmap, 它从 TGraphic 继承, 同时又把 TCanvas 纳为自己的属性;
所以它有了处理图片和绘图的双重功能!

给 TBitmap 也举个例子吧:


var
  bit: TBitmap;
begin
  bit := TBitmap.Create;
  bit.LoadFromFile('c:\temp\test.bmp');
  bit.Canvas.Brush.Style := bsClear;
  bit.Canvas.Pen.Color := clRed;
  bit.Canvas.Pen.Width := 2;
  bit.Canvas.Ellipse(2, 2, 88, 66);
  Self.Canvas.Draw(0, 0, bit);
  bit.Free;
end;


TPicture 是为了处理更多种格式的图片(譬如: ico、wmf 等)而存在的;
但它把 TGraphic、TCanvas、TBitmap 的功能通通借用过来, 所以功能更强大.

TPicture 和 TGraphic 重复的功能(譬如: LoadFromFile)都是内部调用的 TGraphic;
但如果要给它绘图, 需要调用: TPicture.Bitmap.Canvas.

下面的例子是用 TPicture 画了个十字图标(显示并保存起来):


var
  pic: TPicture;
begin
  pic := TPicture.Create;
  pic.Bitmap.SetSize(32, 32);
  pic.Bitmap.Canvas.Pen.Color := clRed;
  pic.Bitmap.Canvas.Pen.Width := 8;
  pic.Bitmap.Canvas.MoveTo(0, 16);
  pic.Bitmap.Canvas.LineTo(32, 16);
  pic.Bitmap.Canvas.MoveTo(16, 0);
  pic.Bitmap.Canvas.LineTo(16, 32);

  Self.Canvas.Draw(4, 4, pic.Graphic);
  pic.SaveToFile('c:\temp\test.ico');
  pic.Free;
end;


TImage 则主要是为了显示图片, 它主要包含的是 TPicture, 有了 TPicture 就有了上面的一切;
但因它是从 TControl -> TGraphicControl 继承下来的, 所以它具备了控件的基本能力(事件、消息等等).

TPaintBox 主要用于绘图, 没有处理图片的能力, 所以只包含了 TCanvas;
它也是从 TControl -> TGraphicControl 继承, 是能够交互的控件了.

很显然, TImage 比 TPaintBox 的能力强大; 但仅就绘图来讲, 还是 TPaintBox 轻便些.

 

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/05/3000834.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Visual C++6.0使用GDI+的一般方法 1. 载解压GDI+开发包; 2. 正确设置include & lib 目录; 3. stdafx.h 添加: #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include 4. 程序中添加GDI+的包含文件gdiplus.h以及附加的类库gdiplus.lib。 通常gdiplus.h包含文件添加在应用程序的stdafx.h文件中,而gdiplus.lib可用两种进行添加: 第一种是直接在stdafx.h文件中添加下列语句: #pragma comment( lib, "gdiplus.lib" ) 另一种方法是: 在VC.net中添加库文件在:项目菜单->属性->链接器->输入 举个例子: (1)在应用程序项目的应用类中,添加一个成员变量,如下列代码: ULONG_PTR m_gdiplusToken; 其中,ULONG_PTR是一个DWORD数据类型,该成员变量用来保存GDI+被初始化后在应用程序中的GDI+标识,以便能在应用程序退出后,引用该标识来调用Gdiplus:: GdiplusShutdown来关闭GDI+。 (2)在应用类中添加ExitInstance的重载,并添加下列代码用来关闭GDI+: int CGDITestApp::ExitInstance() { Gdiplus::GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } (3)在应用类的InitInstance函数中添加GDI+的初始化代码: 注意:下面这些GDI+的初始化代码必须放在m_pMainWnd->UpdateWindow();之前。 CWinApp::InitInstance(); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); (4)在需要绘图的窗口或视图类中添加GDI+的绘制代码。 下面分别就单文档和基于对话框应用程序为例,说明使用GDI+的一般过程和方法。 1. 在单文档应用程序中使用GDI+ 在上面的过程中,我们就是以一个单文档应用程序Ex_GDIPlus作为示例的。下面列出第4步所涉及的代码: void CGDITestView::OnDraw(CDC* pDC) { CGDITestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here usingnamespace Gdiplus; Graphics graphics(pDC->m_hDC); Pen newPen(Color(255,0,0),3); HatchBrush newBrush(HatchStyleCross,Color(255,0,255,0),Color(255,0,0,255));//创建一个填充画刷,前景色为绿色,背景色为蓝色 graphics.DrawRectangle(&newPen,50,50,100,60);// 在(50,50)处绘制一个长为100,高为60的矩形 graphics.FillRectangle(&newBrush,50,50,100,60); // 在(50,50)处填充一个长为100,高为60的矩形区域 } 编译并运行,结果如图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值