سؤال

أحتاج إلى الرسم على لوحة TPanel، بشكل مثالي بشكل مباشر حتى لا يكون لدي مكون آخر فوقها يعيق تعويض حدث mousevent (أريد رسم "قبضة حجم" صغيرة عليها).كيف يجب أن أفعل هذا؟

هل كانت مفيدة؟

المحلول

للقيام بذلك بشكل صحيح، ربما ينبغي عليك كتابة فئة سليل.تجاوز Paint طريقة لرسم قبضة التحجيم، وتجاوز MouseDown, MouseUp, ، و MouseMove طرق لإضافة وظيفة تغيير الحجم إلى عنصر التحكم.

أعتقد أن هذا حل أفضل من محاولة الاعتماد على ملف TPanel في رمز التطبيق الخاص بك لعدة أسباب:

  1. ال Canvas الملكية محمية في TPanel, ، لذلك لا يمكنك الوصول إليه من خارج الفصل.يمكنك التغلب على ذلك من خلال اختيار النوع، لكن هذا غش.
  2. تبدو "إمكانية تغيير الحجم" وكأنها إحدى ميزات اللوحة أكثر من كونها إحدى ميزات التطبيق، لذا ضعها في رمز تحكم اللوحة، وليس في الكود الرئيسي لتطبيقك.

إليك شيئًا لتبدأ به:

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top