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

來源:互聯網
上載者:User

          以前寫過一篇文章,是用 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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.