荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 5.9 使用对话框作为子窗口
发信站: 荔园晨风BBS站 (Wed May 30 07:01:21 2001), 转信

5.9 使用对话框作为子窗口

使用对话框作为子窗口是一种很常用的技术,这样可以使界面设计简化而且修改起来更
加容易。

简单的说这种技术的关键就在于创建一个无模式的对话框,并在编辑对话框资源时指明
Child风格和无边框风格,如图。接下来利用产生一个CDialog的派生类,并进行相关的
消息映射。在创建子窗口时需要利用下面的代码:
int CMy59_s1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;

        //创建子窗口
        m_dlgChild.Create(IDD_CHILD_DLG,this);
        //重新定位
        m_dlgChild.MoveWindow(0,0,400,200);
        //显示窗口
        m_dlgChild.ShowWindow(SW_SHOW);
        return 0;
}

此外还有一中类似的技术是利用CFormView派生类作为子窗口,在编辑对话框资源时也需
要指明Child风格和无边框风格。然后利用ClassWizard产生以CFormView为基类的派生类
,但是由于该类的成员函数都是受保护的,所以需要对产生的头文件进行如下修改:
class CTestForm : public CFormView
{
//将构造函数和构析函数改为共有函数
public:
        CTestForm();
        virtual ~CTestForm();
        DECLARE_DYNCREATE(CTestForm)
...
}

有关创建子窗口的代码如下:
int CMy59_s1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;

        //对于CFormView派生类必须新生成对象而不能使用成员对象
        m_pformChild = new CTestForm;
        //由于CFormView的成员受保护,所以必须对指针进行强制转换
        CWnd* pWnd=m_pformChild;
        pWnd->Create(NULL,NULL,WS_CHILD|WS_VISIBLE,CRect(0,210,400,400)
,this,1001,NULL);
        return 0;
}

最后你会看到如图的窗口界面,上方的对话框子窗口和下方的FormView子窗口都可以通
过资源编辑器预先编辑好。
提示:对于CFormView派生类必须新生成对象而不能使用成员对象,因为在CView的OnDe
stroy()中会有如下代码:delete this;所以使用成员对象的结果会造成对象的二次删除
而引发异常。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店