• Delphi 与 DirectX 之 DelphiX(18): TDXDraw 中描绘图片的命令



    前面的绘图命令都是来自 TDXImageList,
    准确地说是来自 TDXImageList.Items 所包含的 TPictureCollectionItem 对象.

    那 TDXDraw 本身有没有绘图命令呢?
    TDXDraw 本身没有绘图命令, 但它的有绘图表面(TDirectDrawSurface), 譬如: Surface、Primary;
    TDXDraw 的绘图表面有更多的绘图命令, 另外 TDXDraw 可以多个绘图表面.

    TDirectDrawSurface 的绘图命令和 TPictureCollectionItem 的绘图命令最大的区别是它们的图像来源;
    TDirectDrawSurface 的图像来源必须是另一个已绘制好的 TDirectDrawSurface 对象.

    这里列举的只是 TDirectDrawSurface 和 TPictureCollectionItem 类似的描绘图片的命令:
    TDirectDrawSurface.Draw(); TDirectDrawSurface.StretchDraw(); TDirectDrawSurface.DrawAdd(); TDirectDrawSurface.DrawAlpha(); TDirectDrawSurface.DrawSub(); TDirectDrawSurface.DrawAddCol(); TDirectDrawSurface.DrawAlphaCol(); TDirectDrawSurface.DrawSubCol(); TDirectDrawSurface.DrawRotate(); TDirectDrawSurface.DrawRotateAdd(); TDirectDrawSurface.DrawRotateAdd(); TDirectDrawSurface.DrawRotateAlpha(); TDirectDrawSurface.DrawRotateSub(); TDirectDrawSurface.DrawRotateAddCol(); TDirectDrawSurface.DrawRotateAlphaCol(); TDirectDrawSurface.DrawRotateCol(); TDirectDrawSurface.DrawRotateSubCol(); TDirectDrawSurface.DrawWaveX(); TDirectDrawSurface.DrawWaveXAdd(); TDirectDrawSurface.DrawWaveXAlpha(); TDirectDrawSurface.DrawWaveXSub(); TDirectDrawSurface.DrawWaveY(); TDirectDrawSurface.DrawWaveYAdd(); TDirectDrawSurface.DrawWaveYAlpha(); TDirectDrawSurface.DrawWaveYSub();

    本例效果图:



    代码文件:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DXDraws, StdCtrls;
    
    type
      TForm1 = class(TForm)
        DXDraw1: TDXDraw;
        DXImageList1: TDXImageList;
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    var
      PicItem: TPictureCollectionItem;
    
    procedure TForm1.FormCreate(Sender: TObject);
    const
      ImgPath1 = 'C:\Temp\DelphiX.bmp';
    begin
      DXImageList1.DXDraw := DXDraw1;
      PicItem := TPictureCollectionItem(DXImageList1.Items.Add);
      PicItem.Picture.LoadFromFile(ImgPath1);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MySurface: TDirectDrawSurface;
    begin
      MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
      PicItem.Restore; {Surface.Draw 的矩形范围好像能直接作用到列表中的图片, 需要恢复一下}
      MySurface.SetSize(PicItem.Width, PicItem.Height);
      MySurface.Fill(0);
      PicItem.Draw(MySurface, 0, 0, 0);
    
      DXDraw1.Surface.Fill(0);
      DXDraw1.Surface.Draw((DXDraw1.Width - MySurface.Width) div 2,
                           (DXDraw1.Height - MySurface.Height) div 2,
                           MySurface);
      DXDraw1.Flip;
      FreeAndNil(MySurface);
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    var
      MySurface: TDirectDrawSurface;
      m,n: Integer;
    begin
      m := 40; n := 15;
      MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
      PicItem.Restore; {Surface.Draw 的矩形范围好像能直接作用到列表中的图片, 需要恢复一下}
      MySurface.SetSize(PicItem.Width, PicItem.Height);
      MySurface.Fill(0);
      PicItem.Draw(MySurface, 0, 0, 0);
    
      DXDraw1.Surface.Fill(0);
      DXDraw1.Surface.Draw((DXDraw1.Width - MySurface.Width) div 2 + m,
                           (DXDraw1.Height - MySurface.Height) div 2 + n,
                           Bounds(m, n, MySurface.Width - m*2, MySurface.Height - n*2),
                           MySurface);
      DXDraw1.Flip;
      FreeAndNil(MySurface);
    end;
    
    end.
    

  • 相关阅读:
    阿里P8聊并发编程:线程中断和终止
    浅谈Java中的锁:Synchronized、重入锁、读写锁
    史上最全Java面试题!进程,线程相关部分下篇(带全部答案)
    @史上最全Java面试题!关于volatile关键字篇(带全部答案)
    @史上最全Java面试题!进程,线程相关部分上篇(带全部答案)
    一道号称“史上最难”java面试题引发的线程安全思考,掌握了吗?
    stopWatch
    mysql语句及执行计划
    Awr
    文件下载
  • 原文地址:https://www.cnblogs.com/del/p/1375723.html
Copyright © 2020-2023  润新知