在我们常用的软件中,有一种对话框它非常特别,能在某一时刻显示,然后显示一段时间后自动关闭,MSDN中有一些关于具体实现的说明,整理了下。实现原理很简单,首先定义一个自己的窗口类,继承自CWnd类,对其中几个比较重要的函数进行说明,
void CQQMsgWnd::CreateMsgWindow() { RECT rect; SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0); int y=rect.bottom-rect.top; int x=rect.right-rect.left; x=x-WIN_WIDTH; y=y-WIN_HEIGHT; CBrush brush; brush.CreatePatternBrush(&m_Bitmap); CreateEx(0, AfxRegisterWndClass( 0, ::LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_HAND_1)),(HBRUSH)(brush.m_hObject),NULL), "", WS_POPUP|WS_EX_TOPMOST, x, y, WIN_WIDTH,//bmBitmap.bmWidth, //Bitmap Width = Splash Window Width WIN_HEIGHT,//bmBitmap.bmHeight, //Bitmap Height = Splash Window Height AfxGetMainWnd()->GetSafeHwnd(), NULL, NULL); SetTimer(ID_TIMER_DISPLAY_DELAY,3000,NULL); }
注册一个自己定义的窗口,包含自己的鼠标,背景等,注册完之后,在某一个位置进行创建,实例代码是在窗口的右下角。然后设置一个定时器,时间为3S,
定时器处理函数:
void CQQMsgWnd::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_DISPLAY_DELAY: KillTimer(ID_TIMER_DISPLAY_DELAY); SendMessage(WM_CLOSE); break; } CWnd::OnTimer(nIDEvent); }
3S之后窗口会自动销毁。
进行贴图以及文字绘制操作,到此,基本的工作已经完成,大家还可以根据自己的需要,发挥自己的想象力,添加其它的操作。