如何在 Listbox 上显示 In-place Tooltips

YOLO26算法保龄球馆保龄球目标检测+训练好的模型+743张数据集+pyqt可视化界面.zip 数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ... 立即下载

大家知道 TreeView 上的节点如果显示不完全,鼠标移上去会出现一提示,这就是 In-place Tooltips。下面这段代码在 Listbox 上实现这一功能(下面代码只是在标准 Listbox 上测试,如果是自画的,则要修改):

{直接将下面代码拷贝到新建工程中Form1的Unit1.pas文件即可运行,不需添加任何控件}

//------------------------------------------------------------------------------
//  在 ListBox 上实现 In-place Tooltips
//  原创作者:Joe Huang                 Email:Happyjoe@21cn.com
//
//------------------------------------------------------------------------------

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CommCtrl;

type
  //改写 TListBox 拦截 CM_MOUSELEAVE 消息
  TNewListBox = class(TListBox)
  protected
    { Protected declarations }
    procedure WndProc(var Message: TMessage); override;
  end;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    GHWND: HWND;
    TipVisable: Boolean;
    OldIndex, CurrentIndex: Integer;
    ti: TOOLINFO;
    ListBox1: TListBox;

    procedure InitListBox;   //动态生成 ListBox1
    procedure CreateTipsWindow;  //生成 Tooltip Window
    procedure HideTipsWindow;    //隐藏 Tooltip Window

    //拦截 WM_NOTIFY 消息,动态改变 Tooltip Window 显示的内容
    procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;

    procedure ListBox_MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ListBox_MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TNewListBox }

procedure TNewListBox.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    CM_MOUSELEAVE: Form1.HideTipsWindow;
  end;
  inherited WndProc(Message);
end;

{ TForm1 }

procedure TForm1.InitListBox;
begin
  ListBox1 := TNewListBox.Create(Self);
  ListBox1.Parent := Self;
  ListBox1.Left := 50;
  ListBox1.Top := 50;
  ListBox1.Width := 200;
  ListBox1.Height := 200;
  //添加几项,以供测试用
  ListBox1.Items.Append('happyjoe');
  ListBox1.Items.Append('Please send me email: happyjoe@21cn.com');
  ListBox1.Items.Append('Delphi 5 开发人员指南');
  ListBox1.Items.Append('Delphi 5.X ADO/MTS/COM+ 高级程序设计篇');

  ListBox1.OnMouseMove := ListBox_MouseMove;
  ListBox1.OnMouseDown := ListBox_MouseDown;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.Font.Name := 'Tahoma';
  InitListBox;
  CreateTipsWindow;
end;

procedure TForm1.CreateTipsWindow;
var
  iccex: tagINITCOMMONCONTROLSEX;
begin
  // Load the ToolTip class from the DLL.
  iccex.dwSize := sizeof(tagINITCOMMONCONTROLSEX);
  iccex.dwICC  := ICC_BAR_CLASSES;
  InitCommonControlsEx(iccex);

  // Create the ToolTip control.
  GHWND := CreateWindow(TOOLTIPS_CLASS, '',
                        WS_POPUP,
                        Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
                        Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
                        0, 0, hInstance,
                        nil);

  // Prepare TOOLINFO structure for use as tracking ToolTip.
  ti.cbSize := sizeof(ti);
  ti.uFlags := TTF_IDISHWND + TTF_TRACK + TTF_ABSOLUTE + TTF_TRANSPARENT;
  ti.hwnd   := Self.Handle;
  ti.uId    := ListBox1.Handle;
  ti.hinst  := hInstance;
  ti.lpszText  := LPSTR_TEXTCALLBACK;
  ti.rect.left := 0;
  ti.rect.top := 0;
  ti.rect.bottom := 0;
  ti.rect.right := 0;

  SendMessage(GHWND, WM_SETFONT, ListBox1.Font.Handle, Integer(LongBool(false)));
  SendMessage(GHWND,TTM_ADDTOOL,0,Integer(@ti));
end;

procedure TForm1.WMNotify(var Msg: TMessage);
var
  phd :PHDNotify;
  NMTTDISPINFO: PNMTTDispInfo;
begin
  phd := PHDNotify(Msg.lParam);
  if phd.Hdr.hwndFrom = GHWND then
  begin
    if phd.Hdr.code = TTN_NEEDTEXT then
    begin
      NMTTDISPINFO := PNMTTDispInfo(phd);
      NMTTDISPINFO.lpszText := PChar(ListBox1.Items[CurrentIndex]);
    end;
  end;
end;

procedure TForm1.ListBox_MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if TipVisable then     //当鼠标按下,将显示的 Tooltip Window 隐藏
  begin
    SendMessage(GHWND,TTM_TRACKACTIVATE,Integer(LongBool(false)), 0);
    TipVisable := false;
  end;
end;

procedure TForm1.ListBox_MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  Index: Integer;
  APoint: TPoint;
  ARect: TRect;
  ScreenRect: TRect;
begin
  Index := ListBox1.ItemAtPos(Point(X, Y), true);
  if Index = -1 then  //如果鼠标下没有 Item,将 Tooltip Window 隐藏
  begin
    SendMessage(GHWND,TTM_TRACKACTIVATE,Integer(LongBool(false)), 0);
    OldIndex := -1;
    TipVisable := false;
    exit;
  end;
  CurrentIndex := Index; 
  if Index = OldIndex then exit;  //如果鼠标在同一 Item 上移动,退出处理
  if TipVisable then   //先将显示的 Tooltip Window 隐藏
  begin
    SendMessage(GHWND,TTM_TRACKACTIVATE,Integer(LongBool(false)), 0);
    OldIndex := -1;
    TipVisable := false;
  end else
  begin
    ARect := ListBox1.ItemRect(Index);
    //判断该 Item 是否完全显示
    if (ARect.Right - ARect.Left - 2) >= ListBox1.Canvas.TextWidth(ListBox1.Items[Index]) then
    begin
      OldIndex := -1;
      exit;
    end;
    APoint := ListBox1.ClientToScreen(ARect.TopLeft);
    windows.GetClientRect(GetDesktopWindow, ScreenRect);
    //判断 Tooltip Window 显示后是否会超出屏幕范围,这里只判断了右边界
    if ListBox1.Canvas.TextWidth(ListBox1.Items[Index]) + APoint.X > ScreenRect.Right then
      APoint.X := ScreenRect.Right - ListBox1.Canvas.TextWidth(ListBox1.Items[Index]) - 5;
    SendMessage(GHWND,
                TTM_TRACKPOSITION,
                0,
                MAKELPARAM(APoint.x - 1, APoint.y - 2));

    SendMessage(GHWND,TTM_TRACKACTIVATE,Integer(LongBool(true)), Integer(@ti));
    OldIndex := Index;
    TipVisable := true;
  end;
end;

procedure TForm1.HideTipsWindow;
begin
  if TipVisable then
  begin
    SendMessage(GHWND,TTM_TRACKACTIVATE,Integer(LongBool(false)), 0);
    OldIndex := -1;
    TipVisable := false;
  end;
end;

end.

goose 是一款在您的设备上运行的通用型 AI 代理 一款开源、可扩展的AI代理,功能远超代码建议——支持安装、执行、编辑以及与任何大型语言模型(LLM)进行测试。 立即下载

相关推荐

MATLAB中天线阵列的自适应波束形成仿真,包括干扰抑制和时变信号跟踪.zip

1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

Delphi编程技巧

◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar(newfile.txt),pchar(//computername/direction/targer.txt),false); ◇[DELPHI]产生鼠标拖动效果 通过MouseMove事件、DragOver事件、EndDrag事件实现,例如在PANEL上的LABEL: var xpanel,y

crystal521(云淡风轻)的专栏 1262

优胜大厅无线排队叫号系统方案Word(25页).doc

智慧方案依托物联网、大数据、人工智能等新一代信息技术,面向智慧城市、智慧园区、智能制造、智慧教育、智慧工程等多个垂直领域,从业务痛点出发搭建全链路数据驱动的智能管理体系,打破传统模式下信息孤岛、资源浪费、决策滞后等核心问题,覆盖需求调研、方案设计、落地实施、运维优化全流程,既能为IT从业者提供标书撰写、项目申报的专业参考框架,也能帮助政企单位快速理清数字化转型的实施路径,大幅降低方案的试错成本与沟通成本,是技术人员排查问题、业务人员梳理逻辑、管理人员评估项目的实用工具,如果你需要海量细分赛道的成熟参考案例,欢迎进入找方案知识星球,获取覆盖数十个行业的专属智慧方案库,快速提升方案产出效率与专业度。

高亮listbox鼠标移动所在位置的项目

发送消息LB_ITEMFROMPOINT获取位置 方法一  发消息 void __fastcall TForm2::ListBox1MouseMove(TObject *Sender,       TShiftState Shift, int X, int Y) {    int idx;    idx = SendMessage(ListBox1->Handle, LB_ITEMFR

ksrsoft的专栏 3503

Delphi鼠标滑过换底色

 当鼠标划过的时候能够出现不同的界面:(1)鼠标选择换底色procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;  Rect: TRect; State: TOwnerDrawState);//ListBox.OnDrawItem事件var  ImgRect, MemoRect: TRect;  Cnvs:

genispan的专栏 1907

发掘ListBox的潜力(三):显示即时提示(Tips)

ListBox显示即时提示(Tips)  Listbox内容太长时超出Listbox宽度的部分将无法显示,一种解决方法是让Listbox产生横向滚动条,滚动显示内容(见前面的《发掘ListBox的潜力(一):自动调整横向滚动条宽度 》),另一种方法是让Listbox以Tips的方法显示完整内容。本文要实现的是后一种方式。  Tips其实是一个特殊的窗体,类名为:tooltips_c

编程手札 5003

鼠标移动ListBox

procedure TForm1.lvMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  dItem:=lv.ItemAtPos(Point(x,y),True);end;procedure TForm1.lvMouseMove(Sender: TObject;

KomaDelphi的专栏 705

PaddleOCRApi面向 Windows 与 Linux 的轻量级 OCR 与YOLO目标检测 HTTP 服务

PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

丧尸枪战_1.0

丧尸枪战1.0这是一款我自己做的游戏2d版本的这个游戏我以后会更新

【风场景生成与削减】【m-ISODATA、kmean、HAC】无监督聚类算法,用于捕获电力系统中风场景生成与削减研究(Matlab代码实现)

内容概要:本文聚焦于电力系统中风场景的生成与削减问题,系统性地应用m-ISODATA、k-means和HAC三种无监督聚类算法对大规模风力发电数据进行处理,旨在降低风电不确定性带来的计算负担并保留关键时序特征。研究基于Matlab平台实现了完整的数据预处理、聚类建模与结果可视化流程,深入探讨了各算法在确定聚类簇数、划分数据结构及构建层次关系方面的机理差异,并通过实验对比验证了其在场景削减效果、计算效率与鲁棒性方面的性能表现。该方法为含高比例风电的电力系统提供了高效、可靠的典型场景集构建手段,支撑后续的随机优化、风险评估与调度决策。; 适合人群:具备电力系统分析基础、熟悉Matlab编程的研究生、科研人员以及从事新能源并网、电力系统规划与运行优化的工程技术人员。; 使用场景及目标:①应对风电出力强随机性与波动性,为随机规划、鲁棒优化等高级应用提供精简且具代表性的输入场景;②深入比较m-ISODATA(自适应确定簇数)、k-means(高效快速划分)与HAC(构建层次化场景结构)三类算法的技术特点与适用边界,指导实际项目中算法选型;③通过代码实践掌握从原始风速/功率数据清洗、特征提取、距离度量选择、聚类有效性评估到最终场景概率赋值的全流程技术栈。; 阅读建议:学习者应结合提供的Matlab代码进行动手实践,重点理解数据标准化、欧式距离与动态时间规整(DTW)等相似性度量的选择依据、聚类数目评估指标(如肘部法则、轮廓系数)的应用,以及如何通过削减前后场景的概率分布和典型性来检验结果质量,并可进一步将此方法迁移至光伏发电、负荷等其他不确定性场景的建模与简化研究中。

flink(Java)

「flink(Java)」是开源项目(Java)。项目简介:Apache Flink源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。

Retro-Telemetry-Dashboard-Acceptance-Scorecard-v1.0-原创源码与文档.zip

原创 JavaScript 离线工具,包含完整源码、README、MIT LICENSE、原创与授权声明、自动化测试、示例数据、真实运行截图及离线报告。解压后运行 npm test 验证,再用 node src/cli.js examples/sample.json 生成报告;不依赖外部服务。

2026 年高教社杯全国大学生数学建模竞赛A题–药材的烘干问题(数学建模,代码,论文免费分享)

内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛A题“药材的烘干问题”,提供了一套完整的数学建模解决方案,涵盖问题分析、模型构建、算法求解与结果验证全过程。文中详细探讨了药材烘干过程中温度、湿度、风速等关键参数对干燥效率与品质的影响,建立了基于传热传质理论的动态数学模型,并结合实际约束条件,采用优化算法对烘干工艺进行参数调优。此外,资源包内还包含配套的MATLAB代码与论文撰写模板,实现了从理论建模到编程实现再到成果输出的一体化支持,具有较强的实践指导意义。; 适合人群:全国大学生数学建模竞赛参赛学生,尤其是具备一定数学建模基础、编程能力(如MATLAB)和优化理论知识的本科高年级学生或研究生;也可供从事农业工程、中药加工、干燥技术等领域研究的技术人员参考。; 使用场景及目标:①应用于数学建模竞赛中对实际工程问题的建模与求解训练;②掌握传热传质模型在农产品干燥中的应用方法;③学习如何将物理过程转化为数学模型并利用优化算法求解;④获取可复用的代码框架与论文写作范式,提升竞赛备赛效率。; 阅读建议:建议读者结合所提供的代码与数据同步运行、调试模型,深入理解各模块的设计逻辑;在学习过程中重点关注模型假设的合理性、参数敏感性分析及结果可视化表达技巧,以全面提升建模综合能力。

华为路由器交换机仿真软件HW-RouteSim3.0(含实验)

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 华为模拟器_Route sim3.0 RouteSim是在借鉴国外同类软件研究成果后研发的中文路由模拟软件,其显著特征在于界面设计清晰、操作流程简便、辅助说明完备且易于掌握。该软件特别适用于初学者以及在校大学生在进行网络互联课程实验教学的实践环节。可以预见,对于备考网络工程师认证的朋友以及准备CCNP、CCNA认证的朋友们来说,这款软件应当不会感到陌生。

上一篇: Shell_NotifyIcon函数新特性---Balloon Tips之深入研究
下一篇: Shell编程---如何判断一目录是否共享?
happyjoe
博客等级 码龄26年 1粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值