C++builder彩色汽泡提示
本文地址:http://txm.tongxinmao.com/Article/Detail/id/199
#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);
}
#endifhttp://blog.csdn.net/chinayu2007/article/details/40559189
上一篇:C++builder自绘控件框架
下一篇:共享单车(摩拜 小蓝 OFO 小鸣 永安,优拜,骑贝,快兔, hellobike )车锁技术方案