MFC 自定义的工具栏图标被菜单栏遮住了一半怎么解决 如题,MFC 创建的单文档,我想自定义工具栏,因此把程序生成的有关工具栏的代码全隐掉了,添加上了自己的代码,是通过ImageList逐个添加图标的。创建采用的是myToolBar.create(this)菜单栏没有动过,调试通过之后,发现图标能出来,但被菜单栏遮住了一半,求大神怎么解决?先谢过了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 See :CWnd::RepositionBars 看看你的 Create 代码 想不出为什么要“把程序生成的有关工具栏的代码全隐掉了”?只要修改一下就可以使用自己的ToolBar,你要自己写代码前也需要先完全搞清原代码每一句的作用。 想不出为什么要“把程序生成的有关工具栏的代码全隐掉了”?只要修改一下就可以使用自己的ToolBar,你要自己写代码前也需要先完全搞清原代码每一句的作用。您说的很对,可是原来的代码是采用一次添加一排图标的方法,而我希望的是一个图标一个的添加,这样利于后期维护,还有,原来代码用的是CMFCToolBar类,而网上的多用的是CToolBar类,两者很多地方都不同 "看看你的 Create 代码" 我是基本将原来的代码都注释掉了,自己制作工具栏的代码在CreateExToolBar里,可是奇怪的是我将原来代码里的制作菜单栏的代码注释掉是图1,不注释,也就是沿用它原来的菜单栏代码,却是图2,明显工具栏挡住了菜单栏 这个是原来的代码,大部分都被我注释掉了:int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){ if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; //创建扩展工具栏 if (!this->CreateExToolBar()) return -1; //BOOL bNameValid; //// 基于持久值设置视觉管理器和样式 //OnApplicationLook(theApp.m_nAppLook); if (!m_wndMenuBar.Create(this)) { TRACE0("未能创建菜单栏\n"); return -1; // 未能创建 } m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); //// 防止菜单栏在激活时获得焦点 //CMFCPopupMenu::SetForceMenuFocus(FALSE); //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || // !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) //{ // TRACE0("未能创建工具栏\n"); // return -1; // 未能创建 //} //CString strToolBarName; //bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); //ASSERT(bNameValid); //m_wndToolBar.SetWindowText(strToolBarName); //CString strCustomize; //bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE); //ASSERT(bNameValid); //m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); //// 允许用户定义的工具栏操作: //InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId); if (!m_wndStatusBar.Create(this)) { TRACE0("未能创建状态栏\n"); return -1; // 未能创建 } m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); //// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行 //m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); //EnableDocking(CBRS_ALIGN_ANY); //DockPane(&m_wndMenuBar); //DockPane(&m_wndToolBar); //// 启用 Visual Studio 2005 样式停靠窗口行为 //CDockingManager::SetDockingMode(DT_SMART); //// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为 //EnableAutoHidePanes(CBRS_ALIGN_ANY); //// 加载菜单项图像(不在任何标准工具栏上): //CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0); //// 创建停靠窗口 //if (!CreateDockingWindows()) //{ // TRACE0("未能创建停靠窗口\n"); // return -1; //} //m_wndFileView.EnableDocking(CBRS_ALIGN_ANY); //m_wndClassView.EnableDocking(CBRS_ALIGN_ANY); //DockPane(&m_wndFileView); //CDockablePane* pTabbedBar = NULL; //m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar); //m_wndOutput.EnableDocking(CBRS_ALIGN_ANY); //DockPane(&m_wndOutput); //m_wndProperties.EnableDocking(CBRS_ALIGN_ANY); //DockPane(&m_wndProperties); //// 启用工具栏和停靠窗口菜单替换 //EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); //// 启用快速(按住 Alt 拖动)工具栏自定义 //CMFCToolBar::EnableQuickCustomization(); //if (CMFCToolBar::GetUserImages() == NULL) //{ // // 加载用户定义的工具栏图像 // if (m_UserImages.Load(_T(".\\UserImages.bmp"))) // { // CMFCToolBar::SetUserImages(&m_UserImages); // } //} //// 启用菜单个性化(最近使用的命令) //// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。 //CList<UINT, UINT> lstBasicCommands; //lstBasicCommands.AddTail(ID_FILE_NEW); //lstBasicCommands.AddTail(ID_FILE_OPEN); //lstBasicCommands.AddTail(ID_FILE_SAVE); //lstBasicCommands.AddTail(ID_FILE_PRINT); //lstBasicCommands.AddTail(ID_APP_EXIT); //lstBasicCommands.AddTail(ID_EDIT_CUT); //lstBasicCommands.AddTail(ID_EDIT_PASTE); //lstBasicCommands.AddTail(ID_EDIT_UNDO); //lstBasicCommands.AddTail(ID_APP_ABOUT); //lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR); //lstBasicCommands.AddTail(ID_VIEW_TOOLBAR); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA); //lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7); //lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC); //lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE); //lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS); //lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); //CMFCToolBar::SetBasicCommands(lstBasicCommands); return 0;} RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏放 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)中, 因为 CreateExToolBar() 后还有 bar for(int i=0;i< ARRAY_MAX;i++) //设置每个按钮属性 { button[i].dwData=0; button[i].fsStyle=TBBS_BUTTON; button[i].iBitmap=i; button[i].idCommand =Resource[i]; //array[i] = Resource[i]; } TBBUTTON Wrap; //创建一个分隔条 Wrap.dwData=0; Wrap.fsState=TBSTATE_ENABLED; Wrap.fsStyle=TBSTYLE_SEP; Wrap.iBitmap = 2;//宽度 Wrap.idCommand =0; m_wndToolBar.GetToolBarCtrl().AddButtons(3/*ARRAY_MAX*/,button);// m_wndToolBar.GetToolBarCtrl().InsertButton(4,&Wrap); m_wndToolBar.GetToolBarCtrl().AutoSize(); //m_wndToolBar.GetToolBarCtrl().GetButton(5,&button[4]); button->iBitmap = 1; m_wndToolBar.SetSizes(CSize(40,37),CSize(31,31)); //设置按钮和按钮位图大小//函数第一个是按钮大小,第二个是图像大小,按钮必须比图像要大,具体是按钮的要 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏 打赌输了 兔子党负责人接分 普通的窗口和对话框有什么区别? 问两个问题?如能解答,不胜感激 如何将16进制的字符串转化为整形? 怎样不重起Windows直接更改IP地址(win98)? ado连接,时好,时坏 传递结构指针的问题 如何修改屏幕分辨率? 怎样直接读硬盘扇区? 类为什么不能实例化?? 如何对控件发送消息 MATLAB GUI点击按钮去显示VC6.0的MFC程序。怎么做啊
我是基本将原来的代码都注释掉了,自己制作工具栏的代码在CreateExToolBar里,可是奇怪的是我将原来代码里的制作菜单栏的代码注释掉是图1,不注释,也就是沿用它原来的菜单栏代码,却是图2,明显工具栏挡住了菜单栏
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1; //创建扩展工具栏
if (!this->CreateExToolBar())
return -1;
//BOOL bNameValid;
//// 基于持久值设置视觉管理器和样式
//OnApplicationLook(theApp.m_nAppLook); if (!m_wndMenuBar.Create(this))
{
TRACE0("未能创建菜单栏\n");
return -1; // 未能创建
} m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); //// 防止菜单栏在激活时获得焦点
//CMFCPopupMenu::SetForceMenuFocus(FALSE); //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
// !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
//{
// TRACE0("未能创建工具栏\n");
// return -1; // 未能创建
//} //CString strToolBarName;
//bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
//ASSERT(bNameValid);
//m_wndToolBar.SetWindowText(strToolBarName); //CString strCustomize;
//bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
//ASSERT(bNameValid);
//m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); //// 允许用户定义的工具栏操作:
//InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId); if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); //// TODO: 如果您不希望工具栏和菜单栏可停靠,请删除这五行
//m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//EnableDocking(CBRS_ALIGN_ANY);
//DockPane(&m_wndMenuBar);
//DockPane(&m_wndToolBar);
//// 启用 Visual Studio 2005 样式停靠窗口行为
//CDockingManager::SetDockingMode(DT_SMART);
//// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
//EnableAutoHidePanes(CBRS_ALIGN_ANY); //// 加载菜单项图像(不在任何标准工具栏上):
//CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0); //// 创建停靠窗口
//if (!CreateDockingWindows())
//{
// TRACE0("未能创建停靠窗口\n");
// return -1;
//} //m_wndFileView.EnableDocking(CBRS_ALIGN_ANY);
//m_wndClassView.EnableDocking(CBRS_ALIGN_ANY);
//DockPane(&m_wndFileView);
//CDockablePane* pTabbedBar = NULL;
//m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar);
//m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
//DockPane(&m_wndOutput);
//m_wndProperties.EnableDocking(CBRS_ALIGN_ANY);
//DockPane(&m_wndProperties);
//// 启用工具栏和停靠窗口菜单替换
//EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); //// 启用快速(按住 Alt 拖动)工具栏自定义
//CMFCToolBar::EnableQuickCustomization(); //if (CMFCToolBar::GetUserImages() == NULL)
//{
// // 加载用户定义的工具栏图像
// if (m_UserImages.Load(_T(".\\UserImages.bmp")))
// {
// CMFCToolBar::SetUserImages(&m_UserImages);
// }
//} //// 启用菜单个性化(最近使用的命令)
//// TODO: 定义您自己的基本命令,确保每个下拉菜单至少有一个基本命令。
//CList<UINT, UINT> lstBasicCommands; //lstBasicCommands.AddTail(ID_FILE_NEW);
//lstBasicCommands.AddTail(ID_FILE_OPEN);
//lstBasicCommands.AddTail(ID_FILE_SAVE);
//lstBasicCommands.AddTail(ID_FILE_PRINT);
//lstBasicCommands.AddTail(ID_APP_EXIT);
//lstBasicCommands.AddTail(ID_EDIT_CUT);
//lstBasicCommands.AddTail(ID_EDIT_PASTE);
//lstBasicCommands.AddTail(ID_EDIT_UNDO);
//lstBasicCommands.AddTail(ID_APP_ABOUT);
//lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR);
//lstBasicCommands.AddTail(ID_VIEW_TOOLBAR);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2003);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_VS_2005);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLUE);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_SILVER);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_BLACK);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_OFF_2007_AQUA);
//lstBasicCommands.AddTail(ID_VIEW_APPLOOK_WINDOWS_7);
//lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC);
//lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE);
//lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS);
//lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); //CMFCToolBar::SetBasicCommands(lstBasicCommands); return 0;
}
放
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
中, 因为
CreateExToolBar() 后还有 bar
{
button[i].dwData=0;
button[i].fsStyle=TBBS_BUTTON;
button[i].iBitmap=i;
button[i].idCommand =Resource[i]; //array[i] = Resource[i];
}
TBBUTTON Wrap; //创建一个分隔条
Wrap.dwData=0;
Wrap.fsState=TBSTATE_ENABLED;
Wrap.fsStyle=TBSTYLE_SEP;
Wrap.iBitmap = 2;//宽度
Wrap.idCommand =0;
m_wndToolBar.GetToolBarCtrl().AddButtons(3/*ARRAY_MAX*/,button);
// m_wndToolBar.GetToolBarCtrl().InsertButton(4,&Wrap);
m_wndToolBar.GetToolBarCtrl().AutoSize(); //m_wndToolBar.GetToolBarCtrl().GetButton(5,&button[4]);
button->iBitmap = 1; m_wndToolBar.SetSizes(CSize(40,37),CSize(31,31)); //设置按钮和按钮位图大小//函数第一个是按钮大小,第二个是图像大小,按钮必须比图像要大,具体是按钮的要 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示工具栏