非模式对话框BMP图片显示再问
这个问题是接了前面个问题出现的新问题....
前面一个问题是尝试做了一个类似KUGOO音乐下载软件开头那样的开机LOGO.
用的是对话框来做的.
1.基于对话框模式的MFC.
2.建立了一个新的对话框.定义类名为Clogo.
3.对话框中所有原始控件删除.添加了一个PICTURE空间.属性改为BITMAP.导入了BMP格式的图片.
4.在主对话框,也就是建立完成后就有一个的那个对话框的初始化函数里面写了下面的代码:
(采用非模式调用Clogo这个对话框.)
Clogo* testlogo
testlogo = new Clogo();
testlogo->create(Clogo::IDD);
testlogo->ShowWindow(SW_SHOW);
Sleep(2000);
testlogo->destroyWindow();
5.调试出现问题,LOGO对话框是出现了2秒后消失,主对话框出现.
但是LOGO对话框上的图片没有显示出来.我改用DoModel的方式去做.就能显示出来...
但是不会操作如何让DoModel后两秒自动小时...请各位高手指点.小弟初学.谢谢.
参考文章:
http://topic.csdn.net/t/20050221/16/3795835.html
http://topic.csdn.net/t/20021215/23/1263527.html
http://vckbase.com/document/viewdoc/?id=513(splash实现模式。。但是我想用对话框实现。。。)
以及相关MSDN文档。。。
[解决办法]
用了Sleep,阻塞了对话框的消息循环;应该在CLogo对话框中使用定时器,定时时间到了退出对话框;SetTimer放在CLogo::OnInitdialog()中。
另外,显示CLogo的代码可以放在C...App::InitInstance()里面主对话框的DoModoal()前面。
[解决办法]
原因: 消息线程阻塞在Sleep
解决方法:
1. 用线程创建窗体
2. 在Sleep的时候处理消息, 比如用下面这个函数代替sleep
void IdleSleep(DWORD dwTime, HWND hWnd){ MSG msg; DWORD Tstart, Time; BOOL bRetVal; Tstart = GetTickCount(); for(;;) { bRetVal = PeekMessage(&msg, hWnd, NULL, NULL, PM_REMOVE); if(bRetVal) { TranslateMessage(&msg); DispatchMessage(&msg); } else { Time = GetTickCount(); if(Time - Tstart >= dwTime) return; Sleep(1); } }}