创建Splash窗口(程序LOGO样子的)可用两种
,一种是派生自CDialog,较简单;另一种派生自CWnd。这里记录后一种方式:
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用
CDC dcImage;
if(!dcImage.CreateCompatibleDC(&dc)) return;
BITMAP bm;
m_bitmap.GetBitmap(&bm);
CBitmap* pOldBitmap=dcImage.SelectObject(&m_bitmap);
dc.SetStretchBltMode(COLORONCOLOR);
dc.StretchBlt(0,0,bm.bmWidth,bm.bmHeight,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
dcImage.SelectObject(pOldBitmap);
1. 派生CMySplashWnd自CWnd;
2. 重载一个Create函数,如:
BOOL Create(CWnd* pParentWnd = NULL);
public:
在Create函数中可以做创建m_bitmap的工作,根据自己需要。然后调用CreateEx函数,注意样式参数,可以这样调用:
CreateEx(0,
AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_WAIT)),
_T("Whatever you want"),
WS_POPUP | WS_VISIBLE,
0, 0, bm.bmWidth, bm.bmHeight,
pParentWnd->GetSafeHwnd(),
NULL);
3. 重载WM_PAINT消息,进行背景图的绘制,比如:
void CMySplashWnd::OnPaint()
{
}
4.其他步骤:
如果需要Splash定时关闭,可以在OnCreate函数中SetTimer,并在OnTimer中调用DestroyWindow();
如果要在OnTimer中调用DestroyWindow销毁窗口,可在PostNcDestroy中delete this;
如果即不再此处delete,也不再外部delete,虽可以运行,但会有内存泄露。
备注:
- AfxRegisterWndClass可注册默认窗口类,其参数可编辑指针等;
- AfxGetMainWnd可得到主窗口;
- AfxGetApp()->LoadStandardCursor(IDC_WAIT),加载标准WAIT指针;
- GetSafeHwnd得到窗口的Safe句柄;
- OnEraseBkgnd是否有必要直接return TRUE,再考虑;
- UpdateWindow可以更新窗口,还可以显示窗口至顶层(在改程序处于激活状态时)。