- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

使い方の例 Edit

自分の場合は、Canvasの生成コストを考え、使うときだけ生成するのではなく、
Surface生成時に生成しています。

DirectDraw管理クラス内で、

TDirectDrawEngine = class
private
  :
 FBackBufferCanvas: TDirectDrawCanvas;
property
 property BackBufferCanvas: TDirectDrawCanvas read FBackBufferCanvas;
end.

Surface生成ルーチンの後あたりで、

FBackBufferCanvas := TDirectDrawCanvas.Create(FBackBuffer);

Surface開放時に一緒に開放するのも忘れずに。

実際に使うとき

with DirectDrawEngine.BackBufferCanvas do
  if Enabled then try
    Brush.Style := bsSolid;
    Brush.Color := clBlue
    FillRect(MogeMogeRect);
  finally
    Release;
  end;

こういうふうに入れ子も可

with DirectDrawEngine.BackBufferCanvas do
  if Enabled then try
    Brush.Style := bsSolid;
    DrawTest;     
    FillRect(MogeMogeRect);
  finally
    Release;
  end;

proceure DrawTest;
begin
  with DirectDrawEngine.BackBufferCanvas do
    if Enabled then try
      FillRect(HogeRect);
    finally
      Release;
    end;
end;

ソース Edit

interface

uses
  Windows, Graphics, DirectX, O3UtilsUnit;
type
  TDirectDrawCanvas = class(TCanvas)
  private
    FSurface: IDirectDrawSurface;
    FDeviceContext: HDC;
    FCountForEnabled: Integer;

    function GetEnabled: Boolean;
  public
    constructor Create(ASurface: IDirectDrawSurface);
    destructor Destroy; override;

   procedure Release;
   property Enabled: Boolean read GetEnabled;
 end;

implementation

uses UEExcept;

{ TDirectDrawCanvas }
 
constructor TDirectDrawCanvas.Create(ASurface: IDirectDrawSurface);
begin
  inherited Create;
  FSurface := ASurface;
  FDeviceContext := 0;
  FCountForEnabled := 0;
end;

destructor TDirectDrawCanvas.Destroy;
begin
  Assert(FCountForEnabled = 0, 
    'TDirectDrawCanvas で Enabled と Release との対応が取れていません');
  inherited;
end;

procedure TDirectDrawCanvas.Release;
begin
  Dec(FCountForEnabled);
  if FCountForEnabled = 0 then begin
    Handle := 0;
    FSurface.ReleaseDC(FDeviceContext);
    FDeviceContext := 0;
  end;
end;

function TDirectDrawCanvas.GetEnabled: Boolean;
begin
  if FCountForEnabled = 0 then begin
    Result := FSurface.GetDC(FDeviceContext) = DD_OK;
    if Result then
      Handle := FDeviceContext
    else begin
      Handle := 0;
      FDeviceContext := 0;
      
      // 抜ける[modified by TOBY 2003/05/29 20:13:36]
      Exit;
    end;
  end
  else
    Result := True;
  Inc(FCountForEnabled);
end;
  • GetEnabledでGetDCに失敗した時にも、Inc(FCountForEnabled);していたのを修正 -- TOBY 2003-05-29 (木) 20:13:04

参考 Edit

  • インプレス『Delphi2.0J 32bitパワープログラミング』(Charles Calvert著)



Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2004-12-15 Wed 06:16:17 JST (5473d)