TPanelを描画する必要があります。理想的には、直接マウスイベントイベントのトラッピングを行う別のコンポーネントがありません(私は、グリップ ")。これを行うにはどうしたらいいですか?TPanelでの描画方法
答えて
本当にそれが正しい、あなたはおそらく子孫クラスを記述する必要がありません。 Paint
メソッドをオーバーライドしてサイズグリップを描画し、MouseDown
,MouseUp
、およびMouseMove
メソッドをオーバーライドして、サイズ変更機能をコントロールに追加します。
私はそれが理由のカップルのためのアプリケーションコードでTPanel
上に描画しようとするよりも、よりよい解決策だと思う:
Canvas
プロパティが
TPanel
で保護されたので、あなたは、外部からのそれへのアクセスを持っていない
- クラス。あなたは型キャスティングでそれを回避することができますが、それは不正です。
- 「サイズ変更可能性」は、アプリケーションの機能よりもパネルの機能に似ているため、アプリケーションのメインコードではなく、パネルコントロール用のコードに入れてください。
ここであなたが始めるために何か:私はあなたが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;
ありがとうRob!あなたが何を記述しているのか(寛大にいくつかの「初心者コード」を提供しています)は私がやろうとしていることですが、図面/キャンバスの部分を理解する必要があることが分かりました。ここにあなたの入力に感謝します - スーパーが役立ちます! :-) – Jamo
これはまた賢明であることに注意してください。非ウィンドウ(そしておそらくKylix)のLazarusでは、.PAINTイベントの外でキャンバスにペイントすることはできません。 したがって、paintイベントでのみ描画が行われるように構造体を直接適用することは賢明です。 –
最も簡単な方法は、パネルにTImageを配置することです。しかし、実際にやりたいと思わない場合は、TCanvasをコードエディタに入力し、F1キーを押して、フードの仕組みについて学習してみましょう。 (私はあなたに警告していないと言ってはいけません...)
実際には、私はTCanvasの一部を行うことができると思っています。私は、作業する必要のあるサンプルコードを考えています...しかし、Panel自体のTCanvasをどのように公開しますか?私はこれを見つけましたが、何かが見つからないように思えます:http://www.mail-archive.com/[email protected]/msg00582.html – Jamo
そのリンクのTMyPanel(パネル)コードがキーです。キャンバスにアクセスする同じユニットに継承クラスを定義すると、そのクラスのすべての保護されたプロパティにアクセスできます。 Delphiの「ユニット内のクラスは友人」の原則の一部です。それはまたハックです。:-) –
「これはまたハックだ」と言えば、このアプローチはあなたの意見では不適切だということですか? (ちょうど私がこの質問を得ているこれらの偉大な答えから私ができることをすべて学ぶことを試みること)。 – Jamo
これは、Raize Componentsがあなたの人生をより簡単にすることができる多くの方法の1つです。私は、デルファイに入るTRzPanelにドロップし、タイプ:
RzPanel1.Canvas.Rectangle ...
私は他のソリューションがあります確信している - しかし、私はする必要はありませんRaizeでそれらを探します。
(ちょうど満足し、約10年間の顧客...)
EDIT:あなたの目標を考えると、あなたはすでにRaizeコンポーネントを持っているあなたの声明、私はまた、TRzSizePanelは、パネルのサイズ変更を処理していることを指摘しなければなりませんOnCanResize(特定の新しい幅や高さへのサイズ変更を許可するかどうかを決定する)のような有用なイベントです。サイズを追加する方法
偉大な - I * HAVE * Raize、これを見てみましょう(これは、 "実用的な単純/低レベル"を開始したいと思っていない理由ではありませんでしたが、これが最善のルートかもしれません)。これを投稿する時間をとってくれてありがとう。 – Jamo
Raizeはどのようにして通常のTPanelで描画するのですか? Raizeコントロールによって、何らかの理由でCanvasプロパティがprotectedではなくpublicになる場合を除きます。 –
コード例から、それがまさにその理由であるように見えます。 –
実行時にリサイズされているコントロールにハンドル: http://delphi.about.com/library/weekly/aa110105a.htm
TAdvPanel: http://www.tmssoftware.com/site/advpanel.asp
すばらしいリンク - ありがとう! – Jamo
- 1. TPanelで画像を描く方法
- 2. GLCanvasの描画方法は?
- 3. イメージの描画方法
- 4. アルゴリズムの描画方法
- 5. パスワードフィールドを描画する方法Ember.TextFieldを描画する方法ですか?
- 6. Unityの3Dゲームオブジェクトでの描画方法
- 7. 縁取り画像の描画方法
- 8. 指やiPhoneでの描画方法
- 9. Wxwidget C++での描画方法
- 10. テキスト領域での描画方法は?
- 11. グラフでの描画方法は?
- 12. フォームエリア外に描画するときの再描画方法
- 13. HTML5 customValidty - 描画方法は?
- 14. 画像を描画する方法
- 15. UIGraphicsBeginImageContext()で描画する方法
- 16. ダイナミックテーブルをcで描画する方法
- 17. AndroidでJButtonを描画する方法
- 18. UIViewでシグネチャを描画する方法
- 19. TTrayIconで描画する方法
- 20. PaintCodeでカスタムプログレスサイクルを描画する方法
- 21. iPhoneでpiechartを描画する方法
- 22. UIImageView(iOS4)で描画する方法
- 23. ダイアログコントロールでPNGを描画する方法
- 24. WPFでビデオフィードを描画する方法
- 25. MapViewでGMSPolylineを描画する方法
- 26. QOpenGLWidgetでフロントバッファに描画する方法
- 27. iphoneでテキストを描画する方法
- 28. XCBでタイトルバーを描画する方法
- 29. JPanelでベクターグラフィックを描画する方法
- 30. Coldfusionでエリアチャートを描画する方法
? ;)あなたの質問のように+1 –
それはタイプミスでした。私はそれを修正しました... –
ありがとう - 笑顔のための@MasterPeter、そして修正のための@Mason Wheeler。 – Jamo