MFC 应用程序不在 Visual Studio 外部显示工具栏

Posted

技术标签:

【中文标题】MFC 应用程序不在 Visual Studio 外部显示工具栏【英文标题】:MFC Application don't display toolbar outside Visual Studio 【发布时间】:2017-07-14 05:45:20 【问题描述】:

我使用 Visual Studio 2015 创建的 MFC 应用程序有一个奇怪的问题。

如果我通过本地 Windows 调试器在 Visual Studio 中运行应用程序,一切都会按预期工作。

如果我在 Visual Studio 之外启动生成的 .exe 文件,工具栏和状态栏不会显示在大型机中。我无法通过查看菜单激活它们。因此,当我使用将文本写入状态栏的菜单点时,我的应用程序会崩溃。

有人现在有什么问题吗??

也许我不知道应该在问题中显示哪些代码,请随时询问 cmets 中的特定代码部分。我将编辑问题并提供代码。

这是创建工具栏和状态栏的代码。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    
        //TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    

    m_wndToolBar.LoadTCToolBar(16, IDB_TOOLICONS, IDB_TOOLICONS_HOT, IDB_TOOLICONS_DISABLED, RGB(255, 0, 255));

    if (!m_wndStatusBar.Create(this))
    
        //TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT));

    return 0;

【问题讨论】:

“我不知道我应该在问题中显示哪些代码” 重复您的错误并导致完整、可运行的程序的最少可能的代码集。这通常称为minimal reproducible example 或简称为 MCVE。 MCVE 的美妙之处在于,一旦您生成了一个错误,该错误几乎没有可以隐藏的空间,并且经常允许您删除或自行回答问题,因为 MCVE 明确了问题的原因。 能否展示代码,在主框架中创建状态和工具栏的位置? 我创建了一个全新的 MFC 程序,就像有问题的那个程序一样。在那个新创建的 MFC 程序中,没有发生所描述的错误。 【参考方案1】:

我已经通过在 OnCreate 方法中重新排列一个简单的代码解决了这个问题。

方法现在看起来像这样:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)



    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    
        //TRACE0("Failed to create toolbar\n");
        return -1;      // fail to create
    

    m_wndToolBar.LoadTCToolBar(16, IDB_TOOLICONS, IDB_TOOLICONS_HOT, IDB_TOOLICONS_DISABLED, RGB(255, 0, 255));

    if (!m_wndStatusBar.Create(this))
    
        //TRACE0("Failed to create status bar\n");
        return -1;      // fail to create
    
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators) / sizeof(UINT));

    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;

    return 0;

我不得不移动线条

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
            return -1;

到方法的末尾。然后显示条形图。

【讨论】:

以上是关于MFC 应用程序不在 Visual Studio 外部显示工具栏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2017 中创建 Visual c++ MFC 控制台项目

为啥 CDC::LineTo() 不在 Visual C++ 2015 MFC 对话框中绘制?

在 Visual Studio 中编写 MFC/STL 程序需要做啥?

如何在Visual Studio 2015中创建MFC窗体应用

如何在Visual Studio 2015中创建MFC窗体应用

用于非 MFC 应用程序的 Visual Studio 2012 资源编辑器