再学 GDI+[8] DrawRectangles - 绘制一组矩形

 

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormResize(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  GDIPOBJ,GDIPAPI;
var
  RectArr:array[0..31] of TGPRect; //声明矩形数组
procedure TForm1.FormPaint(Sender: TObject);
var
  g:TGPGraphics;
  p:TGPPen;
begin
  form1.DoubleBuffered:=True; //双缓冲开启就没那么闪烁了
  g:=TGPGraphics.Create(Canvas.Handle);
  g.Clear(aclWhite);
  p:=TGPPen.Create(aclRed,2);

  g.DrawRectangles(p,PGPRect(@RectArr),Length(RectArr)); //根据矩形数组画一组矩形
  p.Free;
  g.Free;
end;

procedure TForm1.FormResize(Sender: TObject);
var
  wi,hi,i:Integer;
  rect:TGPRect;
begin
  rect.X:=0;
  rect.Y:=0;
  rect.Width:=ClientWidth;
  rect.Height:=ClientHeight;

  wi:=rect.Width div Length(RectArr);  //计算32个矩形宽高的平均间距
  hi:=rect.Height div Length(RectArr);

  for I := 0 to Length(RectArr) - 1 do   //通过间距求出每一个矩形的坐标和宽高,并保存到数组中;
    begin
      inc(rect.X,wi);
      inc(rect.Y,hi);
      Dec(rect.Width,wi*2);   //因为坐标值是由0而不是1开始的,因此坐标XY加一份平均间距,宽高就要减两份
      Dec(rect.Height,hi*2);
      RectArr[i]:=rect;       //保存到数组
    end;
  Repaint;
end;

end.

转载于:https://www.cnblogs.com/keyvip/archive/2010/12/31/1922799.html

MFC(Microsoft Foundation Classes)是微软提供的一种用于开发Windows应用程序的基础框架,而GDI+(Graphics Device Interface Plus)是.NET Framework的一部分,提供了高级的图形功能。如果你想在MFC应用中使用GDI+绘制网格背景、正方形图案以及执行缩放、旋转和平移操作,你需要按照以下步骤进行: 1. **包含头文件**: 首先,确保在你的源文件中包含了必要的GDI+库和MFC相关的头文件: ```cpp #include "afxwin.h" #include <windows.gdiplus.h> using namespace Gdiplus; ``` 2. **创建Graphics对象**: 创建一个`Graphics`对象,它会在指定的窗口DC上工作: ```cpp CBitmap bitmap; // 图形上下文 Graphics graphics(hdc, &bitmap); ``` 这里的`hdc`是你的设备上下文(Device Context),通常来自于窗口。 3. **绘制网格**: 使用`DrawLines`或`DrawRectangle`方法,你可以画出网格线,但GDI+本身没有内置的网格绘制方法,可能需要自己计算并绘制。 4. **正方形图案**: 创建一个`SolidBrush`用颜色填充正方形,然后用`FillRectangle`或`Rectangle`方法来绘制正方形。如果要绘制图案,可以使用`Pen`配合`DrawRectangles`。 5. **缩放和旋转**: 使用`ScaleTransform`和`RotateTransform`方法对图形进行变换。例如: ```cpp Matrix matrix; matrix.Scale(scaleFactor, scaleFactor); // 缩放比例因子 graphics.Transform(matrix); matrix.Rotate(degreesToRadians(rotateDegree)); // 角度转弧度 graphics.Transform(matrix); ``` 6. **平移**: 使用`TranslateTransform`方法: ```cpp matrix.Translate(dx, dy); // 平移距离 (x, y) graphics.Transform(matrix); ``` 7. **保存结果**: 完成所有绘制后,记得调用`Graphics::Flush`来确保所有绘图都完成到屏幕上,然后释放资源: ```cpp bitmap.Save("output.png", &SaveOptions[0]); graphics.Release(); ``` 8. **事件处理和更新**: 如果你想根据用户的交互动态改变这些效果,你可能需要在消息循环中监听鼠标的移动和按键,然后相应地调整图形的状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值