zoukankan      html  css  js  c++  java
  • MFC子窗体、父窗体

    现在需要将一个窗体放到一个控件中,默认情况下窗体的Style属性为Popup,而在控件的初始化时,代码如下:

    m_dealDlg=shared_ptr<CImageDealDlg>(new CImageDealDlg());
    m_dealDlg->Create(IDD_imageDeal);
    m_dealDlg->SetParent(this);
    m_dealDlg->ShowWindow(SW_SHOW);

    这样做几乎没有问题——只有一个小小的完美之处——一个程序添加这个控件窗口后,如果有其它的非Topmost窗体有部分覆盖主程序,这时用鼠标直接点击子窗体,主程序不会弹到最上层来。用简洁的话说,即虽然用SetParent可以将一个窗体与虽一窗体设置为父子关系,但这时它们只是看起来像而已,即子窗体会跟随移动,可是没有没有消息通信。

    于是想到将Style属性设置为Child,可这时在Release模式下,控件一片空白,在Debug模式下在winocc.cpp的328行ASSERT中断,发现是因为m_hWnd没有值的原因,而m_hWnd一般是在Create时被创建的,这时再研究下Create是否被正确调用,发现其后还可以指定第二个参数CWnd* pParentWnd。于是改成

    m_dealDlg->Create(IDD_imageDeal,this);

    发现程序正常运行,再去掉 m_dealDlg->SetParent(this); 也可正常运行。

    原来如此,Parent得在Create函数中指定。这里再吐槽下,MFC中有三个地方可以设置父窗体——构造函数、Create参数、SetParent。

    在MSDN中搜索Window Styles可以知道各种Style的区别,这里就不做翻译。

  • 相关阅读:
    我家笨笨爱上了小笨
    Outlook备份全攻略
    中国男篮有希望!评中国vs西班牙之战
    男为己悦者穷
    转:15则笑话
    看看你家乡在全国的位置2008最新各省市的GDP和人均收入排名
    锦江之星 .VS. 如家HOME INN
    学会心理养生
    另眼看北京奥运
    南方餐馆与北方餐馆
  • 原文地址:https://www.cnblogs.com/xiangism/p/2784687.html
Copyright © 2011-2022 走看看