• 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的区别,这里就不做翻译。

  • 相关阅读:
    Luogu P1004 方格取数
    Luogu P1896 [SCOI2005]互不侵犯
    Luogu P1879 [USACO06NOV]玉米田Corn Fields 【状压dp模板】
    高精度模板(结构体)
    【模板】快读
    vue input框type=number 保留两位小数自定义组件
    elementui表格表头合并
    将excle表中得数据生成insert语句插入到数据库中
    数据库基本语法
    ztree 数组和树结构互转算法
  • 原文地址:https://www.cnblogs.com/xiangism/p/2784687.html
Copyright © 2020-2023  润新知