AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
Delphi2010 ペイントボックス(PaintBox) 2010/10/27
 
前回は[System]内の「Timer」(タイマー)について見ましたので、今回は同じく[System]内の「PaintBox」(ペイントボックス)について見てみます。ペイントボックスは Delphi6 にもあります。

 
取り合えずペイントボックスを配置してみます。1つ目ですので Nameプロパティは「PaintBox1」となります。

 
ペイントボックスは、絵を描く領域を示し、キャンバス(Canvasプロパティ)を持ちます。絵を描く領域という事では、イメージ(Image)や、同じく Canvasプロパティを持つ他のコンポーネントも存在しますが、他のコンポーネントはそれ用の用途・意味をもっていますから別であるとして、イメージとの違いは、ペイントボックスには画像ファイルを直接開いたり保存したり、という機能はありません。また、ペイントボックスの上に他の画面が覆い重なった際に再描画という事で OnPaintイベントは発生しますが、以前の状態を覚えていて自動的に元の状態に戻してくれる、という機能もありませんから、自分で再描画を行うプログラムを記述する=OnPaintイベントハンドラで再描画を行うコーディングを行う、という事が必要です。
 
ただ、
Delphi2010だからなのか、いや、おそらくは Windows7/Vistaだからだと思いますが、例えば、メインメニューで隠してしまったはず・他のアプリケーションで重ねてしまったであろうペイントボックスの領域は、OnPaintイベントハンドラで再描画を行っていないにも関わらず、画面は乱れずそのまま保持されています。という以前に、OnPaintイベントも発生していないようです。
 
[描画]ボタンをクリックした時のイベントハンドラを
procedure TForm1.Button1Click(Sender: TObject);
var
 i : integer ;
begin
 with PaintBox1 do begin
  for i:=0 to Height do begin
   Canvas.Pen.Color := i ;
   Canvas.MoveTo(0,i);
   Canvas.LineTo(Width,i);
  end;
 end;
end;
として、これ以外にペイントボックス内を描画させる部分は無いのですが、実際に実行をすると、下記のように、ペイントボックス内が乱れていない、という事が実に気掛かりです。



メインメニューで隠しても・・・


ペイントボックス画面は乱れない


他のアプリケーションで隠しても・・・


ペイントボックス画面は乱れない
 
但し、画面をリサイズした場合には、ペイントボックス画面は乱れるようです。



こういった場合のために、従来同様、OnPaintイベントハンドラで再描画を行うようにしておけば良いでしょう。上記の場合は単純に、
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
 Button1Click(Sender);
end;
のようにしておけば問題は無いです。
 
WindowsVista/7では、従来のWindows95/98/Me/NT/2000/Xpとは異なり、画面描画では DirectX が絡んでいるようです。DirectX は独自のサーフェイスを持ち、これの管理・描画を行うようになっていますが、この関連で従来の動作と異なってきているのやもしれません。
 
 
<オブジェクトインスペクタ>を見てみると・・・

 

 

別段、変わったところは何も無さそうですね。
 
 
TCanvasのプロパティとしては、
Handle(キャンバスのハンドルを指定)、Brush(図形と背景を塗りつぶすのに使用する色と模様を指定)、CopyMode(グラフィックイメージをキャンバスにどのようにコピーするかを指定)、Font(イメージ上にテキストを書くときに使用するフォントを指定)、Pen(キャンバスが線とアウトライン形状の描画に使用するペンの種類を指定)、が従来同様、ありますね。
メソッドについても、ヘルプを見ると下記のようにありますし、
function GetHandle: HDC;
 Handle プロパティの取得アクセサ メソッドを表します。
 
procedure SetBrush(Value: TBrush);
 Brush プロパティの設定アクセサ メソッドを表します。
 
procedure SetFont(Value: TFont);
 Font プロパティの設定アクセサ メソッドを表します。
 
procedure SetHandle(Value: HDC);
 Handle プロパティの設定アクセサ メソッドを表します。
 
procedure SetPen(Value: TPen);
 Pen プロパティの設定アクセサ メソッドを表します。
 
procedure CreateHandle; virtual;
 新しいハンドルをキャンバスに割り当てます。
 
procedure CopyRect(const Dest: TRect; Canvas: TCanvas; const Source: TRect);
 キャンバスのイメージの一部を別のキャンバスにコピーします。
 
procedure Draw(X: Integer; Y: Integer; Graphic: TGraphic); overload; override;
 Graphic パラメータで指定したグラフィックを,座標(X, Y)で定義されるキャンバス上の位置に描画します。
 
procedure Draw(X: Integer; Y: Integer; Graphic: TGraphic; Opacity: Byte); overload; override;
 Graphic パラメータで指定したグラフィックを,座標(X, Y)で定義されるキャンバス上の位置に描画します。
 
procedure Ellipse(X1: Integer; Y1: Integer; X2: Integer; Y2: Integer); overload; override;
 外接四角形で定義される楕円をキャンバスに描画します。
 
function HandleAllocated: Boolean;
 TCanvas オブジェクトがデバイスコンテキストへのハンドルを取得しているかどうかを示します。
 
procedure Rectangle(X1: Integer; Y1: Integer; X2: Integer; Y2: Integer); overload; override;
 キャンバス上に四角形を描画します。
 
procedure RoundRect(X1: Integer; Y1: Integer; X2: Integer; Y2: Integer; X3: Integer; Y3: Integer); overload; override;
 角の丸い四角形をキャンバス上に描画します。
 
procedure TextRect(var Rect: TRect; var Text: string; TextFormat: TTextFormat = []); overload; override;
 クリッピング範囲に文字列を書き込みます。
 
procedure TextRect(Rect: TRect; X: Integer; Y: Integer; const Text: string); overload; override;
 クリッピング範囲に文字列を書き込みます。
また、TCustomCanvas のプロパティ・メソッド・イベントも継承しますから、上記に加えて以下も使用出来るでしょう(オーバーロードされるものを除く)。
event OnChanging public
 画像が変更される直前に発生します。
 
event OnChange public
 画像がちょうど変更されたときに発生します。
 
property TextFlags public
 テキストをキャンバスに書き込む方式を指定します。
 
property Pixels public
 現在の ClipRect 内のピクセルの色を指定します。
 
property PenPos public ペンの現在の描画位置を指定します。
 
property CanvasOrientation public
 キャンバスの方向を左から右か、右から左かどうかを決定します。
 
property LockCount public
 他のスレッドによる干渉をさけるために、キャンバスがロックされた回数を示します。
 
property ClipRect public
 クリップする矩形の境界を指定する読み取り専用プロパティです。
 
method Unlock public
 LockCount プロパティを減らし、LockCount が 0 に達すると他のスレッドが実行できるようになります。
 
method TryLock public
 キャンバスがロックされていない場合にロックします。
 
method TextWidth public
 現在のフォントで表示されている文字列の幅をピクセル単位で返します。
 
method TextRect public
 クリップした矩形内に文字列を書き込みます。
 
method TextOut public
 キャンバス上に点(X,Y)から文字列を書き、PenPos を文字列の最後の位置に更新します。
 
method TextHeight public
 現在のフォントで表示されている文字列の高さをピクセル単位で返します。
 
method TextExtent public
 現在のフォントで表示されている文字列の幅と高さをピクセル単位で返します。
 
method StretchDraw public
 Rect パラメータで指定される矩形に、Graphic パラメータで指定されるグラフィックを描画します。
 
method RoundRect public
 角が丸い矩形をキャンバスに描画します。
 
method Refresh public
 キャンバスの内部状態をデフォルト状態にリセットします。
 
method Rectangle public
 矩形をキャンバス上に描画します。
 
method PolyBezierTo public
 ベジエ曲線群を描画し、PenPos の値を更新します。
 
method PolyBezier public
 ベジエ曲線群を描画します。
 
method Polyline public
 Points に渡された各点をつなげて、現在のペンでキャンバスに一連の直線を描画します。
 
method Polygon public
 指定された各点をつなげて、最後の点から最初の点まで直線を描画して、キャンバスに一連の直線で囲まれた図形を描画します。
 
method Pie public
 矩形(X1,Y1)と(X2,Y2)で囲まれた楕円のパイ型部分をキャンバスに描画します。
 
method MoveTo public
 現在の描画位置を点(X,Y)に変更します。
 
method Lock public
 他のスレッドからキャンバスに描画できないようにします。
 
method LineTo public
 キャンバス上で PenPos から、X と Y で指定される点に直線を描画し、ペンの位置を(X,Y)に設定し直します。
 
method FrameRect public
 境界を示すために、現在のブラシで、キャンバスの矩形領域を描画します。
 
method FloodFill public
 キャンバスの領域を現在のブラシで塗りつぶします。
 
method FillRect public
 キャンバス上の指定矩形領域を現在のブラシで塗りつぶします。
 
method Ellipse public
 囲む矩形によって定義される楕円をキャンバスに描画します。
 
method DrawFocusRect public
 矩形の内側のオブジェクトにフォーカスがあることを示すために使用するスタイルで矩形を描画します。
 
method Draw public
 キャンバス上に、Graphic パラメータで指定された画像を、座標(X,Y)で指定された位置にレンダリングします。
 
method Chord public
 楕円と直線の交差で表現される閉じた図形(弓形)を描画します。
 
method BrushCopy public
 ビットマップの一部をキャンバス上の矩形領域にコピーします。ビットマップの色の 1 つはキャンバスのブラシで置き換えられます。
 
method Arc public
 指定された矩形で囲まれた楕円の周に沿って、弧を画像に描画します。
 
method RequiredState protected
 キャンバスの現在の状態を指定の要件を満たすように変更します。
 
method Changing protected
 キャンバスが変更される前に呼び出されます。
 
method Changed protected
 キャンバスが変更されたときに呼び出されます。
 
method SetPixel protected
 Pixels プロパティの設定アクセサ メソッドを表します。
 
method SetPenPos protected
 PenPos プロパティの設定アクセサ メソッドを表します。
 
method GetPixel protected
 Pixels プロパティの取得アクセサ メソッドを表します。
 
method GetPenPos protected
 PenPos プロパティの取得アクセサ メソッドを表します。
 
method GetClipRect protected
 ClipRect プロパティの取得アクセサ メソッドを表します。
 
method GetCanvasOrientation protected
 CanvasOrientation プロパティの取得アクセサ メソッドを表します。
ここではこれらを1つ1つ実装して動作チェックを行う、という事はしていませんが、まぁ、この辺りは従来と同じクラスである以上、そうそう変更があるとも思えませんし、追加機能があったとしても、従来の機能が全く別のものに変わってしまうというような事も基本的に有り得ないと思いますので、パスします。(※今後、もし何かあれば注記しておく必要があると思いますが・・・)
 
 
なお、TCanvasに対して上記のプロパティ・メソッドでそのまま扱い描画を行うようなプログラムは、従来同様、WindowsGDIでの描画を行うプログラムとなります。従って、WindowsVista/7 では WindowsGDIでの描画速度は余り速くない、といった評価は、そのまま、当てはまる事になりますので注意して下さい。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/10/26
 2010/10/27
▼2010/10/28
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.