私は自分のニーズに合わせて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 およびその他のソースで考えられるすべての記事を読みましたが、カスタマイズ ウィンドウのアイコンの問題については言及されていません。
誰かが同様の問題に直面している場合は、ヒントを教えてください。前もって感謝します!