[ACCEPTED]-How to draw on a TPanel-tpanel
To really do it right, you should probably 7 write a descendant class. Override the Paint
method 6 to draw the sizing grip, and override the 5 MouseDown
, MouseUp
, and MouseMove
methods to add resizing functionality 4 to the control.
I think that's a better solution 3 than trying to draw onto a TPanel
in your application 2 code for a couple of reasons:
- The
Canvas
property is protected inTPanel
, so you have no access to it from outside the class. You can get around that with type-casting, but that's cheating. - The "resizability" sounds more like a feature of the panel than a feature of the application, so put it in code for the panel control, not in your application's main code.
Here's something 1 to get you started:
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;
This is one of the many many ways that Raize Components can 11 make your life easier. I just go into Delphi, drop 10 on a TRzPanel, and type:
RzPanel1.Canvas.Rectangle...
I'm 9 sure there are other solutions - but I don't 8 have to look for them with Raize.
(just a 7 satisfied customer for about 10 years...)
EDIT: Given 6 your goal, and your statement that you have 5 Raize Components already, I should also 4 point out that TRzSizePanel handles resizing 3 of the panel and useful events like OnCanResize 2 (to determine whether you want to allow 1 resizing to a particular new width or height).
The simplest way to do it is to just put 5 a TImage on the panel. But if you really 4 don't want to do that, type TCanvas into 3 the code editor, hit F1, and have fun learning 2 about how it works under the hood. (Don't 1 say I didn't warn you...)
How to Add Size Handles to Controls being 1 Resized at Run-Time: http://delphi.about.com/library/weekly/aa110105a.htm
TAdvPanel: http://www.tmssoftware.com/site/advpanel.asp
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.