2 qq 28254507 qq_28254507 于 2016.03.05 14:49 提问

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个回答

caozhy
caozhy   Ds   Rxr 2016.03.05 16:12
已采纳

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

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

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

qq_28254507
qq_28254507 知道错哪了。。我不应该受自己调用OnClose(),否则会因为时间设置的问题,OnTimer()响应之前已经提前close了。。
2 年多之前 回复
caozhy
caozhy 回复ProgJ: KillTimer(1); // 销毁定时器 没必要
2 年多之前 回复
qq_28254507
qq_28254507 但是我这里为什么定时器失效了。。不理解啊
2 年多之前 回复
qq_28254507
qq_28254507   2016.03.05 16:36

问题已经解决了。感谢两位帮助!

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 16:12

要不我也写一个SplashScreen 示例程序吧。

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 14:58

这不是图像处理的问题了吗,你这Sleep是睡得香啊,人家开发软件件是借SplashScreen来争取时间加载资源,你却在睡大觉,太讨厌了。

qq_28254507
qq_28254507 受教了。但是不要sleep()问题依然存在啊。。
2 年多之前 回复
WinsenJiansbomber
WinsenJiansbomber   2016.03.05 16:30

其实Splash按简单做的思路就对了。

WinsenJiansbomber
WinsenJiansbomber   2016.03.05 16:09

取消Sleep后应该是看不到Splash的,因为在CMainFrame::OnCreate中创建了一个CSplashWnd,同时又在这时把它干掉了!程序执行是非常快的,基本上没来得及显示出来。

qq_28254507
qq_28254507 我想知道的是OnTimer()怎么没能响应啊?
2 年多之前 回复
qq_28254507
qq_28254507 AnimateWindow(1200, AW_BLEND); // 窗口渐显,实现淡入效果,时间 1.2 秒 但是这个语句让画面一定程度上保留了一会啊。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Unity 启动画面淡入淡出
博客园-原创精华区 原文  http://www.cnblogs.com/wuzhang/p/wuzhang20150524.html 主题 Unity using UnityEngine; using System.Collections; public class SplashScreen : MonoBehaviour { //要加载的关卡 public string
MFC程序启动画面
简单的MFC程序,完成程序启动时的启动画面效果
VS2010 MFC添加启动画面
【原文】http://blog.csdn.net/libenqing/article/details/5961991 的
MFC渐入渐出框实现方式二
类似360消息弹出框,实现方式一见http://blog.csdn.net/segen_jaa/article/details/7848598。 本文采用另外的API实现渐入渐出效果。 主要API:SetLayeredWindowAttributes。 实现功能: 采用管理器控制消息框每次只显示一个。 消息框独立显示在右下角,不随主窗口放大缩小变化。 鼠标进入消息框区域,渐入渐
在VS2010的环境下,给mfc下的对话框添加启动画面
摸索了半天,终于完成简单的开机启动画面了,不过大部分都是套用别人的模板的,即下载Spash.cpp 以及Splash.h文件并添加至工程中,该文件在附件中有讲。 首先下载一张.BMP图形,该图形最好和你的对话框的尺寸大小一致,并将该图形导入至资源视图中,设置其ID为IDB_SPLASH 在你的对话框的***.cpp下的InitInstance()函数中添加以下语句:        CShel
图象淡入淡出(VB6)
一般传统的实现两个PictureBox之间图像的淡入淡出效果都需要使用大量的API函数并进行复杂的调色板以及绘图设备(Device Context)的操作。但是在Win98、Win2000中,微软提供了支持透明图像拷贝的AlphaBlend函数。这篇文章就介绍如何通过API函数AlphaBlend实现PictureBox之间图像的淡入淡出效果。AlphaBlend函数的定义在msimg32.dll
MFC 中实现窗口淡入淡出、逐步放大显示效果
http://m.blog.csdn.net/blog/woaiwcy/4715336 [原]MFC 中实现窗口淡入淡出、逐步放大显示效果 2009-10-22阅读1444 评论0 MFC 中实现窗口淡入淡出、逐步放大显示效果,主要是利用相关函数+定时器实现 1、  窗口逐步放大显示: 这里要用到CRECT的三个函数InflateRec
mfc 为程序增加启动画面
1、利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h 这两个文件(也就是基于框架类的应用程序添加启动画面的步骤)  (1)用Photoshop等制作启动画面图像,保存为bmp格式。    (2)用Appwizard建一个基于单文档的工程Splash。    (3)在资源中插入位图资源       打开VC++的资源编辑器,用鼠标右键单击Resou
VS2013中使用MFC的时候添加启动画面
在学《VC++深入详解》这本书的时候,作者使用的是VC++6.0,然而我用的VS2013,很多地方都有了变化。 在9.8启动画面中,有很大的不同。百度之后,参考了网上一写代码(参考1,参考2),整理如下: 首先要使用类向导,创建一个MFC类CSplashWnd,基类是CWnd。 然后自己找一张Bmp放在工程的res文件夹下,并在VS->资源视图->点击右键,添加资源,选择bitmap,令其I
VC++启动画面
VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面VC++ ,MFC启动画面