+ RECT rc;
+ HDC hdc;
+ HBRUSH bgBrush;
+ HBRUSH hotBrush;
+
+ *theResult = 0;
+ switch (uMsg)
+ {
+ case WM_COMMAND:
+
+ if (m_staticToolbar && m_staticToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_staticToolbar->OnCommand(wParam, lParam, theResult);
+ }
+
+ if (m_SFToolbar && m_SFToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_SFToolbar->OnCommand(wParam, lParam, theResult);
+ }
+
+ return S_OK;
+
+ case WM_NOTIFY:
+ NMHDR * hdr = reinterpret_cast<LPNMHDR>(lParam);
+ NMTBCUSTOMDRAW * cdraw;
+ NMTBHOTITEM * hot;
+ NMMOUSE * rclick;
+ NMPGCALCSIZE* csize;
+ TBBUTTONINFO btni;
+ switch (hdr->code)
+ {
+ case PGN_CALCSIZE:
+ csize = reinterpret_cast<LPNMPGCALCSIZE>(hdr);
+
+ if (m_staticToolbar && m_staticToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ SIZE tbs;
+ m_staticToolbar->GetIdealSize(tbs);
+ if (csize->dwFlag == PGF_CALCHEIGHT)
+ {
+ csize->iHeight = tbs.cy;
+ }
+ else if (csize->dwFlag == PGF_CALCWIDTH)
+ {
+ csize->iHeight = tbs.cx;
+ }
+ }
+
+ if (m_SFToolbar && m_SFToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ SIZE tbs;
+ m_SFToolbar->GetIdealSize(tbs);
+ if (csize->dwFlag == PGF_CALCHEIGHT)
+ {
+ csize->iHeight = tbs.cy;
+ }
+ else if (csize->dwFlag == PGF_CALCWIDTH)
+ {
+ csize->iHeight = tbs.cx;
+ }
+ }
+ return S_OK;
+
+ case TBN_DROPDOWN:
+
+ if (m_staticToolbar && m_staticToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ WPARAM wp = reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem;
+ return m_staticToolbar->OnCommand(wp, 0, theResult);
+ }
+
+ if (m_SFToolbar && m_SFToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ WPARAM wp = reinterpret_cast<LPNMTOOLBAR>(hdr)->iItem;
+ return m_SFToolbar->OnCommand(wp, 0, theResult);
+ }
+
+ return S_OK;
+
+ case TBN_HOTITEMCHANGE:
+ hot = reinterpret_cast<LPNMTBHOTITEM>(hdr);
+
+ if (m_staticToolbar && m_staticToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_staticToolbar->OnHotItemChange(hot);
+ }
+
+ if (m_SFToolbar && m_SFToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_SFToolbar->OnHotItemChange(hot);
+ }
+
+ return S_OK;
+
+ case NM_RCLICK:
+ rclick = reinterpret_cast<LPNMMOUSE>(hdr);
+
+ if (m_staticToolbar && m_staticToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_staticToolbar->OnContextMenu(rclick);
+ }
+
+ if (m_SFToolbar && m_SFToolbar->IsWindowOwner(hWnd) == S_OK)
+ {
+ return m_SFToolbar->OnContextMenu(rclick);
+ }
+
+ return S_OK;
+
+ case NM_CUSTOMDRAW:
+ cdraw = reinterpret_cast<LPNMTBCUSTOMDRAW>(hdr);
+ switch (cdraw->nmcd.dwDrawStage)
+ {
+ case CDDS_PREPAINT:
+ *theResult = CDRF_NOTIFYITEMDRAW;
+ return S_OK;
+
+ case CDDS_ITEMPREPAINT:
+
+ cdraw->clrBtnFace = GetSysColor(COLOR_MENU);
+ cdraw->clrBtnHighlight = GetSysColor(COLOR_MENUHILIGHT);
+
+ cdraw->clrText = GetSysColor(COLOR_MENUTEXT);
+ cdraw->clrTextHighlight = GetSysColor(COLOR_HIGHLIGHTTEXT);
+ cdraw->clrHighlightHotTrack = GetSysColor(COLOR_HIGHLIGHTTEXT);
+
+ bgBrush = GetSysColorBrush(COLOR_MENU);
+ hotBrush = GetSysColorBrush(COLOR_MENUHILIGHT);
+
+ rc = cdraw->nmcd.rc;
+ hdc = cdraw->nmcd.hdc;
+
+ if (cdraw->nmcd.uItemState != CDIS_DISABLED &&
+ ((INT)cdraw->nmcd.dwItemSpec == m_hotItem ||
+ (m_hotItem < 0 && (INT)cdraw->nmcd.dwItemSpec == m_popupItem)))
+ {
+ cdraw->nmcd.uItemState = CDIS_HOT;
+ }
+
+ switch (cdraw->nmcd.uItemState)
+ {
+ case CDIS_HOT:
+ case CDIS_FOCUS:
+ FillRect(hdc, &rc, hotBrush);
+ break;
+ default:
+ FillRect(hdc, &rc, bgBrush);
+ break;
+ }
+
+ *theResult = CDRF_NOTIFYPOSTPAINT | TBCDRF_NOBACKGROUND | TBCDRF_NOEDGES | TBCDRF_NOOFFSET | TBCDRF_NOMARK | 0x00800000; // FIXME: the last bit is Vista+, for debugging only
+ return S_OK;
+
+ case CDDS_ITEMPOSTPAINT:
+ btni.cbSize = sizeof(btni);
+ btni.dwMask = TBIF_STYLE;
+ SendMessage(hWnd, TB_GETBUTTONINFO, cdraw->nmcd.dwItemSpec, reinterpret_cast<LPARAM>(&btni));
+ if (btni.fsStyle & BTNS_DROPDOWN)
+ {
+ SelectObject(cdraw->nmcd.hdc, m_marlett);
+ WCHAR text [] = L"8";
+ SetBkMode(cdraw->nmcd.hdc, TRANSPARENT);
+ DrawTextEx(cdraw->nmcd.hdc, text, 1, &cdraw->nmcd.rc, DT_NOCLIP | DT_VCENTER | DT_RIGHT | DT_SINGLELINE, NULL);
+ }
+ *theResult = TRUE;
+ return S_OK;
+ }
+ return S_OK;
+ }
+ return S_OK;
+ }
+
+ return S_FALSE;