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

          以前写过一篇文章,是用 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窗口的某个端点(例如左上角)的坐标。

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在屏幕上显示的时间。  

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

时间: 2024-10-22 09:43:10

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

[c#]可在任意位置弹出的BalloonTip

      BalloonTip通常出现在位于屏幕右下角的Tray(成为通知栏,或系统托盘)的Icon上,比如用户插拔USB设备时的气泡提示.该函数位于Shell32中,是通过调用下面这个API函数实现的, BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA lpdata ); 该函数用于控制对TrayIcon进行控制,可以弹出BalloonTip.然后却只能局限于Tray位置.而在QQ的聊天对话框中,我们发现如果不输入内容而试图发送消

jQuery实现点击任意位置弹出层外关闭弹出层效果_jquery

在之前做项目的时候经常会在主页面上点击某个按钮,右侧弹出一个div输出对应内容的详细信息.此时,我是希望在鼠标点击弹出层外的时候关闭该弹出层,主要思想就是: 找到鼠标点击的那个元素 判断这个元素是否在指定区域内,其实就是判断它的父元素是不是弹出层 如果不是就对弹出层进行hide,如果是就不进行任何操作 具体实现 该代码需要使用jQuery,代码如下: $(document).mousedown(function(e){ if($(e.target).parent("#info").le

Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果_Android

我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图: 这个要实现这个效果可以分几步进行 1.第一步自定义PopupWindow,实现如图的样式,这个继承PopupWindow自定义布局很容易实现 2.得到点击按钮的位置,根据位置是否在屏幕的中间的上方还是下方,将PopupWindow显示在控件的上方或者下方 3.适配问题,因为PopupWindow上面的操作列表

基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出_Android

Android Material Design:PopupMenu Android Material Design 引入的PopupMenu类似过去的上下文菜单,但是更灵活. 如图所示: 现在给出实现上图PopupMenu的代码. 本例是一个普通的Button触发弹出PopupMenu. 测试的MainActivity.java : package zhangphil.materialdesign; import android.app.Activity; import android.os.B

Android开发仿QQ空间根据位置弹出PopupWindow显示更多操作效果

我们打开QQ空间的时候有个箭头按钮点击之后弹出PopupWindow会根据位置的变化显示在箭头的上方还是下方,比普通的PopupWindow弹在屏幕中间显示好看的多. 先看QQ空间效果图: 这个要实现这个效果可以分几步进行 1.第一步自定义PopupWindow,实现如图的样式,这个继承PopupWindow自定义布局很容易实现 2.得到点击按钮的位置,根据位置是否在屏幕的中间的上方还是下方,将PopupWindow显示在控件的上方或者下方 3.适配问题,因为PopupWindow上面的操作列表

js点击页面中任意位置弹出新页面

弹出原是非常的简单 判断cookie是否过期,如果过期则重新设置cookie,并且定义弹出页面的url地址,最后调用弹窗.在弹出页面url中 popjs代码如下  代码如下 复制代码 function objpop(){  var obj=new Object;  var ua=navigator.userAgent;  var browser={   ie:/msie/i.test(ua),   ie6:/msie 6/i.test(ua),   ie7:/msie 7/i.test(ua),

Easyu里面的datagrid怎么实现点击某单元格在其鼠标的位置弹出menu选择菜单中update弹出dialog修改该单元格的值

问题描述 问题如上,可右击,只要能实现就行,目前遇到的问题就是菜单的位置不能根据鼠标点击的位置移动,只能固定设置其位置html代码如下:<divid="box"class="easyui-datagrid"></div><divid="menu"class="easyui-menu"style="display:none;"><div>add</div&

如何修改Fireworks弹出菜单的位置

菜单 如何修改Fireworks弹出菜单的位置 资料来源:Macromedia Top TechNotes 全文编译:spikal 多数时候,当你把在Fireworks4中制作的弹出菜单输入到一个HTML文件中预览时会发现,菜单出现的位置并非如你所愿. 引起错误的原因 改变了引发装置的位置 弹出菜单的引发装置(热区.按钮或者带链接的图片等)在Dreamweaver页面中的位置和在Fireworks画布中的位置不同. 浏览器留边 没有把页面的margins属性设置为"0". 引发装置相对

javascript实现在网页任意处点左键弹出隐藏菜单的方法_javascript技巧

在网页的任意处点击左键就会弹出来,实际上是用JS控制DIV层的显示,DIV层内嵌套的是一个表格,表格里放菜单,这样修改方便,不会CSS也没关系,你可以把它复制下来,用DW打开重新修改一下菜单样式,换成你自己喜欢的色彩 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>隐藏菜单</ti