MFC的非模态对话框资源管理

非模态对话框比模态对话框更难使用这是众所周知的,这是由于模态对话框运行时,阻塞了其父窗口的消息循环,使其能自成一派,所以能够怡然自得。但非模态对话框只相当于一个由父窗体创建的一个同级的Hwnd,就像一个长大了的孩子,可以和父母并驾齐驱了,需要父母管又不能管的太厉害,其资源管理、通信都会比模态的更为复杂。  

很多时候,能用模态对话框的情况下,都会用模态的。虽然Copper 老先生指着鼻子苦口婆心的教导了我们,但有时候人懒脸皮也就厚了,无所谓了。但,世界总是很残酷,很多时候(比如需要在处理对话框事件的时候也能响应窗体事件),我们不得不去面对非模态对话框。其实了解了资源管理的模式,就像扒开了非模态对话框半遮的琵琶,可以很坦然的面对了。

模态对话框的资源分成两种,一种是内存资源,一种是非内存资源。单看非内存资源的管理,其实和内存资源的管理原理是一样的。在C++中,内存资源的管理讲究new和delete配对,同理,非内存资源的管理需要create和destroy出双入对。在这篇文章中,基本体现了非模态对话框资源管理的一个基本模式,即内存资源管理和非内存资源同步。

这样通过判断内存资源是否占用(即指针是否为空)就可以判断非内存资源的使用状况。当指针为空,说明对话框还未创建(非内存资源未申请);当指针不为空,对话框已创建,正处于可见或不可见状态。这样将两部分资源管理合并在一起了,只需要判断指针是否为空就可以了解对话框资源的状态。一些内存管理的手段,比如类管理思想(将delete和destroy放到类的析构函数中),可以实现资源的自动管理。

为了实现这种管理模式,要注意以下几点:

1. 在堆上分配非模态对话框的内存资源,通俗一点的描述就是不要用这种方式:CXXDialog t;而是用这种方式:CXXDialog *t = new CXXDialog();来分配内存。

2. 同步构造和析构过程,就是说有new一定配上个create,delete一定要勾搭一个destroy。

3. 被delete的内存指针一定要置空,也就是下面两句要接踵而至:delete xx;和xx == null;。其实这也是普通的内存管理需要遵循的一个良好习惯。

了解了这些,非模态对话框也会只有温柔没有狰狞。

posted on 2007-07-21 20:56 duguguiyu 阅读(...) 评论(...) 编辑 收藏

导航

统计