【问题标题】:Implementing a TLabel with TabStop and FocusRect?用 TabStop 和 FocusRect 实现 TLabel?
【发布时间】:2014-05-20 08:38:34
【问题描述】:

我正在使用 Delphi7,我正在尝试实现一个 LinkLabel,就像您可以在 Windows Vista 及更高版本的控制面板下找到的那样。

在悬停时更改光标/颜色非常简单,我唯一需要做的就是让 TLabel 接收制表位并在其周围绘制一个焦点矩形

关于如何做到这一点的任何想法?我了解 TLabel 因其性质而不会收到标签。还有 TStaticText 确实接收选项卡,但它也没有焦点矩形。

【问题讨论】:

  • 也许您最好使用所有者绘制的按钮。然后你就拥有了开箱即用的所有功能,并且“只”需要让外观正确。

标签: delphi delphi-7 linklabel custom-draw tlabel


【解决方案1】:

这是一个派生的静态函数,它在聚焦时绘制一个焦点矩形。应该设置“TabStop”,或者应该添加检查代码。看起来不太好(控件实际上在所有边缘都没有空间放置线条),但无论如何:

type
  TStaticText = class(stdctrls.TStaticText)
  private
    FFocused: Boolean;
  protected
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  end;

...

procedure TStaticText.WMSetFocus(var Message: TWMSetFocus);
begin
  FFocused := True;
  Invalidate;
  inherited;
end;

procedure TStaticText.WMKillFocus(var Message: TWMKillFocus);
begin
  FFocused := False;
  Invalidate;
  inherited;
end;
procedure TStaticText.WMPaint(var Message: TWMPaint);
var
  DC: HDC;
  R: TRect;
begin
  inherited;
  if FFocused then begin
    DC := GetDC(Handle);
    GetClipBox(DC, R);
    DrawFocusRect(DC, R);
    ReleaseDC(Handle, DC);
  end;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多