[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, 0000, 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

目录
相关文章
如何获取与设置光标在input框的位置
如何获取与设置光标在input框的位置
如何获取与设置光标在input框的位置
|
16天前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
8月前
scrollIntoView()定位元素显示导致页面上移解决方法?
scrollIntoView()定位元素显示导致页面上移解决方法?
215 0
|
4月前
|
算法 小程序 API
uniapp显示当前位置与所传入位置的距离
uniapp显示当前位置与所传入位置的距离
64 0
|
5月前
判断页面滚动条所在位置
判断页面滚动条所在位置
13 0
|
6月前
解决 010Edittor 复制右边到左边的问题
解决 010Edittor 复制右边到左边的问题
55 1
|
6月前
|
Web App开发 C++
c++ 实现不在同一程序内,在光标处(当前有焦点的窗体输入框)输入字符
c++ 实现不在同一程序内,在光标处(当前有焦点的窗体输入框)输入字符
|
11月前
|
算法 Python
算法题:把列表右侧 k 位数依次移动到左侧
算法题:把列表右侧 k 位数依次移动到左侧
58 0
|
Python
LeetCode 1299. 将每个元素替换为右侧最大元素
给你一个数组 arr ,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1 替换。
71 0