Jak zmienić OBRAZ (nie ma znaczenia typ) przycisku na pasku narzędzi w aplikacjach MFC?
Wiem, że to głupi problem, ale utknąłem z tym przez ostatnie 4 dni. Dlaczego modyfikacja paska narzędzi w aplikacjach MFC jest tak skomplikowana?
Tworzę nową Visual Studio aplikacji MFC , który jest oparty dialogowe . Tworzę nowy zasób paska narzędzi . A potem, jak ustawić obrazy (png, bitmapa, jpeg ...) lub jakikolwiek inny typ, który ma być używany na pasku narzędzi?
Ustawiłem rozmiar na w50 i h50 i mogę rysować wewnątrz przycisków. Ale nie mogę znaleźć sposobu na użycie obrazu.
Zamiast tego 2 przyciski, które właśnie wypróbowałem, jeśli działają, chcę użyć 8 obrazów w formacie bitmapy i png. Czytałem gdzieś, że PNG nie jest obsługiwany przez aplikacje MFC, więc przekonwertowałem na Bitmapę.

Ładuję mój pasek narzędzi w aplikacji dialogowej, tak jak w OnInitDialog()
metodzie:
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);
}
Byłbym bardzo wdzięczny, gdyby ktoś mógł mi pomóc. Format obrazu nie ma znaczenia. Chcę tylko umieścić obraz na pasku narzędzi.
To jest obecnie moja aplikacja:

UPDATE: próbowałem w ten sposób. ID_BUTTON_1
jeśli pierwszy przycisk na pasku narzędzi i próbowałem zmienić jego obraz. Ale dzięki temu nie ma przycisku na pasku narzędzi w miejscu pierwszego przycisku. Co robię źle?
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));
Odpowiedzi
Odpowiedziałem na to niedawno i nie mogę już znaleźć odpowiedzi. Możesz używać obrazów PNG jako pasków narzędzi. Pod maską nadal używasz wersji BMP dla edytora zasobów do tworzenia programów obsługi zdarzeń itp. Możesz jednak dodać plik PNG jako zasób, a następnie załadować go do swojego okna dialogowego.
Na przykład nazywam to w mojej OnInitDialog
funkcji:
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);
}
}
Nie wiem, dokąd poszła moja poprzednia odpowiedź, w przeciwnym razie oznaczyłbym to jako duplikat. #zmieszany.