📄 balloon.h
字号:
#pragma once
#include "loadpic.h"
///////////////////////////////////////////////////////////////////////////////
// class CBalloon
//
// Author: Rajesh C K R
// email: rajeshckr@usa.net
// page: http://www.cybertalkonline.com
// Copyright ?2000, Rajesh C K R
//
// This code provided "AS IS," without warranty of any kind.
// You may freely use or modify this code provided this
// Copyright is included in all derived versions.
//
// version : 1.0
/////////////////////////////////////////////////////////////////////////////
// CBalloon window
#pragma once
#include ".\src\buttonST.h"
#define BALLOON_SHOW_TIMER 0x10
#define TIMER_MS 20
#define BALLOON_LIFETIME (3*1000)
#define STEP_SIZE 5
class CBalloon : public CWindowImpl<CBalloon>
{
// Construction
static UINT m_sActiveCount;
// Attributes
private:
CRect m_current_rect;
CRect m_screen_rect;
UINT m_nWidth;
UINT m_nHeight;
UINT m_totaltime;
UINT m_lifetime;
BOOL m_dir;
CString m_text;
int m_iLeftSpacing;
long clLeft;
long clRight;
long clText;
int m_iAlign;
BOOL m_bBitmap;
BOOL m_bInit;
public:
protected:
// Implementation
public:
CBalloon(UINT nWidth, UINT nHeight): m_nWidth(nWidth), m_nHeight(nHeight)
{
SystemParametersInfo(SPI_GETWORKAREA, 0, &m_screen_rect, 0);
m_totaltime = 0;
m_lifetime = BALLOON_LIFETIME;
m_dir = TRUE;
m_iLeftSpacing = 10;
clLeft = GetSysColor( COLOR_ACTIVECAPTION );
clRight = GetSysColor( COLOR_BTNFACE );
clText = GetSysColor( COLOR_CAPTIONTEXT );
m_iAlign = 0;
m_bBitmap=FALSE;
}
virtual ~CBalloon()
{
}
//void SetWindowText(LPCSTR a_lpstr)
//{
// ::SetWindowText( m_hWnd, a_lpstr );
// Invalidate();
//}
void SetBitmap(int nID)
{
AddPicture(nID,0,0);
m_bBitmap=TRUE;
}
void SetBitmap(TCHAR* szFileName)
{
AddPicture(szFileName,0,0);
m_bBitmap=TRUE;
}
void SetColor(long cl){ clLeft = cl; };
void SetGradientColor(long cl){ clRight = cl; };
void SetTextColor(long cl){ clText = cl; };
void SetLeftSpacing(int iNoOfPixels){ m_iLeftSpacing = iNoOfPixels; };
void SetTextAlign(int iAlign ) { m_iAlign = iAlign; }; //0 - left, 1 - center, 2 -right
void SetReverseGradient()
{
COLORREF cTemp = clLeft;
clLeft = clRight;
clRight = cTemp;
}
void SetText(char* fmt, ...)
{
char szBuffer[1024];
va_list argptr;
va_start(argptr,fmt);
vsprintf(szBuffer,fmt,argptr);
va_end(argptr);
m_text =szBuffer;
}
void SetLifeTime(UINT secs)
{
m_lifetime = secs * 1000;
}
BOOL Show()
{
CRect rect;
rect.top = m_screen_rect.bottom - m_nHeight;
rect.bottom = m_screen_rect.bottom;
rect.left = m_screen_rect.right - m_nWidth - 10 - (m_sActiveCount * 10) ;
rect.right = m_screen_rect.right - 10 - (m_sActiveCount * 10);
DWORD dwStyle = WS_POPUP;
DWORD dwExStyle = WS_EX_TOOLWINDOW |WS_EX_CLIENTEDGE | WS_EX_TOPMOST | WS_EX_WINDOWEDGE ;
m_bInit=FALSE;
Create (NULL,rect,"",dwStyle,dwExStyle);
m_sActiveCount++;
m_sActiveCount%=5;
m_current_rect.top = m_current_rect.bottom = m_screen_rect.bottom;
m_current_rect.left = rect.left;
m_current_rect.right = rect.right;
COLORREF lightblue = RGB(154,190,255);
COLORREF white = RGB(255,255,255);
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
SetTimer(BALLOON_SHOW_TIMER,TIMER_MS,NULL);
return true;
}
void DrawGradRect( CPaintDC *pDC, CRect r, COLORREF cLeft, COLORREF cRight)
{
CRect stepR; // rectangle for color's band
COLORREF color; // color for the bands
float fStep = ((float)r.Width())/255.0f; // width of color's band
for(int iOnBand = 0; iOnBand < 255; iOnBand++)
{
// set current band
SetRect(&stepR,
r.left+(int)(iOnBand * fStep),
r.top,
r.left+(int)((iOnBand+1)* fStep),
r.bottom);
// set current color
color = RGB((GetRValue(cRight)-GetRValue(cLeft))*((float)iOnBand)/255.0f+GetRValue(cLeft),
(GetGValue(cRight)-GetGValue(cLeft))*((float)iOnBand)/255.0f+GetGValue(cLeft),
(GetBValue(cRight)-GetBValue(cLeft))*((float)iOnBand)/255.0f+GetBValue(cLeft));
// fill current band
pDC->FillSolidRect(stepR,color);
}
}
/////////////////////////////////////////////////////////////////////////////
// CBalloon message handlers
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
CPaintDC dc(m_hWnd);
CRect rect;
GetClientRect(&rect);
//CRect rect(0,0,m_current_rect.Width(),m_current_rect.Height());
if (!m_bBitmap){
DrawGradRect( &dc, rect, clLeft, clRight );
}
else{
RepaintPictures(m_hWnd,dc.m_hDC);
}
//let's set color defined by user
::SetTextColor(dc,clText);
HFONT hfontOld;
CFont* pFont = new CFont( GetFont() );
if(pFont)
hfontOld = dc.SelectFont( pFont->m_hFont );
::SetBkMode(dc, TRANSPARENT);
//GetClientRect(&rect);
dc.SetBkMode(TRANSPARENT);
if(m_iAlign == 1) // center
{
UINT height =::DrawText(dc, m_text, -1, &rect, DT_CENTER|DT_WORDBREAK|DT_CALCRECT);
GetClientRect(&rect);
rect.top = (rect.bottom - height)/2;
::DrawText(dc, m_text, -1, &rect, DT_CENTER|DT_WORDBREAK);
}
else if(m_iAlign == 0) // left
{
rect.left+=m_iLeftSpacing;
UINT height =::DrawText(dc, m_text, -1, &rect, DT_LEFT|DT_WORDBREAK|DT_CALCRECT);
GetClientRect(&rect);
rect.top = (rect.Height() - height)/2;
::DrawText(dc, m_text, -1, &rect, DT_LEFT|DT_WORDBREAK);
}
else //right
{
rect.right-=m_iLeftSpacing;
UINT height =::DrawText(dc, m_text, -1, &rect, DT_RIGHT|DT_WORDBREAK|DT_CALCRECT);
GetClientRect(&rect);
rect.top = (rect.Height() - height)/2;
::DrawText(dc, m_text, -1, &rect, DT_RIGHT|DT_WORDBREAK);
}
if(pFont)
::SelectObject(dc.m_hDC, hfontOld);
return true;
// Do not call CWnd::OnPaint() for painting messages
}
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO: Add your message handler code here and/or call default
m_totaltime += TIMER_MS;
if (m_totaltime > m_lifetime)
{
m_dir = FALSE;
}
if (m_dir)
{
m_current_rect.top = ((m_current_rect.top - STEP_SIZE) < (m_current_rect.bottom - m_nHeight))? m_current_rect.bottom - m_nHeight : m_current_rect.top - STEP_SIZE;
}
else
{
m_current_rect.top = ((m_current_rect.top + STEP_SIZE) > (m_current_rect.bottom))? m_current_rect.bottom : m_current_rect.top + STEP_SIZE;
}
MoveWindow(&m_current_rect);
if (m_current_rect.top == m_current_rect.bottom)
{
KillTimer(BALLOON_SHOW_TIMER);
DestroyWindow();
return true;
}
HWND hWnd = ::GetFocus();
ShowWindow(SW_RESTORE);
if (hWnd)
::SetFocus(hWnd);
return true;
}
virtual void OnFinalMessage(HWND /*hWnd*/)
{
if (m_bBitmap)RemovePictures();
delete this;
}
// Generated message map functions
protected:
BEGIN_MSG_MAP(CBalloon)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_TIMER, OnTimer)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -