6

我需要在 TPanel 上绘制,理想情况下是直接绘制,这样我就没有其他组件在它上面妨碍 mousevent 事件捕获(我想在它上面画一点“大小抓地力​​”)。我该怎么做呢?

4

4 回答 4

10

要真正做到正确,您可能应该编写一个后代类。覆盖Paint绘制尺寸控制夹点的方法,并覆盖MouseDownMouseUpMouseMove方法以向控件添加调整大小功能。

我认为这是一个比尝试TPanel在应用程序代码中使用 a 更好的解决方案,原因如下:

  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;
于 2009-05-02T05:15:05.540 回答
7

这是Raize Components可以让您的生活更轻松的众多方式之一。我只是进入 Delphi,放在 TRzPanel 上,然后输入:

RzPanel1.Canvas.Rectangle...

我确信还有其他解决方案——但我不必用 Raize 来寻找它们。

(只是一个满意的客户大约 10 年......)

编辑:鉴于您的目标,以及您已经拥有 Raize Components 的声明,我还应该指出 TRzSizePanel 处理面板的大小调整和 OnCanResize 等有用事件(以确定您是否要允许调整到特定的新宽度或高度) .

于 2009-05-02T01:51:11.820 回答
4

最简单的方法是在面板上放置一个 TImage 。但是,如果您真的不想这样做,请在代码编辑器中键入 TCanvas,按 F1,然后愉快地了解它在后台是如何工作的。(别说我没警告你……)

于 2009-05-02T00:25:47.140 回答
2

如何为在运行时调整大小的控件添加大小句柄:http: //delphi.about.com/library/weekly/aa110105a.htm

TAdvPanel: http ://www.tmssoftware.com/site/advpanel.asp

于 2009-05-02T03:42:51.643 回答