www.gusucode.com > VC++带农历、定时关机的多功能小时钟-源码程序 > VC++带农历、定时关机的多功能小时钟-源码程序\code\MsgWnd.cpp

    /////////////////////////////////////////////////////////////////////////
// MsgWnd.cpp
//消息提示类
//楚茗收集修改
//2005年8月14日
//代码部分来源于网络,你可以随意传播,修改和使用,但是不可用于商业用途
//Download by http://www.NewXing.com
//Windows XP SP2测试良好
//////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MsgWnd.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//------------------------------------------
#define ID_TIMER_POP_WINDOW		10    //窗口的显示
#define ID_TIMER_CLOSE_WINDOW	11    //窗口的停留
#define ID_TIMER_DISPLAY_DELAY	12    //窗口的消失

#define WIN_WIDTH	181
#define WIN_HEIGHT	116
//------------------------------------------
/////////////////////////////////////////////////////////////////////////////
// CMsgWnd
//构造/析构函数
CMsgWnd::CMsgWnd()
{//初始化变量
	m_Bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_SHOWMSG)); //加载Bitmap资源
	m_Bitmap.GetBitmap(&bmBitmap);                     //得到Bitmap信息
	m_bFlag=false;
	m_strMessage="主机: 127.0.0.0.1";           //显示信息
	m_strCaption="上线提示";                    //消息主题 
	m_PopTime=5;                                
	m_DisplayTime=60;                           
	m_CloseTime=5;                              
}

CMsgWnd::~CMsgWnd()
{
}


BEGIN_MESSAGE_MAP(CMsgWnd, CWnd)
	//{{AFX_MSG_MAP(CMsgWnd)
	ON_WM_PAINT()
	ON_WM_TIMER()
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMsgWnd message handlers
void CMsgWnd::CreateMsgWindow()
{
	CreateEx(0,
		     AfxRegisterWndClass(0,NULL,NULL,NULL),//(HBRUSH)(COLOR_DESKTOP+1),NULL),
			 "",
			 WS_POPUP|WS_EX_TOPMOST,
			 0,
			 0,
			 0,
			 0,
			 NULL,
			 NULL,
			 NULL);

	SetTimer(ID_TIMER_POP_WINDOW,m_PopTime,NULL);
}

void CMsgWnd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CDC dcMemory;
	CRect rect;
	GetClientRect(&rect);
    dcMemory.CreateCompatibleDC(NULL);
	dcMemory.SelectObject(&m_Bitmap);
	dc.StretchBlt(0,
		0,
		rect.right-rect.left,
		rect.bottom-rect.top,
		&dcMemory, 
		0,
		0,
		bmBitmap.bmWidth,    
		bmBitmap.bmHeight,
		SRCCOPY);	
	CFont font;
	font.CreatePointFont(90,"Impact");
	dc.SelectObject(&font);
	dc.SetTextColor(RGB(0,64,128));
    dc.SetBkMode(TRANSPARENT);
	dc.TextOut(30,5,m_strCaption);
	rect.top=30;
	dc.DrawText(m_strMessage,-1,&rect,DT_CENTER|DT_SINGLELINE|DT_VCENTER);
	//这里不需要调用CWnd::OnPaint()
}

void CMsgWnd::OnTimer(UINT nIDEvent) 
{	
	static int nHeight=0;
 	int cy=GetSystemMetrics(SM_CYSCREEN);
	int cx=GetSystemMetrics(SM_CXSCREEN);
	RECT rect;
	SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
	int y=rect.bottom-rect.top;
	int x=rect.right-rect.left;
	x=x-WIN_WIDTH;
	
	switch(nIDEvent)
	{
	case ID_TIMER_POP_WINDOW://出现
		if(nHeight<=WIN_HEIGHT)
		{
			++nHeight;			
			MoveWindow(x,
				y-nHeight,
				WIN_WIDTH,
				WIN_HEIGHT);			
		    Invalidate(FALSE);

		HWND hwnd=::FindWindow(NULL,"Message");
        if(hwnd)
        ::SendMessage(hwnd,WM_CLOSE,NULL,NULL);
		}
		else
		{//上升完成
			SetWindowText("Message");
			KillTimer(ID_TIMER_POP_WINDOW);
			SetTimer(ID_TIMER_DISPLAY_DELAY,m_DisplayTime,NULL);
		}
		break;
	case ID_TIMER_CLOSE_WINDOW://关闭
		if(nHeight>=0)
		{
			nHeight--;
			MoveWindow(x,
				y-nHeight,
				WIN_WIDTH,
				nHeight);
		}
		else
		{
			KillTimer(ID_TIMER_CLOSE_WINDOW);
			SendMessage(WM_CLOSE);
		}
		break;
	case ID_TIMER_DISPLAY_DELAY://显示
		KillTimer(ID_TIMER_DISPLAY_DELAY);
		SetTimer(ID_TIMER_CLOSE_WINDOW,m_CloseTime,NULL);
		break;
	}
	
	CWnd::OnTimer(nIDEvent);
}

int CMsgWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;	
	return 0;
}
//-----如果鼠标移动到上面,关闭窗口---------------
void CMsgWnd::OnMouseMove(UINT nFlags, CPoint point) 
{		
	CRect rect;
	GetClientRect(&rect);
	if(rect.PtInRect(point))
	{	m_bFlag=true;
	    Sleep(200);
	    SendMessage(WM_CLOSE);
	}
	CWnd::OnMouseMove(nFlags, point);
}

//-----手动设置------------------------------------
void CMsgWnd::SetMessage(CString lpCaption,//标题
						 CString lpMsg)//信息
{
    m_strCaption.Format("%s",lpCaption);
	m_strMessage.Format("%s",lpMsg);
}
void CMsgWnd::SetTime(int pop, int display, int close)
{
	m_CloseTime=close;
	m_DisplayTime=display;
	m_PopTime=pop;
}