⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 balloon.h

📁 这是一本学习 window编程的很好的参考教材
💻 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 + -