Установите 24x24 и 32-битные изображения для динамически создаваемых CMFCToolBarButtons

Чтобы добавить панель инструментов в мой диалоговый класс 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), я не знал, что добавление панели инструментов в ди приложение на основе alog - такая сложная задача!!!! **
** Итак, я создал диалоговый проект в начале, и теперь, когда моя программа была разработана, мне нужна панель инструментов

пожалуйста, помогите мне. это четвертый вопрос, который я опубликовал о добавлении панели инструментов в диалоговое приложение MFC.
после написания кода для добавления панели инструментов в диалоговое окно MFC не запускается< br> Моя панель инструментов в диалоговом приложении 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));

person Sepideh Abadpour    schedule 06.08.2013    source источник


Ответы (1)


Во-первых, согласно источникам MFC, 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));
person Edward Clements    schedule 07.08.2013
comment
спасибо @Edward Clements, но когда я пишу m_FirstToolBar., есть только LoadBitmapW и LoadBitmapEx, и поскольку LoadBitmapEx не знает первый аргумент, я использовал LoadBitmapW - person Sepideh Abadpour; 07.08.2013
comment
спасибо @Edward Clements, но нет, вы не видели мой проект комментарий выделите части, которые используют классы и зависимости FileWORKflow и COpenGLControl для библиотеки GDAL и OpenGL, и они хорошо работают в вашей системе, я думаю, вы также видели другой мой вопрос файл, который я приложил к нему, - это тот, который я нашел в Интернете, и его можно запустить на любом компьютере. - person Sepideh Abadpour; 07.08.2013
comment
извините, на конкретные вопросы отвечаю как могу, чужие проекты не загружаю -- проблема в этом вопросе решена? - person Edward Clements; 07.08.2013
comment
нет, не решено, но согласно вашему ответу на мой другой вопрос Я постараюсь решить эту проблему. Спасибо за внимание - person Sepideh Abadpour; 07.08.2013
comment
@EdwardClements Сэр, не могли бы вы взглянуть на это вопрос, если у вас есть время? Это похоже на это, но я несколько дней застрял на изображении кнопок панели инструментов в MFC. Заранее спасибо... - person user123445151156; 29.11.2020
comment
что такое IDC_NEWTBRBTN и другие идентификаторы, потому что в моем случае ИНСТРУМЕНТАЛЬНАЯ ПАНЕЛЬ пуста, у меня нет кнопок, и я пытаюсь создать их динамически и установить для них растровое изображение, как в этом примере - person user123445151156; 29.11.2020
comment
Должен ли я создать новую панель инструментов с номером кнопок X, а затем установить ее растровые изображения, как описано здесь, с помощью кнопки вставки? - person user123445151156; 29.11.2020