Установите 24x24 и 32-битные изображения для динамически создаваемых CMFCToolBarButtons
Чтобы добавить панель инструментов в свой класс MFC, я перепробовал все способы добавления resources>toolbars
но они не работали. Наконец я подошел к моменту, чтобы динамически создать панель инструментов. Это код, который я использовал:
resource.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 не отображается
возникли проблемы с функцией LoadToolBarEx класса CMFCToolBar и установленным идентификатором для класса COpenGLControl
Но проблема еще не полностью решена?
** Пожалуйста, представьте мне хороший справочник, который научил добавлять панели инструментов к диалогам 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));
1 ответ
Во-первых, согласно источникам МФЦ, LoadBitmap()
[НЕ LoadBitmapW()
, это, кажется, происходит из-за того, что VS Intellisense выбирает #define из WinUser.h] добавляет растровое изображение в список изображений, вызывая 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));