class UIHELPER_EXPORT ToolTipWindow : public chMessageHandler
{
DECLARE_PROCESS_OBJECT(ToolTipWindow);
public:
bool updateTipText(const chConstStringA text);
private:
bool initTipsWindowsBywinAPI();
void AddWindowTool(HWND hwndTip);
bool ShowTipWindow();
bool HideTipWindow();
BOOL onProcessMessage(msgObject& objMessage);
public:
virtual BOOL TryThreadMessage(msgObject& objMessage);
public:
ToolTipWindow();
~ToolTipWindow();
private:
HWND hwndTip;
TOOLINFOW toolInfo;
chStringW m_strText;
};

#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#include <commctrl.h>
#pragma comment(lib, "comctl32.lib")

IMPLEMENT_PROCESS_OBJECT(ToolTipWindow);
bool ToolTipWindow::initTipsWindowsBywinAPI()
{
chASSERT(hwndTip == NULL);

hwndTip = CreateWindowEx(NULL,
TOOLTIPS_CLASS,
NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
NULL,
NULL
);
::SetWindowPos(hwndTip, HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
AddWindowTool(hwndTip);
return true;
}
void ToolTipWindow::AddWindowTool(HWND hwndTip)
{
memset(&toolInfo, 0, sizeof(TOOLINFO));
toolInfo.cbSize = sizeof(TOOLINFO);
toolInfo.uFlags = TTF_IDISHWND | TTF_TRACK;
toolInfo.uId = NULL;//(UINT_PTR)hParrent;
toolInfo.lpszText = NULL;

::SendMessage(hwndTip, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &toolInfo);
}
bool ToolTipWindow::updateTipText(const chConstStringA text)
{
chASSERT(hwndTip != NULL);
m_strText = chUTF82W(text);
toolInfo.lpszText = (LPWSTR)m_strText.c_str();
::SendMessage(hwndTip, TTM_UPDATETIPTEXTW, 0, (LPARAM)&toolInfo);
return true;
}
bool ToolTipWindow::ShowTipWindow()
{
POINT currentPoint;
GetCursorPos(&currentPoint);
SYZ_TRACE("getCursorPos x==[%d], y==[%d]", currentPoint.x, currentPoint.y);

::SendMessage(hwndTip, TTM_TRACKPOSITION, 0, (LPARAM) MAKELONG(currentPoint.x + 5, currentPoint.y + 10));
::SendMessage(hwndTip, TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&toolInfo);
return TRUE;
}
bool ToolTipWindow::HideTipWindow()
{
::SendMessage(hwndTip, TTM_TRACKACTIVATE,(WPARAM)FALSE,(LPARAM)&toolInfo);
return TRUE;
}
BOOL ToolTipWindow::onProcessMessage(msgObject& objMessage)
{
switch(objMessage.message)
{
case TOOLTIPWINDOWS_UPDATETIPTEXT:
updateTipText(chStringA((LPCSTR)objMessage.GetExtraData(), objMessage.GetExtraSize()));
break;
case TOOLTIPWINDOWS_SHOWTIPWINDOW:
ShowTipWindow();
break;
case TOOLTIPWINDOWS_HIDETIPWINDOW:
HideTipWindow();
break;
default:
break;
}
return TRUE;
}
BOOL ToolTipWindow::TryThreadMessage(msgObject& objMessage)
{
switch(objMessage.message)
{
case TOOLTIPWINDOWS_UPDATETIPTEXT:
updateTipText((LPCSTR)objMessage.GetExtraData());
break;
case TOOLTIPWINDOWS_SHOWTIPWINDOW:
ShowTipWindow();
break;
case TOOLTIPWINDOWS_HIDETIPWINDOW:
HideTipWindow();
break;
default:
break;
}
return TRUE;
}
ToolTipWindow::ToolTipWindow()
{
hostThread().AddMessageHandler(this);
hwndTip = NULL;
initTipsWindowsBywinAPI();
msgJoinMessageGroup(szToolTipWindowsGroupName, MSG_METHOD(this, ToolTipWindow::onProcessMessage));
}
ToolTipWindow::~ToolTipWindow()
{
if (hwndTip != NULL)
{
::SendMessage(hwndTip, WM_DESTROY, 0, 0);
::DestroyWindow(hwndTip);
hwndTip = NULL;
}
}

windowsAPI popup trace tip(toolTip)的更多相关文章

  1. [转载]ExtJs4 笔记(7) Ext.tip.ToolTip 提示

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  2. ExtJs4 笔记(7) Ext.tip.ToolTip 提示

    本篇介绍提示控件,ExtJs支持两种方式定义提示,可以支持普通html元素和一般的ExtJs UI控件. 一.基本提示 Ext.tip.ToolTip 1.最简单的提示 下面通过代码定义一个最简单的提 ...

  3. Javascript - ExtJs - ToolTip组件

    一个浮动的提示信息组件…… Ext,                               //可选 指定箭头的位置     anchor: 'buttom',                  ...

  4. qml 设置tooltip,Customizing ToolTip

    Button {            id: btn            text: "Tip"            anchors.horizontalCenter: pa ...

  5. jQuery Plugin Poshy Tip 使用 统一提示信息

    项目到了后期,发现前端的提示信息不统一,解决思路如下: 1.回顾系统中tip出现的场景:表单验证提示信息.数据列表中随填随显 2.确定问题域:多条提示信息层叠.信息显示风格不统一 3.结论:找出一款合 ...

  6. Bootstrap Tooltip源码分析

    /* ======================================================================== * Bootstrap: tooltip.js ...

  7. WPF drag过程中显示ToolTip.

    原文:WPF drag过程中显示ToolTip. 在drag/drop过程中,我们在判断出over的元素上是否可以接受drag的东西之后,通常是通过鼠标的样式简单告诉用户这个元素不接受现在drag的内 ...

  8. 基于jsp+servlet图书管理系统之后台万能模板

    前奏: 刚开始接触博客园写博客,就是写写平时学的基础知识,慢慢发现大神写的博客思路很清晰,知识很丰富,非常又价值,反思自己写的,顿时感觉非常low,有相当长一段时间没有分享自己的知识.于是静下心来钻研 ...

  9. ExtJs4之Grid详细

    ExtJs博客前奏 由于这段时间事情比较杂乱,博客就主要以项目中例子来说明编写. ExtJs4中的Grid非常强大,有展示,选中,搜索,排序,编辑,拖拽等基本功能,这篇博客我就这几个功能做写累述. 1 ...

随机推荐

  1. UML常用图的几种关系的总结

    在UML的 类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization), 关联(Association), 聚合(Aggregation), 组合(Com ...

  2. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  3. 清华申请退学博士作品:完全用Linux工作

    http://www.cnblogs.com/cbscan/articles/3252872.html 下文地址 http://blog.oldboyedu.com/use-linux/ 按: 尽管我 ...

  4. testNG中同一个test节点上class的执行顺序

    如果每个class中都有setUp(),那么先执行所有class的setUp方法,之后再执行具体的测试方法.这样就导致只有最后一个测试能通过,其他测试都失败了. 具体设置如下图:

  5. JavaScript 装逼指南

    Summary 本文秉承着 你看不懂是你sb,我写的代码就要牛逼 的理念来介绍一些js的装逼技巧. 下面的技巧,后三个,请谨慎用于团队项目中(主要考虑到可读性的问题),不然,leader 干你没商量. ...

  6. MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码

    MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查 ...

  7. Apache Shiro 使用手册(二)Shiro 认证

    认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的"实体/凭证"组合便是&quo ...

  8. sublime3中文乱码解决包ConvertToUTF8.zip

    把ConvertToUTF8.zip解压放到C:\Program Files\Sublime Text 3\Data\Packages中,重启sublime 3,按ctrl+shift+c即可解决中文 ...

  9. 千里积于跬步——流,向量场,和微分方程[转载]

    在很多不同的科学领域里面,对于运动或者变化的描述和建模,都具有非常根本性的地位--我个人认为,在计算机视觉里面,这也是非常重要的. 什么是"流"? 在我接触过的各种数学体系中,对于 ...

  10. 关于 try catch catch

    catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源. public class abc { st ...