0

为了向我的 MFC 对话框类中添加工具栏,我尝试了所有添加方法,resources>toolbars但它们都不起作用。最后,我提出了动态创建工具栏的目的。这是我使用的代码:

资源.h

#define IDB_PanTbrBtn                   139
#define IDB_NewTbrBtn                   140
#define IDB_ZoomInTbrBtn                141
#define IDB_ZoomOutTbrBtn               142
#define IDC_FirstToolBar                1011
#define IDC_NEWTBRBTN                   1012
#define IDC_ZOOMINTBRBTN                1013
#define IDC_ZOOMOUTTBRBTN               1014
#define IDC_PANTBRBTN                   1015

InitialJobProject2Dlg.h:对话框项目的头文件

#pragma once
#include "WndResizer.h"
#include "afxdlgs.h"
#include "FilesWorkFlow.h"
#include "OpenGLControl.h"  
CWndResizer m_resizer;
CMFCToolBar m_FirstToolBar;
FilesWorkFlow *m_files;
COpenGLControl *m_oglWindow;  

InitialJobProject2Dlg.cpp : 函数中工具栏相关的代码OnInitDialog()

    bool bAnchored = false;
    bAnchored = m_resizer.Hook(this);
    assert(bAnchored);

bool ToolbarCreated = m_FirstToolBar.CreateEx(this, AFX_DEFAULT_TOOLBAR_STYLE, 100 );

if(ToolbarCreated)
{
    m_FirstToolBar.SetDlgCtrlID(IDC_FirstToolBar);
    bAnchored = m_resizer.SetAnchor(IDC_FirstToolBar,ANCHOR_LEFT | ANCHOR_TOP);
    assert(bAnchored);

    m_FirstToolBar.SetPaneStyle(m_FirstToolBar.GetPaneStyle() & ~(CBRS_GRIPPER|CBRS_SIZE_DYNAMIC|CBRS_BORDER_ANY));

    VERIFY(m_FirstToolBar.LoadBitmapW(IDB_NewTbrBtn));
    VERIFY(m_FirstToolBar.GetImages()->Load(IDB_NewTbrBtn,nullptr,TRUE));
    int imageIndex = m_FirstToolBar.GetImages()->GetCount();
    m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_NEWTBRBTN,imageIndex));

    VERIFY(m_FirstToolBar.LoadBitmapW(IDB_PanTbrBtn));
    VERIFY(m_FirstToolBar.GetImages()->Load(IDB_PanTbrBtn,nullptr,TRUE));
    imageIndex = m_FirstToolBar.GetImages()->GetCount();
    m_FirstToolBar.InsertButton( CMFCToolBarButton( IDC_PANTBRBTN,imageIndex));

    VERIFY(m_FirstToolBar.LoadBitmapW(IDB_ZoomInTbrBtn));
    VERIFY(m_FirstToolBar.GetImages()->Load(IDB_ZoomInTbrBtn,nullptr,TRUE));
    imageIndex = m_FirstToolBar.GetImages()->GetCount();
    m_FirstToolBar.InsertButton( CMFCToolBarButton( IDC_ZOOMINTBRBTN,imageIndex));

    VERIFY(m_FirstToolBar.LoadBitmapW(IDB_ZoomOutTbrBtn));
    VERIFY(m_FirstToolBar.GetImages()->Load(IDB_ZoomOutTbrBtn,nullptr,TRUE));
    imageIndex = m_FirstToolBar.GetImages()->GetCount();
    m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_ZOOMOUTTBRBTN,imageIndex));

    CSize size = m_FirstToolBar.CalcFixedLayout( FALSE, TRUE );
    m_FirstToolBar.SetWindowPos( NULL, 0, 0, size.cx + 10, size.cy + 10 , SWP_NOACTIVATE | SWP_NOZORDER );
}

这是我项目的资源视图:
在此处输入图像描述
这是我程序的 res 文件夹:
在此处输入图像描述
我想显示为工具栏按钮图标的图像是 48x48 ,32 位深度位图图像,但我对 24x24 的图像也有同样
的问题当我运行程序时:
在此处输入图像描述
很明显,只有一个按钮作为工具栏按钮,但我已经动态插入了四个按钮,正如您在代码中看到的那样。
即使对于这个已知的按钮,图像也不会显示。
我的代码没有任何编译器或运行时错误,所以我不明白发生了什么以及有什么问题?
由于我是 MFC 新手(这是我的第一个 MFC 程序),我不知道将工具栏添加到基于对话框的应用程序是一项艰巨的任务!!!!**
**所以我在开始时创建了一个基于对话框的项目,现在我的程序已经开发,我确实需要一个工具栏,

请帮助我。这是我发布的关于在基于对话框的 MFC 应用程序上添加工具栏的第四个问题。
编写代码以将工具栏添加到基于对话框的 mfc 后,对话框未运行
我在基于对话框的 mfc 应用程序上的工具栏未显示
CMFCToolBar 类的 LoadToolBarEx 函数存在问题,并为 COpenGLControl 类设置 ID
但问题还没有彻底解决?
**请向我介绍一个很好的参考资料,它教我从头开始逐步向 MFC 对话框添加工具栏,并且对你自己很有用

哦,如果我的项目需要,那就是可在此处下载


正如@Edward Clements 建议的那样,我将代码更改为此,但没有任何改变。

    VERIFY(m_FirstToolBar.LoadBitmap(IDB_NewTbrBtn));
    m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_NEWTBRBTN,1));

    VERIFY(m_FirstToolBar.LoadBitmap(IDB_PanTbrBtn));
    m_FirstToolBar.InsertButton( CMFCToolBarButton( IDC_PANTBRBTN,2));

    VERIFY(m_FirstToolBar.LoadBitmap(IDB_ZoomInTbrBtn));
    m_FirstToolBar.InsertButton( CMFCToolBarButton( IDC_ZOOMINTBRBTN,3));

    VERIFY(m_FirstToolBar.LoadBitmap(IDB_ZoomOutTbrBtn));
    m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_ZOOMOUTTBRBTN,4));
4

1 回答 1

1

首先,根据 MFC 来源,LoadBitmap()[NOT LoadBitmapW(),这似乎是因为 VS Intellisense 从 WinUser.h 中获取了一个#define] 将位图添加到图像列表中,因此调用m_FirstToolBar.GetImages()->Load()将加载图像两次。

其次,InsertButton()应该指定按钮图像的索引,m_FirstToolBar.GetImages()->GetCount()总会指向一个无效的索引值。

VERIFY(m_FirstToolBar.LoadBitmap(IDB_NewTbrBtn));
VERIFY(m_FirstToolBar.LoadBitmap(IDB_PanTbrBtn));
VERIFY(m_FirstToolBar.LoadBitmap(IDB_ZoomInTbrBtn));
VERIFY(m_FirstToolBar.LoadBitmap(IDB_ZoomOutTbrBtn));

m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_NEWTBRBTN, 0));
m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_PANTBRBTN, 1));
m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_ZOOMINTBRBTN, 2));
m_FirstToolBar.InsertButton(CMFCToolBarButton(IDC_ZOOMOUTTBRBTN, 3));
于 2013-08-07T09:17:40.743 回答