MFC如何实现:主程序对话框启动,同时打开子对话框

对非模态对话框那怎么可能会沒动作,是你的逻辑有问题吧: 参数设置完毕(某个按钮的click): { 主窗口.Invalidate(); 局部放大窗口.Invalidate(); } 即可不要去在OnPaint中去发送什么WM_ICONERASEBKGND之类的消息

对于比较大的程序在启动的时候都会显示一个画面,以告诉用户程序正在加载或者显示一些关于软件的信息,如Visual C++,Word, PhotoShop

这些启动画面在Visual C++中怎么实现呢?对于文档/视图结構的程序可以直接使用VC提供的SplashWnd组件。可是在基于对话框的程序却不能使用SplashWnd组件因此只能自己来实现此功能。

因为显示启动画面的同时還要进行程序的加载工作所以要用到多线程。MFC区分了两种不同类型的多线程:用户界面(UI)线程和工作者线程两者的区别是UI线程有消息循环,而工作者线程没有UI线程能够创建窗口并处理发送给窗口的消息。工作者线程用来执行后台任务这些后台任务不直接接受用户輸入,因此不需要窗口和消息循环 因为这里要显示一个画面,所以要使用UI线程

下面结合我做的一个小软件“实用闹钟”来说明如何为對话框程序制作启动画面。

首先准备一副位图资源插入到工程中作为启动时显示的画面。再插入一个对话框设置IDIDD_SPLASH。在上面放一个picture控件类型设为”Bitmap,图象选择刚才插入的位图。

Bar属性并调整对话框的大小与位图等大,这样对话框显示的时候你看到的只是图片。打开 ClassWizard為此对话框建立一个新类CSplashDlg, 基类为CDialog.

下面我们将在UI线程的InitInstance()函数中调用刚才创建的对话框并显示

//:通常系统内的每个线程都有自己的输入队列。夲函数允许线程和进程共享输入队列连接了线程后,输入焦点、窗口激活、鼠标捕获、键盘状态以及输入队列状态都会进入共享状态 . (这個函数可以不用)

//设为pulic类型,是为了在其他类中能够访问

为了让程序一起动就显示启动画面,这段代码应该放在InitInstance()最开头的地方.

后面,即在构造了主對话框之后隐藏启动画面, 程序运行时会发现,启动画面结束后,还要等一会才能显示出主对话框,这样就达不到启动画面应有的效果. 最好应该在即将显示主对话框的时候隐藏启动画面. 我的这个软件中在主对话框中定义了5个子对话框类的对象,分别是page1,page2,page5.

程序启动时的流程如下:

由此可见,啟动画面结束的最好地方应该是在 page5的初始化函数中

到此,一个对话框程序的启动画面就这样完成了.由于是用对话框作为启动画面,所以你可以伱可以发挥你的想象力,在对话框上设计出丰富多才的效果来,比如加上Flash,Gif动画等

加载中请稍候......

我要回帖

 

随机推荐