MFC MDI 属性页单选按钮在功能 1 的一个页面上工作,功能 2 在另一页面上的按钮不触发

问题描述

继续我的对话框设置属性表/页面对话框,我有 5 个页面中有 4 个在工作。在 MFC 中,他们提供了名为 ApplicationLook 的简洁样式方法,在我的一个属性页上,我将单选按钮都设置为该函数中 case 值的值,并且它按预期工作。我复制了 ApplicationLook 的 switch 函数并更改了其他属性页的值,这些值将控制所提供的 tabs 样式。具有选项卡的属性页遵循提供的选项卡样式的枚举。

使用 ON_COMMAND_RANGE 就像 ApplicationLook 一样,单选按钮应该进入标签功能......但它从来没有......就像没有人在家一样。但是,我创建了两个 MenuItems 用于测试,名为 tab1tab2,它们具有相同的大小写标识符,并且它们都可以工作并进入选项卡功能属性表的单选按钮具有相同的案例标识符,但它从不触发该功能。我查看了 ApplicationLook 是否在任何地方有任何 DDX 或 DDV 控件,我在 ApplicationLook 上很幸运,但没有,所以这似乎不是问题。

为了测试,函数条目上唯一应该发生的事情是向输出窗口写入一个测试字符串,显示它进入了那个案例,然后写入注册表设置值......基本上是一个骨架函数,只是为了验证单选按钮操作...这就是问这个问题的原因。

这很奇怪,因为 menuitemradiobutton ID 是相同的,它们应该都触发该函数……但这并没有发生。由于我逐字复制了函数元素,这让我很难过。这两个函数都位于 MainFrame.cpp

BEGIN_MESSAGE_MAP(CMainFrame,CMDIFrameWndEx)
    ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000,ID_VIEW_APPLOOK_WINDOWS_7,&CMainFrame::OnApplicationLook)
    ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000,&CMainFrame::OnUpdateApplicationLook)
    
    ON_COMMAND_RANGE(STYLE_3D_USER,STYLE_3D_ROUNDED_SCROLL_USER,&CMainFrame::OnUserTabStyles)
    //ON_UPDATE_COMMAND_UI_RANGE(STYLE_3D_USER,&CMainFrame::OnUpdateApplicationLook)
END_MESSAGE_MAP()

资源.h

#define STYLE_FLAT_USER                 201
#define STYLE_FLAT_SHARED_HORZ_SCROLL_USER 202
#define STYLE_3D_SCROLLED_USER          203
#define STYLE_3D_ONENOTE_USER           204
#define STYLE_3D_VS2005_USER            205
#define STYLE_3D_ROUNDED_USER           206
#define STYLE_3D_ROUNDED_SCROLL_USER    207
#define ID_VIEW_APPLOOK_WIN_2000        40013
#define ID_VIEW_APPLOOK_OFF_XP          40014
#define ID_VIEW_APPLOOK_WIN_XP          40015
#define ID_VIEW_APPLOOK_OFF_2003        40016
#define ID_VIEW_APPLOOK_VS_2005         40017
#define ID_VIEW_APPLOOK_VS_2008         40018
#define ID_VIEW_APPLOOK_OFF_2007_BLUE   40019
#define ID_VIEW_APPLOOK_OFF_2007_BLACK  40020
#define ID_VIEW_APPLOOK_OFF_2007_SILVER 40021
#define ID_VIEW_APPLOOK_OFF_2007_AQUA   40022
#define ID_VIEW_APPLOOK_WINDOWS_7       40023

我已将该函数缩减为 2 种情况和仅用于测试的认值。

MainFrame.cpp

void CMainFrame::OnUserTabStyles(UINT id)
{
    CWaitCursor wait;
    m_nAppTabLook = id;

    switch (m_nAppTabLook)
    {
    case STYLE_3D_USER:
        AfxGetApp()->WriteProfileString(_T("Settings"),_T("UserTabStyle"),_T("STYLE_3D")); // Save value to registry
        m_wndOutput.AddStringStatusTab(_T("3D"));

        break;

    case STYLE_FLAT_SHARED_HORZ_SCROLL_USER:
        AfxGetApp()->WriteProfileString(_T("Settings"),_T("STYLE_FLAT_SHARED_HORZ_SCROLL")); // Save value to registry
        m_wndOutput.AddStringStatusTab(_T("H Scroll"));

        break;

    default:
        switch (m_nAppTabLook)
        {
        case STYLE_FLAT_USER:
            m_wndOutput.AddStringStatusTab(_T("Flat User"));

            break;
        }

    }

}

Settings Dialog Tab View

tabs 对话框页面中,3d StyleFlat 被设置为函数中的前两个 case 值:

STYLE_3D_USER
STYLE_FLAT_SHARED_HORZ_SCROLL_USER

正如我上面提到的,下图显示了两个 tabs,它们被设置为 STYLE_3D_USERSTYLE_FLAT_SHARED_HORZ_SCROLL_USER 的相同大小写值以按预期触发函数

Tabs menus that do drive the function correctly

它确实告诉我(我认为)我的消息范围图工作正常。我只是不明白为什么设置为菜单项的确切 ID 值的单选按钮不会触发该功能。请注意,我展示的方法与我用于 ApplicationLook方法完全相同,这就是为什么我对选项卡式视图做了同样的事情,因为我知道它以一种方式工作......激发了 tab查看(我无法上班)。

ApplicationLook doing it the same way,does work

如果我能弄清楚为什么这不起作用,我“几乎”就在那里。有什么想法可能是错的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)