[C]可在任意位置弹出的BalloonTip(2)

简介: 以前写过一篇文章,是用 C# 的自绘制窗口做了一个 Balloon Tip 。这里由于讲的还是 BalloonTip ,所以作为前文的后续。不同的是,这一次是用 windows sdk 的 API  函数直接创建一个 ToolTip 窗口,然后我们就得到了 ToolTip 的窗口句柄,然后可以把 ToolTip 定位到屏幕任意的位置自然就是很简单的事。

          以前写过一篇文章,是用 C# 的自绘制窗口做了一个 Balloon Tip 。这里由于讲的还是 BalloonTip ,所以作为前文的后续。不同的是,这一次是用 windows sdk 的 API  函数直接创建一个 ToolTip 窗口,然后我们就得到了 ToolTip 的窗口句柄,然后可以把 ToolTip 定位到屏幕任意的位置自然就是很简单的事。还是借用上次演示MSN式浮出通知窗口的例子,只是加入了 ToolTip 的相关代码。效果如下:

          

 

          代码比较简单,详见附件中的tooltip.h , tooltip.c。

          创建tooltip窗口用的是 CreateWindow, 窗口类名是“Tooltips_Class32”。 第一个参数 isBalloon 指定创建 ToolTip 的形状,如果为 TRUE 则创建的是“balloon”型的 ToolTip,也就是类似卡通画里的会话气泡,则显示时的位置坐标(x,y)是气泡的箭头指向点的坐标。否则创建的是普通的矩形ToolTip,显示时的位置坐标(x,y)是ToolTip窗口的某个端点(例如左上角)的坐标。

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code_CreateToolTip
//创建ToolTip窗口
HWND CreateToopTip(BOOL isBalloon, int maxWidth)
{
    
if (!m_hWndToolTip)
    {
        m_hWndToolTip 
= CreateWindow(
            
"Tooltips_Class32",        //TOOLTIPS_CLASS, 
            NULL,
            WS_POPUP 
| TTS_NOPREFIX | TTS_ALWAYSTIP | (isBalloon? TTS_BALLOON : 0) ,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            NULL, NULL, 
            NULL, 
//m_hInst,
            NULL);

        
if (m_hWndToolTip) 
        {
            
// set the version so we can have non buggy mouse event forwarding
            
//SendMessage(m_hWndToolTip, CCM_SETVERSION, COMCTL32_VERSION, 0);
            SendMessage(m_hWndToolTip, TTM_SETMAXTIPWIDTH, 0, (LPARAM)maxWidth);
        }
    }
    
return m_hWndToolTip;
}

 

 

          显示ToolTip时,设置标题,文本,指向位置,是通过给窗口发送属于 ToolTip 的以 “TTM_” 为前缀的消息来完成的。然后我们通过一个定时器设置ToolTip在屏幕上显示的时间。  

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code_ShowToolTip
//弹出tooltip
void ShowToolTip(HWND hWnd, char* content, char* title, int x, int y, int icon, int mSeconds)
{
    
//获取前景窗口
    HWND m_curForeWnd = GetForegroundWindow();

    
if(!m_hWndToolTip)
    {
        
//默认情况下是balloontip
        CreateToopTip(TRUE, 300); 
    }

    
if (m_hWndToolTip)
    {
        TOOLINFO ti 
= {0};
        ti.cbSize 
= sizeof(ti);
        ti.uFlags 
= /*TTF_IDISHWND |*/  TTF_TRACK | TTF_TRANSPARENT /*| TTF_CENTERTIP*/;
        ti.hwnd 
= hWnd;
        ti.uId 
= 0;
        
//ti.lpszText = NULL;
        SendMessage(m_hWndToolTip, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&ti);
        
//隐藏tooltip
        SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)0);

        
//设置文本
        ti.lpszText = content;
        SendMessage(m_hWndToolTip, TTM_UPDATETIPTEXT, 
0, (LPARAM)&ti);

        
//设置标题和icon
        SendMessage(m_hWndToolTip, TTM_SETTITLEA, icon, (LPARAM)title);

        
//设置指向位置
        SendMessage(m_hWndToolTip, TTM_TRACKPOSITION, 0, MAKELONG(x, y));

        
//set z-order
        SetWindowPos(m_hWndToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE);

        
//显示tooltip
        SendMessage(m_hWndToolTip, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&ti);

        
//安装timeout定时器
        KillTimer(hWnd, TIMERID_TOOLTIP);
        
if(mSeconds > 0)
        {
            SetTimer(hWnd, TIMERID_TOOLTIP, mSeconds, (TIMERPROC)ToolTipTimerProc);
        }
    }
    
//复原前景窗口
    SetForegroundWindow(m_curForeWnd);
}

 

 

          最后是源代码下载链接(和前文下载链接一致):

          http://files.cnblogs.com/hoodlum1980/NotifyWndDemo2.rar

目录
相关文章
|
JavaScript 前端开发
Vue3-v-bind事件绑定
Vue3-v-bind事件绑定
675 0
|
虚拟化
解决ESXI不支持USB移动硬盘
解决方式: 采用PCI设备直通方式分配给虚拟子机使用。前提: ESXI主机需支持PCI设备直通功能。(亲测技嘉H61、H81不支持如下图示)在技嘉H110和B250亲测成功 实验环境 主机:技嘉B250M主板系统:ESXI 6.0U3PCI转USB卡: IT-CEO PCI-E转USB3.0双口扩展卡 操作过程 使用vSphere Client连接到ESXi主机,在"配置→高级设置→编辑直通",在"将设备标记为可直通"对话框中,勾取插入的PCI转USB设备。
17746 0
|
人工智能 监控 算法
销售易CRM:功能与优势全解析
销售易CRM是国内领先的客户关系管理(CRM)系统,提供强大的销售管理、全方位客户管理、丰富的营销自动化工具、智能AI赋能及灵活的开放性平台。其功能涵盖线索获取、商机管理、客户画像、营销活动策划、智能预测等,支持企业高效管理客户、优化业务流程、提升销售效率和客户满意度。通过灵活的二次开发和API接口,销售易CRM可无缝集成企业现有系统,助力企业在数字化转型中实现业绩高质量增长。
|
7月前
|
人工智能 JSON 安全
多Agent之间个人访问凭证的安全传递问题
本文探讨多Agent场景下用户凭证安全传递的核心挑战,解析RFC 7523(JWT断言)、RFC 8693(令牌交换)及IETF AI Agent委托草案的技术方案,并以Microsoft Entra Agent ID为范例,阐述如何通过OBO流程、权限缩减、委托链审计(act声明)与企业治理实现安全、可控、可追溯的凭证委托。
1132 0
|
安全 物联网 云计算
等保2.0正式实施,阿里云发布全国首个《阿里公共云用户等保2.0合规能力白皮书》
面对大量的咨询和疑惑,阿里云在公安部信息安全等级保护评估中心指导下,发布全国首个《阿里公共云用户等保2.0合规能力白皮书》,为您一一解答。白皮书从云服务商和云上用户安全合规责任划分出发,首次公开阐述公共云上用户在不同服务模式下的安全合规责任和等保2.0适用条款,基于最典型的IaaS服务模式场景,为您提供最佳安全合规实践指引,首次深度解读云计算、物联网扩展要求合规实践。
3583 0
等保2.0正式实施,阿里云发布全国首个《阿里公共云用户等保2.0合规能力白皮书》
|
8月前
|
JavaScript 安全 Linux
喂饭级教程:阿里云+本地安装OpenClaw(Clawdbot)集成必备Skills配置、避坑指南与实战测试
很多用户安装完OpenClaw后,常会陷入“工具已就绪,功能用不了”的困境——明明部署流程显示成功,却无法执行联网查询、自动扩展功能等核心操作。问题的关键在于:OpenClaw的基础安装仅提供核心框架,如同买了一辆高性能汽车却未加油充电,必须通过安装专用工具与必备技能(Skills),才能激活其全量能力。本文将详解**2026年阿里云OpenClaw超简单部署流程**与**本地私有化部署方案**,重点拆解技能管理工具clawhub及三大必备Skills的安装配置,附带完整代码命令、避坑指南与实战测试,让你从“部署完成”一步到位实现“功能全开”。
6299 12
|
人工智能 数据库管理 数据挖掘
「瑶池 Data Agent 入门训练营」火热进行中,参营可得棒球帽等多重好礼!
还在为数据报表熬夜?「瑶池Data Agent入门训练营」课程全部上线!7节实战课,教你一句话生成报告、分析问题根源、预测销售链路;定制AI助手,效率提升10倍。完成学习可获得阿里云结营证书,前100名还可赢取实物奖,2月28日正式结营!
「瑶池 Data Agent 入门训练营」火热进行中,参营可得棒球帽等多重好礼!
|
10月前
|
数据采集 人工智能 数据挖掘
Claude Skills的开源实现
Claude推出Skills系统,让AI按需加载专业能力。受此启发,我在开源Minion框架中实现了兼容版本:通过声明式SKILL.md定义技能,支持PDF、Excel等文档处理,实现动态加载、分层搜索与智能注册,降低上下文开销,提升效率。项目支持多LLM、可定制、易扩展,推动构建开放的AI Agent技能生态。
GitFlow流程
分支角色概述:主分支(master/main)代表最新稳定版本,开发分支(develop)用于日常开发,特性分支(feature)用于开发新功能,发布分支(release)用于准备新版本发布,热修复分支(hotfix)用于紧急修复已发布版本的问题。GitFlow流程包括初始化、开发新功能、准备发布、热修复和持续迭代。
816 17

热门文章

最新文章