كيفية الرسم على لوحة TPanel
-
03-07-2019 - |
سؤال
أحتاج إلى الرسم على لوحة TPanel، بشكل مثالي بشكل مباشر حتى لا يكون لدي مكون آخر فوقها يعيق تعويض حدث mousevent (أريد رسم "قبضة حجم" صغيرة عليها).كيف يجب أن أفعل هذا؟
المحلول
للقيام بذلك بشكل صحيح، ربما ينبغي عليك كتابة فئة سليل.تجاوز Paint
طريقة لرسم قبضة التحجيم، وتجاوز MouseDown
, MouseUp
, ، و MouseMove
طرق لإضافة وظيفة تغيير الحجم إلى عنصر التحكم.
أعتقد أن هذا حل أفضل من محاولة الاعتماد على ملف TPanel
في رمز التطبيق الخاص بك لعدة أسباب:
- ال
Canvas
الملكية محمية فيTPanel
, ، لذلك لا يمكنك الوصول إليه من خارج الفصل.يمكنك التغلب على ذلك من خلال اختيار النوع، لكن هذا غش. - تبدو "إمكانية تغيير الحجم" وكأنها إحدى ميزات اللوحة أكثر من كونها إحدى ميزات التطبيق، لذا ضعها في رمز تحكم اللوحة، وليس في الكود الرئيسي لتطبيقك.
إليك شيئًا لتبدأ به:
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;
نصائح أخرى
وهذا هو واحد من العديد من الطرق العديدة التي مكونات Raize يمكن أن تجعل حياتك أسهل. أنا مجرد الذهاب إلى دلفي، وانخفاض على TRzPanel، واكتب:
<اقتباس فقرة>وRzPanel1.Canvas.Rectangle ...
اقتباس فقرة>وأنا متأكد من أن هناك حلول أخرى - ولكن ليس لدي للبحث عنهم مع Raize
و(فقط من العملاء بالارتياح لنحو 10 عاما ...)
وتحرير: ونظرا هدفك، وبيان أن لديك مكونات Raize بالفعل، وأود أيضا أن أشير إلى أن TRzSizePanel مقابض تغيير الحجم من الأحداث لوحة ومفيدة مثل OnCanResize (لتحديد ما إذا كنت تريد السماح تغيير حجم لعرض جديد خاص أو الارتفاع).
وأبسط طريقة للقيام بذلك هي وضعت للتو TImage على لوحة. ولكن إذا كنت حقا لا تريد أن تفعل ذلك، اكتب TCanvas إلى محرر التعليمات البرمجية، ضرب F1، والمتعة والتعلم عن الكيفية التي تعمل تحت غطاء محرك السيارة. (لا أقول إنني لم يخطر لك ...)
وكيفية إضافة الحجم مقابض إلى عناصر التحكم التي تم تغيير حجمها في وقت التشغيل: http://delphi.about.com/library/weekly/aa110105a.htm
وTAdvPanel: http://www.tmssoftware.com/site/advpanel.asp