【问题标题】:MFC Window toolbar creation fails with no error messageMFC 窗口工具栏创建失败,没有错误消息
【发布时间】:2015-10-04 15:26:14
【问题描述】:

我正在尝试为我的 MFC 应用程序动态创建工具栏。我必须遵循这项任务的方法。但是,工具栏没有显示在我的窗口中,并且我没有收到任何错误消息...

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
  // ...
  CToolBar menubar;
  if(!menubar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_FLYBY | CBRS_SIZE_DYNAMIC)) {
    return -1;
  }

  TBBUTTON buttons[5] = {
    { -1, ID_TOOLBAR_FILE, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN, { 0 }, 0, (INT_PTR)L"File" },
    { -1, ID_TOOLBAR_EDIT, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN, { 0 }, 0, (INT_PTR)L"Edit" },
    { -1, ID_TOOLBAR_VIEW, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN, { 0 }, 0, (INT_PTR)L"View" },
    { -1, ID_TOOLBAR_LAYOUT, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN, { 0 }, 0, (INT_PTR)L"Layout" },
    { -1, ID_TOOLBAR_HELP, TBSTATE_ENABLED, BTNS_AUTOSIZE | BTNS_DROPDOWN, { 0 }, 0, (INT_PTR)L"Help" }
  };


  ::SendMessage(menubar.GetSafeHwnd(), TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
  ::SendMessage(menubar.GetSafeHwnd(), TB_ADDBUTTONS, (WPARAM)5, (LPARAM)&buttons);

  ::SendMessage(menubar.GetSafeHwnd(), TB_AUTOSIZE, 0, 0);
  ::ShowWindow(menubar.GetSafeHwnd(), SW_SHOW);
}

这不会显示我的工具栏。为什么会这样?

【问题讨论】:

  • TBBUTTON的最后一个成员是字符串索引,看起来需要使用TB_ADDSTRING添加。你看过 CreateToolbarEx 吗?
  • 查看GetSafeHwnd() 的源代码,该函数特别适合使用空this 指针IIRC 调用。但是,在您的情况下,它不可能为空。但是,窗口句柄可能为 NULL!为了检查它,请改用menubar.SendMessage(),它正确地断言指针已设置。另外,当然要确保在启用调试的情况下进行编译。

标签: c++ mfc


【解决方案1】:

我发现将工具栏声明为类成员可以解决问题。所以这就是我所做的:

class CMainFrame : public CFramWnd {
protected:
  CToolBar m_wndToolBar;
  // ...
}

其余代码几乎没有变化。我仍然不确定它为什么会这样工作。

【讨论】:

  • 具有自动存储期限的对象在离开其定义的范围时被销毁。换句话说,当OnCreate 返回时,您的menubar 对象被销毁,其析构函数沿途销毁工具栏控件。使其成为类成员将工具栏控件的生命周期与主框架窗口的生命周期联系起来。
  • 很好的解释。我也知道,但我没有建立联系。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多