我需要在 TPanel 上绘制,理想情况下是直接绘制,这样我就没有其他组件在它上面妨碍 mousevent 事件捕获(我想在它上面画一点“大小抓地力”)。我该怎么做呢?
4 回答
要真正做到正确,您可能应该编写一个后代类。覆盖Paint
绘制尺寸控制夹点的方法,并覆盖MouseDown
、MouseUp
和MouseMove
方法以向控件添加调整大小功能。
我认为这是一个比尝试TPanel
在应用程序代码中使用 a 更好的解决方案,原因如下:
- 该
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 Components可以让您的生活更轻松的众多方式之一。我只是进入 Delphi,放在 TRzPanel 上,然后输入:
RzPanel1.Canvas.Rectangle...
我确信还有其他解决方案——但我不必用 Raize 来寻找它们。
(只是一个满意的客户大约 10 年......)
编辑:鉴于您的目标,以及您已经拥有 Raize Components 的声明,我还应该指出 TRzSizePanel 处理面板的大小调整和 OnCanResize 等有用事件(以确定您是否要允许调整到特定的新宽度或高度) .
最简单的方法是在面板上放置一个 TImage 。但是,如果您真的不想这样做,请在代码编辑器中键入 TCanvas,按 F1,然后愉快地了解它在后台是如何工作的。(别说我没警告你……)
如何为在运行时调整大小的控件添加大小句柄:http: //delphi.about.com/library/weekly/aa110105a.htm