Как мне изменить ИЗОБРАЖЕНИЕ (независимо от типа) кнопки на панели инструментов в приложениях MFC?
Я знаю, что это глупая проблема, но я застрял в ней последние 4 дня. Почему так сложно просто изменить панель инструментов в приложениях MFC?
Я создаю новое приложение Visual Studio MFC , основанное на диалоге . Создаю новый ресурс Панели инструментов . И как мне затем установить изображения (png, растровые изображения, jpeg ...) или любой другой тип, который будет использоваться на моей панели инструментов?
Я установил размер w50 и h50 и могу рисовать внутри кнопок. Но я не могу найти способ использовать изображение.
Вместо этих двух кнопок, которые я только что попробовал, если они работают, я хочу использовать 8 изображений в растровом формате и в png. Я где-то читал, что PNG не поддерживается приложениями MFC, поэтому я преобразовал его в Bitmap.
Я загружаю свою панель инструментов в диалоговое приложение следующим образом в OnInitDialog()методе:
DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;
CMFCToolBar::m_dblLargeImageRatio = 1;
if (m_ToolBar.CreateEx(this, dwCtrlStyle, dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR1))
{
dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);
CMFCToolBarInfo info;
m_ToolBar.LoadToolBarEx(IDR_TOOLBAR1, info, FALSE);
CSize sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy, SWP_NOACTIVATE |
SWP_NOZORDER);
CPoint ptOffset(0, sizeToolBar.cy);
}
Пожалуйста, если кто-то может мне помочь, я был бы очень благодарен. Формат изображения не имеет значения. Я просто хочу поместить изображение на панель инструментов.
Сейчас это мое приложение:
ОБНОВЛЕНИЕ: я пробовал этот способ. ID_BUTTON_1если первая кнопка на панели инструментов, и я попытался изменить ее изображение. Но при этом на панели инструментов на месте первой кнопки нет кнопки. Что я делаю неправильно?
VERIFY(m_toolbar.LoadBitmap(IDB_BITMAP1));
CMFCToolBarButton mbutton;
mbutton.SetImage(m_toolbar.GetImages()->GetCount() - 1);
m_toolbar.ReplaceButton(ID_BUTTON_1, CMFCToolBarButton(ID_BUTTON_1, 0));
Ответы
Я ответил на это недавно и больше не могу найти свой ответ. Вы можете использовать изображения PNG для панелей инструментов. Под капотом вы по-прежнему используете версию BMP для редактора ресурсов для создания обработчиков событий и т. Д. Но затем вы можете добавить свой PNG в качестве ресурса и затем загрузить его в свой диалог.
Например, я вызываю это в своей OnInitDialogфункции:
void CMeetingScheduleAssistantDlg::CreateToolbar()
{
DWORD dwCtrlStyle = TBSTYLE_FLAT | TBSTYLE_TOOLTIPS | CBRS_SIZE_DYNAMIC;
DWORD dwStyle = AFX_DEFAULT_TOOLBAR_STYLE;
CMFCToolBar::m_dblLargeImageRatio = 1; // AJT v20.1.7 Bug fix
if (m_ToolBar.CreateEx(this, dwCtrlStyle,
dwStyle, CRect(1, 1, 1, 1), IDR_TOOLBAR))
{
dwStyle = CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC;
m_ToolBar.SetPaneStyle(m_ToolBar.GetPaneStyle() | dwStyle);
CMFCToolBarInfo info;
info.m_uiColdResID = IDB_PNG_MAIN_TOOLBAR;
info.m_uiHotResID = IDB_PNG_MAIN_TOOLBAR;
info.m_uiLargeColdResID = IDB_PNG_MAIN_TOOLBAR;
info.m_uiLargeHotResID = IDB_PNG_MAIN_TOOLBAR;
m_ToolBar.LoadToolBarEx(IDR_TOOLBAR, info, FALSE);
CSize sizeToolBar = m_ToolBar.CalcFixedLayout(TRUE, TRUE);
m_ToolBar.SetWindowPos(NULL, 0, 0, sizeToolBar.cx, sizeToolBar.cy,
SWP_NOACTIVATE | SWP_NOZORDER);
// Move all controls down
CPoint ptOffset(0, sizeToolBar.cy);
CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);
while (pwndChild)
{
if (pwndChild->GetSafeHwnd() != m_ToolBar.GetSafeHwnd())
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
}
pwndChild = pwndChild->GetNextWindow();
}
// Resize the window
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.bottom += sizeToolBar.cy;
MoveWindow(rcWindow, FALSE);
}
}
Я не знаю, куда ушел мой предыдущий ответ, иначе я бы отметил это как дубликат. #смущенный.