AsuYuHomepage
トップページ サイトの説明 子供の成長記録 JM BAR Delphi リンク集
Home>>プログラミング>>Tips&Tricks>>Canvasプロパティがないコントロールに描画をする
Delphi Tips
Delphi Win32API
ダウンロード

Delphi Tips & Tricks

Canvasプロパティがないコントロールに描画をする

 TMemoやTEdit、TPanelなどの一部のWindowsコントロールのラッパーコンポーネントには、普段描画に使うCanvasプロパティがありません。
 しかしWinAPIのGDI関数だけを使って、これらのコントロールに描画を行うのではなくTCanvasを生成してVCLライクな描画ができるんです。

実際には、コントロールのWM_PAINTメッセージに同期して描画処理をおこなわないと、描きなおされる時に描画内容は消えてしまいます
コントロールのWM_PAINTを捕まえるには、次頁のサブクラス化の手法を使ったりして行います。
procedure TForm1.Button1Click(Sender: TObject);
var
  DC: HDC;
  ACanvas: TCanvas;
  i :Integer;
  S :string;
  R :TRect;
begin
  S :='Delphi Tips & Tricks';
  R :=Panel1.ClientRect;
  //Panel1のデバイスコンテキストのハンドルを取得
  DC :=GetDC(Panel1.Handle);
  try
    ACanvas :=TCanvas.Create;
    try
      //取得したHDCを生成したTCanvasに関連つける
      ACanvas.Handle :=DC;
      //---描画処理開始---
      ACanvas.Pen.Color :=clRed;
      ACanvas.Brush.Style :=bsClear;
      for i :=0 to 14 do
        ACanvas.Rectangle(10 + 5*i, 10 + 5*i,
                          Panel1.ClientWidth -10 - 5*i,
                          Panel1.ClientHeight-10 - 5*i);
      ACanvas.Font.Style :=[fsBold];
      ACanvas.Font.Size :=20;
      DrawText(ACanvas.Handle, PChar(S), Length(S), R,
               DT_CENTER or DT_VCENTER or DT_SINGLELINE);
      //---ここまで---
    finally
      ACanvas.Free;
    end;
  finally
    ReleaseDC(Panel1.Handle, DC);
  end;
end;