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

标签 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 建议的那样,我想知道这是否不是在创建窗口后可以更改的样式,但问题是如何在用于创建窗口之前拦截对话框模板结构并修改样式?

最佳答案

我为你找到了这篇文章:link text

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

关于mfc - 在创建时更改对话框的样式以覆盖 .RC 模板中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966777/

相关文章:

c++ - 在 C++ 中使用 ListView

wpf - 无模式子 WPF 窗口到 native MFC MDI 应用程序

c++ - 在 MFC 的 CListCtrl 中禁用多个项目的按钮

c++ - 另一个从剪贴板线程绘制位图

c# - 我应该使用哪个平台 : native C++ or C#?

c++ - 通知图标接收 WM_LBUTTONDBLCLK 但不接收 WM_CONTEXTMENU

winapi - 如何在不关闭 explorer.exe 或重新启动 Windows 的情况下重建 Windows 图标缓存?

c++ - 如何使用常规 Windows C/C++ API 查询进程的线程数

c++ - WaitForSingleObject 未锁定,仍允许其他线程更改 C++ 中的值

c++ - 如何在单独的线程中创建带有进度条的 MFC 对话框?