在创建时更改对话框的样式以覆盖 .RC 模板中的内容

Mr.*_*Boy 7 winapi mfc

我有一个使用 VS2005 中的资源编辑器创建的小对话框。它将以两种不同的方式用作另一个对话框的子对话框...要么作为像自定义控件一样位于对话框顶部的子对话框,要么作为可以移动到父窗口边界之外的弹出窗口。如果我修改 RC 文件中的单个样式,这两个样式都会按预期工作 - 只需用 WS_POPUP 替换 WS_CHILD 即可进行切换:

IDD_WIDGET DIALOGEX 0, 0, 221, 78
STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_POPUP | WS_BORDER
EXSTYLE WS_EX_TOOLWINDOW | WS_EX_STATICEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    PUSHBUTTON      "Pre&view",IDC_ACTION_PREVIEW,64,59,50,15
    PUSHBUTTON      "M&ore",IDC_ACTION_MORE,115,59,50,15
    PUSHBUTTON      "S&elect",IDC_ACTION_SELECT,168,59,50,15
END
Run Code Online (Sandbox Code Playgroud)

问题是,我希望能够在运行时创建子对话框作为一种小部件类型框架时选择行为,例如覆盖 RC 文件样式

我试过:

BOOL CMyDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_Widget.Create(IDD_WIDGET,this);
    DWORD oldstyle = m_Widget.GetStyle();
    m_Widget.ModifyStyle(WS_POPUP,WS_CHILD);
    DWORD newstyle = m_Widget.GetStyle();
}
Run Code Online (Sandbox Code Playgroud)

但我可以看到,除了 GetStyle 的结果从 更改为0x8400044C...0x4400044C小部件子对话框开始不可见之外,没有什么区别,但当我显示它时,它保留了 WS_POPUP 行为。

出了什么问题,如何修复?

正如Ben建议的那样,我想知道这是否是在创建窗口后不能更改的样式,但问题是如何在用于创建窗口之前拦截对话框模板结构并修改样式?

Ben*_*ett 4

我为您找到了这篇文章:链接文本

看起来 InitDialog 已经来不及改变样式了。此链接中有一个如何执行此操作的示例。