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; }