DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: luismasgoret
今日帖子: 0
在线用户: 8
导航: 论坛 -> 发布代码 斑竹:liumazi,ruralboy  
作者:
男 dawnhawk (dawnhawk) ★☆☆☆☆ -
盒子活跃会员
2022/4/30 16:22:29
标题:
自定义HintWindow 浏览:1250
加入我的收藏
楼主: 喜欢Obsidian的Hint,像微信的对话框,可以根据控件的Align属性在不同方向弹出。于是自己做了一个,希望大家给点意见。

自定义HintWindow的特点:
1. 根据控件的Align属性,在不同方向弹出。alNone/alClient/alCustom缺省是左边,可以自己指定;
2. 可以在程序里全局使用,代替原有THintWindow,也可以指定某个/某类控件使用,程序里其它控件继续使用原有HintWindow。

使用方法:
把HkHintWindow.pas和DelphiVersions.inc加入工程文件。
1. 全局使用:
   在工程文件或主窗口Create事件里添加:THkHintWindow.Init;
   或者把HkHintWindow.pas最后的四行代码的注释全部去掉,那就不需要调用Init。
2. 指定控件:

// 主窗口声明函数:
procedure DoShowHint(var HintStr: String; var CanShow: Boolean; var HintInfo: THintInfo);

// 主窗口Create事件
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := DoShowHint;
  THkHintWindow.Init;
end;

procedure TfrmMain.DoShowHint(var HintStr: String; var CanShow: Boolean;
  var HintInfo: THintInfo);
begin
  if HintInfo.HintControl is TPageControl then // TPageControl类型使用
  //if HintInfo.HintControl = Button2 then // 单个按钮使用
    HintInfo.HintWindowClass := THkHintWindow
  else HintInfo.HintWindowClass := THintWindow; // 其它类型使用原有Hint
end;
此帖子包含附件:dawnhawk_2022430162229.zip 大小:3,712B
----------------------------------------------
-
作者:
男 dawnhawk (dawnhawk) ★☆☆☆☆ -
盒子活跃会员
2022/4/30 16:24:38
1楼: 示例图片
此帖子包含附件:
JPEG 图像
大小:101.7K
----------------------------------------------
-
作者:
男 dawnhawk (dawnhawk) ★☆☆☆☆ -
盒子活跃会员
2022/4/30 16:31:30
2楼: 控件指定方向的方法,以上面图片右上角的TPageControl为例:
新建单元文件(Unit),名门为:uEnhComponent.pas

uses Vcl.ComCtrls;

type
  TPageControl = class(Vcl.ComCtrls.TPageControl)
  private
    FTabRect: array of TRect; // Tab Rect
    procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
  end;
  
procedure TPageControl.CMHintShow(var Message: TCMHintShow);
var
  Id: integer;

  function MouseAt(X, Y: integer): integer;
  begin
    for Result := 0 to Length(FTabRect) - 1 do
    begin
      if PtInRect(FTabRect[Result], Point(X, Y)) then
        Exit;
    end;

    Result := -1;
  end;

begin
  with Message.HintInfo^ do
  begin
    Id := MouseAt(CursorPos.X, CursorPos.Y);
    if Id <> -1 then
    begin
      HintStr := Self.Pages[Id].Hint;
      CursorRect := FTabRect[Id];
      HintData := TCustomData(Ord(alTop)); // Hint箭头方向
    end
    else HintStr := '';
  end;
end;

然后在放置TPageControl的窗口,引用uEnhComponent单元,确认:
uEnhComponent.pas必须放在Vcl.ComCtrls之后:
uses ...Vcl.ComCtrls, uEnhComponents...
----------------------------------------------
-
作者:
男 arhaha (lin) ★☆☆☆☆ -
盒子活跃会员
2022/4/30 19:19:54
3楼: 按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 zhuzh_yuy (华) ★☆☆☆☆ -
普通会员
2022/4/30 20:45:07
4楼: 厉害
----------------------------------------------
-
作者:
男 dawnhawk (dawnhawk) ★☆☆☆☆ -
盒子活跃会员
2022/4/30 20:48:53
4楼: 一楼的代码有个错误。指定控件使用HintWindow时,在FormCreate事件里不能执行Init函数。

// 主窗口Create事件
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  Application.OnShowHint := DoShowHint;
end;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行86.91406毫秒 RSS