彩色汽泡提示

参考了一下网上的代码,网上的代码比较零散。我整理成一个类,加了一些改进。

1、增加定时关闭功能

2、点击汽泡提前关闭

3、汽泡随主窗体一起移动

BalloonTip.hpp文件如下:

#ifndef __BalloonTip__
#define __BalloonTip__
#include <windows>
/*
    .cpp调用方法:
    TBalloonTip * tip = new TBalloonTip;

    tip->SetBackColor(0xFDA528);
    tip->SetTextColor(0xFFFFFF);
    tip->ShowBalloonTip(Button1, TTI_INFO, "标题","这是一个汽泡自定义提示");
    tip->DelayTime(3000,tip);
    delete tip;
*/
#define ID_TIMER 1
int   CALLBACK   TimerProc();
//-------------------------------------------
class TBalloonTip : public TObject
{
    private:

        HWND hPareWnd;
        TOOLINFO ti;

        static int w    ;//汽泡窗口坐标
	static int h    ;
	static int Left ;
	static int Top  ;

        TWinControl * Control1;//保存控件指针
        void __fastcall MoveBalloonTip(HANDLE & handle, TWinControl * tWinCtrl);
    public:
        __fastcall TBalloonTip();
        void __fastcall ShowBalloonTip(TWinControl *Control, int  Icon,char *Title, char *Text);
        void deleteBalloonTip();
        void __fastcall SetBackColor(TColor);
        void __fastcall SetTextColor(TColor);
        void __fastcall DelayTime(int t);
        static UINT_PTR timerid; //定时器返回值
        void __fastcall OnHitTest(TMessage & message);
        static LRESULT CALLBACK  DlgMsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
        static int   CALLBACK   TimerProc();
        TColor backColor;
        TColor textColor;
        static HWND hBalloonTip;
        void __fastcall myAppMessage(tagMSG &Msg, bool &Handled);
        HANDLE __fastcall GetHandle();
         __fastcall ~TBalloonTip();
        
        enum{TIP_NONE=0,TIP_INFO,TIP_WARNING,TIP_ERROR};
   protected:
        
};
__fastcall TBalloonTip::~TBalloonTip()
{
    KillTimer(NULL,timerid);
    SendMessage(hBalloonTip, WM_CLOSE, 0, 0);
}

UINT_PTR TBalloonTip::timerid = 0;  //定时器返回值
HWND TBalloonTip::hBalloonTip = NULL;

HANDLE __fastcall TBalloonTip::GetHandle()
{
    return  hBalloonTip;
}
void __fastcall TBalloonTip::DelayTime(int t)
{
     timerid = SetTimer(NULL, 1, t, TimerProc);
}

int TBalloonTip::w =0;
int TBalloonTip::h=0;
int TBalloonTip::Left=0;
int TBalloonTip::Top =0;
__fastcall TBalloonTip::TBalloonTip()
{
    w = 0;
    h =0;
    Left = 0;
    Top  = 0;
    timerid = 0;
    Application->OnMessage = myAppMessage;
}
//显示汽泡提示
void __fastcall TBalloonTip::ShowBalloonTip(TWinControl *Control, int Icon,char *Title, char *Text)
{
    SendMessage(hBalloonTip, WM_CLOSE, 0, 0);//如果有汽泡先清除
    hPareWnd    = Control->Parent->Handle;
    Control1    = Control;
    hBalloonTip = CreateWindow(TOOLTIPS_CLASS, NULL,
                WS_POPUP| TTS_NOPREFIX | TTS_BALLOON | TTS_ALWAYSTIP ,
                CW_USEDEFAULT,CW_USEDEFAULT,0,0,
		hPareWnd, 0, HInstance, NULL);

    if( hBalloonTip )
    {
        ti.cbSize = sizeof(ti);
        /*
         *指定位置上显示气泡提示
        */
	ti.uFlags =   TTF_ABSOLUTE | TTF_SUBCLASS ;//| TTF_TRACK ; /*|TTF_TRANSPARENT | TTF_ABSOLUTE | TTF_TRACK */;
        ti.hwnd = hPareWnd;
        ti.lpszText = Text;


        SetWindowPos(hBalloonTip, HWND_TOP,
                0,0,0,0,
                SWP_NOACTIVATE);

	//set color
        SendMessage(hBalloonTip, TTM_SETTIPBKCOLOR, backColor, 0);    //背景颜色
        SendMessage(hBalloonTip, TTM_SETTIPTEXTCOLOR, textColor, 0);   //文字颜色

        SendMessage(hBalloonTip, TTM_ADDTOOL, WPARAM(1), LPARAM(&ti));       //添加汽泡
        SendMessage(hBalloonTip, TTM_SETTITLE, WPARAM(Icon), LPARAM(Title)); //文字标题

        // 定义气泡位置,粘附在指定控件旁边
        GetWindowRect(hPareWnd, &ti.rect);
        Left = ti.rect.left;
        Top =  ti.rect.top;
        w = ti.rect.right - ti.rect.left;
        h = ti.rect.bottom - ti.rect.top;

       LONG re = SendMessage(hBalloonTip,
                        TTM_TRACKPOSITION, WPARAM(1),
                        MAKELONG(w+Left,h+Top));


        //激活显示气泡
        re=SendMessage(hBalloonTip,
                        TTM_TRACKACTIVATE,
                        WPARAM(true), LPARAM(&ti));

	//注意销毁窗口
        UpdateWindow(hBalloonTip);
        //移动汽泡位置
        MoveBalloonTip(hPareWnd,Control1);
    }
}
//关闭汽泡
void  TBalloonTip::deleteBalloonTip()
{
    ti.cbSize = sizeof(ti);
    ti.hwnd = hPareWnd;
    SendMessage(hBalloonTip, TTM_DELTOOL, WPARAM(0), LPARAM(&ti));
}
//设置背景颜色
void __fastcall TBalloonTip::SetBackColor(TColor cl)
{
    backColor =  cl;
    SendMessage(hBalloonTip, TTM_SETTIPBKCOLOR, backColor, 0);
}
//设置文字颜色
void __fastcall TBalloonTip::SetTextColor(TColor cl)
{
    textColor = cl;
    SendMessage(hBalloonTip, TTM_SETTIPTEXTCOLOR, textColor, 0);
}
//------------------------------------
//定时器回调函数
int   CALLBACK   TBalloonTip::TimerProc()
{
    KillTimer(NULL,timerid);
    SendMessage(hBalloonTip, WM_CLOSE, 0, 0);
}

void __fastcall TBalloonTip::myAppMessage(tagMSG &Msg, bool &Handled)
{
    if (hBalloonTip && Msg.hwnd == hBalloonTip)
    {
        switch(Msg.message)
        {
          case WM_LBUTTONDOWN:
             KillTimer(NULL,timerid);
             SendMessage(hBalloonTip, WM_CLOSE, 0, 0);
             break;
        }
    }

    Handled = false;
}
//移动汽泡提示的位置
void __fastcall TBalloonTip::MoveBalloonTip(HANDLE & handle, TWinControl * Control1)
{
    long dwStyle = GetWindowLongA(hBalloonTip,GWL_STYLE);//获取旧样式
    dwStyle &= ~WS_POPUP;
    dwStyle |= WS_CHILD;    //按位与将旧样式去掉
    SetWindowLong(hBalloonTip,GWL_STYLE,dwStyle);
    SetParent(hBalloonTip,hPareWnd);
    TWinControl * tWinCrl;
    tWinCrl = FindControl(handle);
    INT CaptionHeight = tWinCrl->Height-tWinCrl->ClientHeight;//标题栏高度
    TRect rc;
    GetClientRect(hBalloonTip,&rc);
    MoveWindow(hBalloonTip,Control1->Left+Control1->Width/2,Control1->Top-Control1->Height-CaptionHeight,rc.Width(),rc.Height(),true);

}
#endif



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值