Пользовательский рисунок иконок в диалоге настройки CToolbar

Я пытаюсь настроить CToolbar учебный класс(Библиотека MFC) для моих нужд (включение поддержки 32-битных иконок с сглаживанием).
Для этого я использую пользовательский метод рисования предоставлено CToolbar, где я рисую свои собственные иконки.
Иконки отображаются хорошо и все ок, пока пользователь не откроет диалог настроек — где он может выбрать нужные значки и расположить их так, как ему нравится (это стандартный диалог настройки для панели инструментов MFC).

Проблема: в диалоге настройки одинаковое изображение нарисовано для всех кнопок.

Вот фрагменты кода из моего проекта:

void CCustomToolBar::OnCustomDraw (NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTBCUSTOMDRAW lpNMCustomDraw = (LPNMTBCUSTOMDRAW)pNMHDR;

switch (lpNMCustomDraw->nmcd.dwDrawStage)
{
// the Painting loop starts
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW; // register for items drawing events
//if (m_bAdjusting)SetWindowLong (lpNMCustomDraw->nmcd.hdr.hwndFrom, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW);
}
break;
// Item (button) is going to be painted, do own drawing
case CDDS_ITEMPREPAINT:
{
CDC DrawDC;
DrawDC.Attach(lpNMCustomDraw->nmcd.hdc);

CToolBarCtrl& ControlBar = GetToolBarCtrl();

CRect btnRect = lpNMCustomDraw->nmcd.rc;
int State = lpNMCustomDraw->nmcd.uItemState; // CDIS_GRAYED | CDIS_CHECKED | CDIS_DEFAULT | CDIS_DISABLED | CDIS_FOCUS | CDIS_GRAYED | CDIS_HOT | CDIS_SELECTED

hugeSizedImages_.SetTransparentColor(afxGlobalData.clrBtnFace);

DrawDC.DrawFrameControl(&btnRect, DFC_BUTTON , DFCS_BUTTONPUSH );

DWORD dwItem = (DWORD)lpNMCustomDraw->nmcd.dwItemSpec;
int btnIndex = 0;
GUARD_IF(m_BitmapIndex.find(dwItem) != m_BitmapIndex.end())
{
btnIndex = m_BitmapIndex[dwItem];
}

CAfxDrawState ds;
hugeSizedImages_.PrepareDrawImage(ds, CSize(48,48));
hugeSizedImages_.Draw(&DrawDC, btnRect.left, btnRect.top, btnIndex);
hugeSizedImages_.EndDrawImage(ds);
DrawDC.Detach();

*pResult = CDRF_SKIPDEFAULT;  // No further drawing
//if (m_bAdjusting) SetWindowLong (lpNMCustomDraw->nmcd.hdr.hwndFrom, DWL_MSGRESULT, CDRF_SKIPDEFAULT);
}
break;
default:
*pResult = 0;
}

Карта сообщений:

 BEGIN_MESSAGE_MAP ( CCustomToolBar, CToolBarWithHideableButtons )
//{{AFX_MSG_MAP ( CCustomToolBar )
ON_WM_CONTEXTMENU ()
ON_COMMAND        ( CM_TOOLBAR_CUSTOMIZE, OnPopupCustomize )
ON_NOTIFY_REFLECT ( TBN_QUERYDELETE,      OnQueryDelete )
ON_NOTIFY_REFLECT ( TBN_QUERYINSERT,      OnQueryInsert )
ON_NOTIFY_REFLECT ( TBN_GETBUTTONINFO,    OnGetButtonInfo )
ON_NOTIFY_REFLECT ( TBN_BEGINADJUST,      OnBeginAdjust )
ON_NOTIFY_REFLECT ( TBN_ENDADJUST,        OnEndAdjust )
ON_NOTIFY_REFLECT ( TBN_RESET,            OnReset )
ON_NOTIFY_REFLECT ( TBN_TOOLBARCHANGE,    OnToolBarChange )
ON_NOTIFY_REFLECT ( TBN_INITCUSTOMIZE,    OnInitCustomize ) //only with IE 5.0 and
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW,        OnCustomDraw)
ON_WM_CREATE ()
//}}AFX_MSG_MAP
END_MESSAGE_MAP ()

Я сделал много отладки, и мне удалось получить это при появлении окна настройки — информация, отправляемая в CustomDraw относительно элемента (кнопки), который нужно нарисовать, пропускается, всегда отправляется нулевой индекс.

Если я закомментирую * pResult = CDRF_SKIPDEFAULT; когда система может рисовать значки в диалоге настройки в соответствии с их индексами (но только с 4-битной глубиной) — следовательно, я думаю, что я упустил что-то важное в пользовательском рисовании.

Я прочитал все возможные статьи в MSDN и других источниках, относящихся к пользовательской прорисовке, но там не упоминается проблема значков в окне настройки.

Так что, если кто-нибудь сталкивался с подобной проблемой, не могли бы вы дать мне подсказку?
заранее спасибо!

0

Решение

Используйте новый CMFCToolBar … он намного проще и предоставляет легко перезаписываемый метод DrawItem.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector