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

时间:2010-06-03 14:17:14

标签: mfc winapi

我在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

问题是,我希望能够在运行时创建子对话框时选择行为作为一种窗口小部件类型框架,例如覆盖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();
}

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

出了什么问题,如何解决?

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

1 个答案:

答案 0 :(得分:1)

我发现了这篇文章:link text

看起来像InitDialog来不及改变风格。有一个如何在这个链接中做到这一点的例子。