MFC创建Splash主要步骤

 创建Splash窗口(程序LOGO样子的)可用两种 ,一种是派生自CDialog,较简单;另一种派生自CWnd。这里记录后一种方式:

1. 派生CMySplashWnd自CWnd;
2. 重载一个Create函数,如:
public:
    BOOL Create(CWnd* pParentWnd = NULL);

在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()
{
    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);
}

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可以更新窗口,还可以显示窗口至顶层(在改程序处于激活状态时)。

你可能感兴趣的:(日常)