【发布时间】: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(),它正确地断言指针已设置。另外,当然要确保在启用调试的情况下进行编译。