2009-05-01 2 views
3

TPanelを描画する必要があります。理想的には、直接マウスイベントイベントのトラッピングを行う別のコンポーネントがありません(私は、グリップ ")。これを行うにはどうしたらいいですか?TPanelでの描画方法

+0

? ;)あなたの質問のように+1 –

+0

それはタイプミスでした。私はそれを修正しました... –

+0

ありがとう - 笑顔のための@MasterPeter、そして修正のための@Mason Wheeler。 – Jamo

答えて

9

本当にそれが正しい、あなたはおそらく子孫クラスを記述する必要がありません。 Paintメソッドをオーバーライドしてサイズグリップを描画し、MouseDown,MouseUp、およびMouseMoveメソッドをオーバーライドして、サイズ変更機能をコントロールに追加します。

私はそれが理由のカップルのためのアプリケーションコードでTPanel上に描画しようとするよりも、よりよい解決策だと思う:

Canvasプロパティが TPanelで保護されたので、あなたは、外部からのそれへのアクセスを持っていない
  1. クラス。あなたは型キャスティングでそれを回避することができますが、それは不正です。
  2. 「サイズ変更可能性」は、アプリケーションの機能よりもパネルの機能に似ているため、アプリケーションのメインコードではなく、パネルコントロール用のコードに入れてください。

ここであなたが始めるために何か:私はあなたがcompoenntsタグを作成するために管理したのか疑問

type 
    TSizablePanel = class(TPanel) 
    private 
    FDragOrigin: TPoint; 
    FSizeRect: TRect; 
    protected 
    procedure Paint; override; 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; 
     X, Y: Integer); override; 
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; 
     X, Y: Integer); override; 
    end; 

procedure TSizeablePanel.Paint; 
begin 
    inherited; 
    // Draw a sizing grip on the Canvas property 
    // There's a size-grip glyph in the Marlett font, 
    // so try the Canvas.TextOut method in combination 
    // with the Canvas.Font property. 
end; 

procedure TSizeablePanel.MouseDown; 
begin 
    if (Button = mbLeft) and (Shift = []) 
     and PtInRect(FSizeRect, Point(X, Y)) then begin 
    FDragOrigin := Point(X, Y); 
    // Need to capture mouse events even if the mouse 
    // leaves the control. See also: ReleaseCapture. 
    SetCapture(Handle); 
    end else inherited; 
end; 
+0

ありがとうRob!あなたが何を記述しているのか(寛大にいくつかの「初心者コード」を提供しています)は私がやろうとしていることですが、図面/キャンバスの部分を理解する必要があることが分かりました。ここにあなたの入力に感謝します - スーパーが役立ちます! :-) – Jamo

+0

これはまた賢明であることに注意してください。非ウィンドウ(そしておそらくKylix)のLazarusでは、.PAINTイベントの外でキャンバスにペイントすることはできません。 したがって、paintイベントでのみ描画が行われるように構造体を直接適用することは賢明です。 –

4

最も簡単な方法は、パネルにTImageを配置することです。しかし、実際にやりたいと思わない場合は、TCanvasをコードエディタに入力し、F1キーを押して、フードの仕組みについて学習してみましょう。 (私はあなたに警告していないと言ってはいけません...)

+0

実際には、私はTCanvasの一部を行うことができると思っています。私は、作業する必要のあるサンプルコードを考えています...しかし、Panel自体のTCanvasをどのように公開しますか?私はこれを見つけましたが、何かが見つからないように思えます:http://www.mail-archive.com/[email protected]/msg00582.html – Jamo

+1

そのリンクのTMyPanel(パネル)コードがキーです。キャンバスにアクセスする同じユニットに継承クラスを定義すると、そのクラスのすべての保護されたプロパティにアクセスできます。 Delphiの「ユニット内のクラスは友人」の原則の一部です。それはまたハックです。:-) –

+0

「これはまたハックだ」と言えば、このアプローチはあなたの意見では不適切だということですか? (ちょうど私がこの質問を得ているこれらの偉大な答えから私ができることをすべて学ぶことを試みること)。 – Jamo

7

これは、Raize Componentsがあなたの人生をより簡単にすることができる多くの方法の1つです。私は、デルファイに入るTRzPanelにドロップし、タイプ:

RzPanel1.Canvas.Rectangle ...

私は他のソリューションがあります確信している - しかし、私はする必要はありませんRaizeでそれらを探します。

(ちょうど満足し、約10年間の顧客...)

EDIT:あなたの目標を考えると、あなたはすでにRaizeコンポーネントを持っているあなたの声明、私はまた、TRzSizePanelは、パネルのサイズ変更を処理していることを指摘しなければなりませんOnCanResize(特定の新しい幅や高さへのサイズ変更を許可するかどうかを決定する)のような有用なイベントです。サイズを追加する方法

+0

偉大な - I * HAVE * Raize、これを見てみましょう(これは、 "実用的な単純/低レベル"を開始したいと思っていない理由ではありませんでしたが、これが最善のルートかもしれません)。これを投稿する時間をとってくれてありがとう。 – Jamo

+0

Raizeはどのようにして通常のTPanelで描画するのですか? Raizeコントロールによって、何らかの理由でCanvasプロパティがprotectedではなくpublicになる場合を除きます。 –

+1

コード例から、それがまさにその理由であるように見えます。 –

関連する問題