使用对话框作为子窗口

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

简单的说这种技术的关键就在于创建一个无模式的对话框,并在编辑对话框资源时指明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的OnDestroy()中会有如下代码:delete this;所以使用成员对象的结果会造成对象的二次删除而引发异常。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值