ProgJ 2016-03-05 06:49 采纳率: 50%
浏览 1988
已采纳

MFC 实现启动画面淡入淡出的问题

 int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    CenterWindow(); // 启动画面窗口居中
    SetTimer(1, 3000, NULL); // 启动画面显示时间为 3 秒
    AnimateWindow(1200, AW_BLEND); // 窗口渐显,实现淡入效果,时间 1.2 秒
    return 0;
}


void CSplashWnd::OnClose()
{
    AnimateWindow(800, AW_BLEND | AW_HIDE); // 窗口渐隐,实现淡出效果,时间 0.8 秒
    CWnd::OnClose();
}


void CSplashWnd::OnTimer(UINT_PTR nIDEvent)
{
    KillTimer(1); // 销毁定时器
    PostMessage(WM_CLOSE); // 关闭启动画面
    CWnd::OnTimer(nIDEvent);
}


BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC)
{
    HINSTANCE hApp = ::GetModuleHandle(NULL); // 得到应用程序的模块句柄
    HBITMAP hbmp = ::LoadBitmap(hApp, MAKEINTRESOURCE(IDB_BITMAP13)); //加载程序中的位图资源
    HDC hmdc = ::CreateCompatibleDC(pDC->GetSafeHdc()); // 创建兼容 DC作为内存 DC
    HBITMAP hbmpOld = (HBITMAP) ::SelectObject(hmdc, hbmp); //将位图选入内存 DC
    ::BitBlt(pDC->GetSafeHdc(), 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT, hmdc, 0, 0, SRCCOPY); // 将内存 DC 中的内容拷贝到设备 DC 以显示

    // 清理,防止内存泄漏
    ::SelectObject(hmdc, hbmpOld);
    ::DeleteObject(hbmp);
    ::DeleteDC(hmdc);

    return CWnd::OnEraseBkgnd(pDC);
}

实现启动画面淡入淡出时遇到一个疑惑。相关代码如上。按道理应该SetTimer后会响应OnTimer();但是我调试发现竟然没有。。

CSplashWnd对象的创建我是在CMainFrame的OnCreate中进行的;

 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    CSplashWnd* temp = new CSplashWnd();           //显示启动画面
    temp->OnCreate(lpCreateStruct);
    Sleep(1000);
    temp->OnClose();
    temp->~CSplashWnd();
    temp = NULL;                                   //释放内存

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
..........

temp->OnCreate(lpCreateStruct);后根本就没进入OnTimer()...
是不是我哪个地方概念没搞清楚= =

  • 写回答

6条回答

  • threenewbee 2016-03-05 08:12
    关注

    不用那么麻烦,最简单的做法是定时器循环调用
    SetLayeredWindowAttributes

    http://baike.baidu.com/link?url=D8_84M_5ZKBL4ebuRvw8eg8czVE3IEA1LWp231UhM0O6tTpIueblszz6ddZC9oCbIYT1QpubqwsbjXDO7ZnoHK

    bAlpha参数决定了透明度,从0~255走一遍就是淡入了,反之就是淡出了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献