void CXTPSkinObjectToolBar::DrawToolbarH(CDC* pDC) { CToolBarCtrl* pToolBar = (CToolBarCtrl*)this; int nCount = pToolBar->GetButtonCount(); for (int nIndex = 0; nIndex < nCount; nIndex++) { TBBUTTON tbb; if (!pToolBar->GetButton(nIndex, &tbb)) continue; if (tbb.fsState & TBSTATE_HIDDEN) continue; if (tbb.fsStyle & TBSTYLE_SEP) { CXTPSkinManagerClass* pClass = GetSkinClass(); CRect rc; pToolBar->GetItemRect(nIndex, &rc); pClass->DrawThemeBackground(pDC, TP_SEPARATOR, 0, &rc); } else { DrawButton(pDC, nIndex); } } }
void CXTPSkinObjectTab::FillClient(CDC* pDC, CRect rc) { FillBackground(pDC, rc); if (GetStyle() & TCS_BUTTONS) return; CXTPSkinManagerClass* pClass = GetSkinClass(); CRect rcClient(rc); CRect rcHeader = GetHeaderRect(); DWORD dwStyle = GetStyle(); if (IsRight(dwStyle)) { rcClient.right = rcHeader.left; } else if (IsLeft(dwStyle)) { rcClient.left = rcHeader.right; } else if (IsBottom(dwStyle)) { rcClient.bottom = rcHeader.top; } else { rcClient.top = rcHeader.bottom; } pClass->DrawThemeBackground(pDC, TABP_PANE, 0, &rcClient); }
void CXTPSkinObjectProgress::DoStep(int nStep) { CXTPClientRect rcClient(this); CXTPSkinManagerClass* pClassProgress = GetSkinClass(); DWORD dwStyle = GetStyle(); BOOL bVert = dwStyle & PBS_VERTICAL; CRect rcMargins = pClassProgress->GetThemeRect(bVert ? PP_BARVERT : PP_BAR, 0, TMT_SIZINGMARGINS); rcClient.DeflateRect(rcMargins); int dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, rcClient.Height() * 2 / 3); int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2); if (dxBlock == 1 && dxSpace == 0) dxBlock = 8; m_nMarqueePos += (dxBlock + dxSpace) * nStep; if (m_nMarqueePos > rcClient.right) m_nMarqueePos = rcClient.left + m_nMarqueePos - rcClient.right; Invalidate(FALSE); }
void CXTPSkinObjectTrackBar::DrawThumb(CDC* pDC) { DWORD dwStyle = m_drawRect.dwStyle; if (dwStyle & TBS_NOTHUMB) return; BOOL bVert = dwStyle & TBS_VERT; CXTPSkinManagerClass* pClass = GetSkinClass(); RECT rcThumb; ::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)&rcThumb); int nPartId = bVert ? TKP_THUMBVERT: TKP_THUMB; if (!(dwStyle & TBS_BOTH)) { if (!bVert) nPartId = dwStyle & TBS_TOP ? TKP_THUMBTOP : TKP_THUMBBOTTOM; else nPartId = dwStyle & TBS_TOP ? TKP_THUMBLEFT : TKP_THUMBRIGHT; } int nStateId = TUS_NORMAL; if (m_bHotThumb) nStateId = TUS_HOT; if (::GetCapture() == m_hWnd) nStateId = TUS_PRESSED; else if (::GetFocus() == m_hWnd && ((SendMessage(WM_QUERYUISTATE) & UISF_HIDEFOCUS) == 0)) nStateId = TUS_FOCUSED; if (!IsWindowEnabled()) nStateId = TUS_DISABLED; pClass->DrawThemeBackground(pDC, nPartId , nStateId, &rcThumb); }
// dir = direction multiplier (drawing up or down) // yTic = where (vertically) to draw the line of tics void CXTPSkinObjectTrackBar::DrawTicsOneLine(CDC* pDC, int dir, int yTic) { const RECT& rc = m_drawRect.rc; BOOL bVert = GetStyle() & TBS_VERT; CXTPSkinManagerClass* pClass = GetSkinClass(); COLORREF clrTick = pClass->GetThemeColor(bVert ? TKP_TICSVERT : TKP_TICS, 1, TMT_COLOR, GetColor(COLOR_BTNTEXT)); DrawTic(pDC, rc.left, yTic, dir, clrTick); DrawTic(pDC, rc.left, yTic + (dir * 1), dir, clrTick); DrawTic(pDC, rc.right-1, yTic, dir, clrTick); DrawTic(pDC, rc.right-1, yTic+ (dir * 1), dir, clrTick); PDWORD pTics = (PDWORD)SendMessage(TBM_GETPTICS); int iPos; int i; int nTics = pTics ? (int)LocalSize((HANDLE)pTics) / sizeof(DWORD) : 0; // those inbetween if (m_nTickFreq && pTics) { for (i = 0; i < nTics; ++i) { if (((i + 1) % m_nTickFreq) == 0) { iPos = LogToPhys(pTics[i]); DrawTic(pDC, iPos, yTic, dir, clrTick); } } } int lSelStart = (int)SendMessage(TBM_GETSELSTART); int lSelEnd = (int)SendMessage(TBM_GETSELEND); int lLogMin = (int)SendMessage(TBM_GETRANGEMIN); // draw the selection range (triangles) if ((GetStyle() & TBS_ENABLESELRANGE) && (lSelStart < lSelEnd) && (lSelEnd >= lLogMin)) { pDC->SetBkColor(clrTick); iPos = LogToPhys(lSelStart); for (i = 0; i < TICKHEIGHT; i++) PatRect(pDC,iPos-i,yTic+(dir==1 ? i : -TICKHEIGHT), 1,TICKHEIGHT-i, GetStyle() & TBS_VERT, GetColor(COLOR_BTNTEXT)); iPos = LogToPhys(lSelEnd); for (i = 0; i < TICKHEIGHT; i++) PatRect(pDC,iPos+i,yTic+(dir==1 ? i : -TICKHEIGHT), 1,TICKHEIGHT-i, GetStyle() & TBS_VERT, GetColor(COLOR_BTNTEXT)); } }
void CXTPSkinObjectFrame::CCaptionButton::Draw(CDC* pDC, BOOL bFrameActive) { BOOL bHot = IsHighlighted() && (IsPressed() || !m_pFrame->m_pButtonPressed); BOOL pRessed = bHot && IsPressed(); int nState = !m_bEnabled ? SBS_DISABLED : pRessed? SBS_PUSHED: bHot? SBS_HOT: SBS_NORMAL; if (!bFrameActive) nState += 4; CXTPSkinManagerClass* pClassWindow = m_pFrame->GetSkinManager()->GetSkinClass(m_pFrame, _T("WINDOW")); pClassWindow->DrawThemeBackground(pDC, m_nClassPart, nState, m_rcButton); }
HBRUSH CXTPSkinObjectFrame::GetClientBrush(HDC hDC, HWND hWnd, UINT nCtlColor) { if (m_dwDialogTexture != ETDT_ENABLETAB) { GrayCtlColor(hDC, hWnd, nCtlColor, GetMetrics()->m_brushDialog, GetColor(COLOR_BTNTEXT)); return GetMetrics()->m_brushDialog; } if (GetMetrics()->m_brushTabControl == NULL) { CWindowDC dcWindow(this); CXTPSkinManagerClass* pClass = GetSkinManager()->GetSkinClass(this, _T("TAB")); CString strImageFile = pClass->GetThemeString(TABP_BODY, 0, TMT_STOCKIMAGEFILE); if (strImageFile.IsEmpty()) { return GetMetrics()->m_brushDialog; } CXTPSkinImage* pImage = pClass->GetImages()->LoadFile(m_pManager->GetResourceFile(), strImageFile); if (!pImage) { return GetMetrics()->m_brushDialog; } CRect rc(0, 0, pImage->GetWidth(), pImage->GetHeight()); CBitmap bmp; bmp.CreateCompatibleBitmap(&dcWindow, rc.Width(), rc.Height()); CXTPCompatibleDC dc(&dcWindow, bmp); pImage->DrawImage(&dc, rc, rc, CRect(0, 0, 0, 0), COLORREF_NULL, ST_TRUESIZE, FALSE); GetMetrics()->m_brushTabControl = ::CreatePatternBrush(bmp); } if (hWnd != m_hWnd) { CXTPWindowRect rcPaint(hWnd); CXTPWindowRect rcBrush(m_hWnd); ::SetBrushOrgEx(hDC, rcBrush.left - rcPaint.left, rcBrush.top - rcPaint.top, NULL); ::SetBkMode(hDC, TRANSPARENT); ::SetTextColor(hDC, GetColor(COLOR_BTNTEXT)); } return GetMetrics()->m_brushTabControl; }
void CXTPSkinObjectFrame::DrawFrame(CDC* pDC) { if (m_bLockFrameDraw) return; CXTPWindowRect rc(this); rc.OffsetRect(-rc.TopLeft()); GetSchema()->DrawThemeFrame(pDC, this); if (m_spi[SB_VERT].fVisible || m_spi[SB_HORZ].fVisible) { if (m_spi[SB_VERT].fVisible) { if (!m_pSBTrack || !m_pSBTrack->bTrackThumb) SetupScrollInfo(&m_spi[SB_VERT]); CXTPBufferDCEx dcMem(*pDC, m_spi[SB_VERT].rc); DrawScrollBar(&dcMem, &m_spi[SB_VERT]); } if (m_spi[SB_HORZ].fVisible) { if (!m_pSBTrack || !m_pSBTrack->bTrackThumb) SetupScrollInfo(&m_spi[SB_HORZ]); CXTPBufferDCEx dcMem(*pDC, m_spi[SB_HORZ].rc); DrawScrollBar(&dcMem, &m_spi[SB_HORZ]); } if (m_spi[SB_HORZ].fVisible && m_spi[SB_VERT].fVisible) { CRect rcSizeGripper(m_spi[SB_HORZ].rc.right, m_spi[SB_VERT].rc.bottom, m_spi[SB_VERT].rc.right, m_spi[SB_HORZ].rc.bottom); if (GetExStyle() & WS_EX_LEFTSCROLLBAR) { rcSizeGripper.left = m_spi[SB_VERT].rc.left; rcSizeGripper.right = m_spi[SB_HORZ].rc.left; } pDC->FillSolidRect(rcSizeGripper, GetSchema()->GetScrollBarSizeBoxColor(this)); if (IsSizeBox()) { CXTPSkinManagerClass* pClassScrollBar = GetSkinManager()->GetSkinClass(this, _T("SCROLLBAR")); pClassScrollBar->DrawThemeBackground(pDC, SBP_SIZEBOX, SZB_RIGHTALIGN, rcSizeGripper); } } } }
void CXTPSkinObjectTrackBar::DrawChannel(CDC* pDC) { RECT rcChannel; ::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)&rcChannel); BOOL bVert = m_drawRect.dwStyle & TBS_VERT; if (bVert) { swap(rcChannel.left, rcChannel.top); swap(rcChannel.right, rcChannel.bottom); } CXTPSkinManagerClass* pClass = GetSkinClass(); pClass->DrawThemeBackground(pDC, bVert ? TKP_TRACKVERT: TKP_TRACK, 1, &rcChannel); }
void CXTPSkinManager::RedrawAllControls() { if (!m_bEnabled) return; if (!m_pSchema) return; POSITION pos = m_pSchema->m_mapClasses.GetStartPosition(); CString strClassName; CXTPSkinManagerClass* pClass; while (pos != NULL) { m_pSchema->m_mapClasses.GetNextAssoc( pos, strClassName, (void*&)pClass); pClass->GetImages()->RemoveAll(); } m_pSchema->GetMetrics()->RefreshMetrics(); XTPColorManager()->RefreshColors(); OnSkinChanged(TRUE, TRUE); }
void CXTPSkinObjectTab::FillTabFace(CDC* pDC, CRect rcItem, int iItem, int iCount, BOOL bSelected) { if (GetStyle() & TCS_BUTTONS) { CXTPSkinManagerClass* pClassButton = GetSkinManager()->GetSkinClass(this, _T("BUTTON")); int nState = bSelected? PBS_PRESSED: PBS_NORMAL; pClassButton->DrawThemeBackground(pDC, BP_PUSHBUTTON, nState, rcItem); return; } if (bSelected) { rcItem.InflateRect(2, 2, 2, 2); } CXTPSkinManagerClass* pClass = GetSkinClass(); int nStateId = bSelected ? TIS_SELECTED: m_nHotItem == iItem ? TIS_HOT : TIS_NORMAL; pClass->DrawThemeBackground(pDC, iItem == 0 ? TABP_TOPTABITEMLEFTEDGE : iItem == iCount - 1 && !bSelected ? TABP_TOPTABITEMRIGHTEDGE : TABP_TOPTABITEM, nStateId, &rcItem); }
void CXTPSkinObjectTab::DrawTabText(CDC* pDC, CRect& rcItem, int iItem, int iCount, BOOL bSelected) { CTabCtrl* pTabCtrl = (CTabCtrl*)this; CString strCaption; LPTSTR pszText = strCaption.GetBuffer(256); pszText[0] = 0; TC_ITEM tci; tci.mask = TCIF_TEXT; tci.pszText = pszText; tci.cchTextMax = 255; BOOL bResult = pTabCtrl->GetItem(iItem, &tci); strCaption.ReleaseBuffer(); #ifdef _UNICODE if (!bResult) { char tText[256]; tText[0] = 0; TC_ITEMA tcia; ::ZeroMemory(&tcia, sizeof(TC_ITEMA)); tcia.mask = TCIF_TEXT; // Get the header item text and format tcia.pszText = tText; tcia.cchTextMax = 255; ::SendMessage(pTabCtrl->m_hWnd, TCM_GETITEMA, iItem, (LPARAM)&tcia); strCaption = tText; } #else if (!bResult) return; #endif if (strCaption.GetLength() == 0) return; pDC->SetTextColor(GetColor(COLOR_BTNTEXT)); // Set the font for the tab label. DWORD dwStyle = GetStyle(); CXTPSkinManagerClass* pClass = GetSkinClass(); int nStateId = bSelected ? TIS_SELECTED: m_nHotItem == iItem ? TIS_HOT : TIS_NORMAL; int nPartId = iItem == 0 ? TABP_TOPTABITEMLEFTEDGE : iItem == iCount - 1 && !bSelected ? TABP_TOPTABITEMRIGHTEDGE : TABP_TOPTABITEM; // Draw the tab label. if (IsHorz(dwStyle)) { UINT dsFlags = DT_SINGLELINE | DT_VCENTER | DT_CENTER | DT_END_ELLIPSIS; if (SendMessage(WM_QUERYUISTATE) & UISF_HIDEACCEL) { dsFlags |= DT_HIDEPREFIX; } if (!(GetStyle() & TCS_BUTTONS)) { rcItem.top += bSelected ? -2 : 1; rcItem.right -= iItem == 0 ? 3 : 0; } else { rcItem.top += bSelected ? 0 : -1; } pClass->DrawThemeText(pDC, nPartId, nStateId, strCaption, dsFlags, &rcItem); } else { CSize sz = pDC->GetTextExtent(strCaption); rcItem.left = rcItem.right-(rcItem.Width()-sz.cy + 1)/ 2; rcItem.top = rcItem.top+(rcItem.Height()-sz.cx + 1)/ 2; pClass->DrawThemeText(pDC, nPartId, nStateId, strCaption, DT_SINGLELINE | DT_NOCLIP, &rcItem); } }
void CXTPSkinObjectHeader::DrawItemEntry(CDC* pDC, int nIndex, CRect rcItem, int nState) { CXTPSkinManagerClass* pClass = GetSkinClass(); CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)this; CImageList* pImageList = CImageList::FromHandle((HIMAGELIST) ::SendMessage(pHeaderCtrl->m_hWnd, HDM_GETIMAGELIST, 0, 0L)); // Set up the header item order array. HD_ITEM hdi; ::ZeroMemory(&hdi, sizeof(HD_ITEM)); hdi.fmt = HDF_STRING | HDF_IMAGE; hdi.mask = HDI_TEXT | HDI_FORMAT | HDI_IMAGE | HDI_LPARAM; // Get the header item text and format CString strCaption; LPTSTR pszText = strCaption.GetBuffer(256); pszText[0] = 0; hdi.pszText = pszText; hdi.cchTextMax = 255; BOOL bResult = pHeaderCtrl->GetItem(nIndex, &hdi); strCaption.ReleaseBuffer(); #ifdef _UNICODE if (!bResult) { char tText[256]; tText[0] = 0; HD_ITEMA hdia; ::ZeroMemory(&hdia, sizeof(HD_ITEMA)); hdia.fmt = HDF_STRING | HDF_IMAGE; hdia.mask = HDI_TEXT | HDI_FORMAT | HDI_IMAGE | HDI_LPARAM; // Get the header item text and format hdia.pszText = tText; hdia.cchTextMax = 255; ::SendMessage(pHeaderCtrl->m_hWnd, HDM_GETITEMA, nIndex, (LPARAM)&hdia); strCaption = tText; hdi.fmt = hdia.fmt; hdi.iImage = hdia.iImage; hdi.lParam = hdia.lParam; } #else bResult; #endif if (hdi.fmt & HDF_OWNERDRAW) { DRAWITEMSTRUCT dis; dis.CtlType = ODT_HEADER; dis.CtlID = (UINT)GetDlgCtrlID(); dis.itemID = nIndex; dis.itemAction = ODA_DRAWENTIRE; dis.itemState = (nState == HIS_PRESSED) ? ODS_SELECTED : 0; dis.hwndItem = m_hWnd; dis.hDC = pDC->GetSafeHdc(); dis.rcItem = rcItem; dis.itemData = hdi.lParam; // Now send it off to my parent... if (GetParent()->SendMessage(WM_DRAWITEM, dis.CtlID, (LPARAM)(DRAWITEMSTRUCT*)&dis)) { return; } } CRect rcText(rcItem); if (pImageList && (hdi.fmt & HDF_IMAGE) && hdi.iImage >= 0 && hdi.iImage < pImageList->GetImageCount()) { int iBitmapMargin = (int)SendMessage(HDM_GETBITMAPMARGIN); if (iBitmapMargin == 0) iBitmapMargin = GetMetrics()->m_cxEdge * 3; int cxBitmap = 16, cyBitmap = 16; ImageList_GetIconSize(pImageList->GetSafeHandle(), &cxBitmap, &cyBitmap); CPoint pt(rcItem.left + iBitmapMargin, (rcItem.bottom + rcItem.top - cyBitmap) / 2); if (hdi.fmt & HDF_BITMAP_ON_RIGHT) { CSize sz = pDC->GetTextExtent(strCaption); pt.x += sz.cx + iBitmapMargin + 9; if (pt.x + cxBitmap > rcItem.right - 3) pt.x = max(rcItem.left + 6, rcItem.right - 3 - cxBitmap); if (nState == HIS_PRESSED) pt.x ++; pImageList->Draw(pDC, hdi.iImage, pt, ILD_TRANSPARENT); rcText.right = pt.x + 6; } else { if (nState == HIS_PRESSED) pt.x ++; pImageList->Draw(pDC, hdi.iImage, pt, ILD_TRANSPARENT); rcText.left += cxBitmap + iBitmapMargin; } } if (((hdi.fmt & HDF_IMAGE) == 0) && ((hdi.fmt & HDF_SORTUP) || (hdi.fmt & HDF_SORTDOWN))) { int iBitmapMargin = GetMetrics()->m_cxEdge * 3; CSize sz = pDC->GetTextExtent(strCaption); CPoint pt(rcItem.left + iBitmapMargin, (rcItem.bottom + rcItem.top - 2) / 2); pt.x += sz.cx + iBitmapMargin + 9; if (pt.x + 9 > rcItem.right - 3) pt.x = max(rcItem.left + 6, rcItem.right - 3 - 9); if (hdi.fmt & HDF_SORTUP) { XTPDrawHelpers()->Triangle(pDC, CPoint(pt.x - 4, pt.y + 2), CPoint(pt.x, pt.y - 2), CPoint(pt.x + 4, pt.y + 2), GetColor(COLOR_3DSHADOW)); } else { XTPDrawHelpers()->Triangle(pDC, CPoint(pt.x - 4, pt.y - 2), CPoint(pt.x, pt.y + 2), CPoint(pt.x + 4, pt.y - 2), GetColor(COLOR_3DSHADOW)); } rcText.right = pt.x; } UINT nFormat = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX; // determine justification for text. switch (hdi.fmt & HDF_JUSTIFYMASK) { case HDF_LEFT: nFormat |= DT_LEFT; rcText.DeflateRect(9, 0, 6, 0); break; case HDF_CENTER: nFormat |= DT_CENTER; rcText.DeflateRect(6, 0, 6, 0); break; case HDF_RIGHT: nFormat |= DT_RIGHT; rcText.DeflateRect(6, 0, 9, 0); break; } if (rcText.Width() > 0) { if (nState == HIS_PRESSED) rcText.OffsetRect(1, 1); // draw text. pDC->SetTextColor(GetColor(COLOR_BTNTEXT)); pClass->DrawThemeText(pDC, HP_HEADERITEM, nState, strCaption, nFormat, &rcText); } }
void CXTPSkinObjectHeader::OnDraw(CDC* pDC) { CXTPClientRect rcClient(this); CRect rcBackground(rcClient); CXTPBufferDC dc(*pDC, rcClient); BOOL bFilterBar = (GetStyle() & HDS_FILTERBAR) && XTPSystemVersion()->GetComCtlVersion() >= MAKELONG(80, 5); CRect rcFilter(0, 0, 0, 0); dc.FillSolidRect(rcClient, GetColor(COLOR_3DFACE)); if (bFilterBar) { INT cyFilter = (rcClient.Height() - 1)/2; rcFilter = rcClient; rcClient.bottom = rcClient.top + cyFilter; rcFilter.top = rcClient.bottom; DefWindowProc(WM_PAINT, (WPARAM)dc.GetSafeHdc(), 0); } CXTPSkinManagerClass* pClass = GetSkinClass(); CXTPFontDC fontDC(&dc, GetFont()); dc.SetTextColor(GetColor(COLOR_BTNTEXT)); dc.SetBkMode(TRANSPARENT); CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)this; int iItemCount = pHeaderCtrl->GetItemCount(); // Draw each header item for (int iItem = 0; iItem < iItemCount; ++iItem) { int nIndex = Header_OrderToIndex(m_hWnd, iItem); // initialize draw item structure. CRect rcItem(0, 0, 0, 0); Header_GetItemRect(m_hWnd, nIndex, &rcItem); if ((rcItem.right < rcClient.left) || (rcItem.left > rcClient.right)) continue; if (bFilterBar) { rcItem.bottom = rcFilter.top; } int nState = HIS_NORMAL; if (nIndex == m_nHotItem) { nState = m_bLBtnDown ? HIS_PRESSED : HIS_HOT; } rcBackground.left = max(rcBackground.left, rcItem.right); pClass->DrawThemeBackground(&dc, HP_HEADERITEM, nState, &rcItem); DrawItemEntry(&dc, nIndex, rcItem, nState); } if (rcBackground.left < rcBackground.right) pClass->DrawThemeBackground(&dc, 0, 0, &rcBackground); }
void CXTPSkinObjectToolBar::DrawButton(CDC* pDC, int nIndex) { CToolBarCtrl* pToolBar = (CToolBarCtrl*)this; TBBUTTON tbb; pToolBar->GetButton(nIndex, &tbb); CRect rc; if (!pToolBar->GetItemRect(nIndex, rc)) return; int dxText = rc.Width() - (2 * GetMetrics()->m_cxEdge); int dyText = rc.Height() - (2 * GetMetrics()->m_cyEdge); NMTBCUSTOMDRAW tbcd; ZeroMemory(&tbcd, sizeof(NMTBCUSTOMDRAW)); tbcd.nmcd.hdc = pDC->GetSafeHdc(); tbcd.nmcd.rc = rc; tbcd.nmcd.dwItemSpec = tbb.idCommand; tbcd.nmcd.lItemlParam = tbb.dwData; SetRect(&tbcd.rcText, 0, 0, dxText, dyText); int nHot = (int)pToolBar->SendMessage(TB_GETHOTITEM); BOOL fHotTrack = nHot == nIndex; BOOL bPressed = tbb.fsState & TBSTATE_PRESSED; BOOL bChecked = tbb.fsState & TBSTATE_CHECKED; BOOL bEnabled = tbb.fsState & TBSTATE_ENABLED; tbcd.nmcd.uItemState = (fHotTrack ? CDIS_HOT : 0) | (bPressed ? CDIS_SELECTED : 0) | (bChecked ? CDIS_CHECKED : 0) | (bEnabled ? 0 : CDIS_DISABLED); LRESULT dwCustom = CustomDrawNotify(CDDS_ITEMPREPAINT, &tbcd.nmcd); fHotTrack = tbcd.nmcd.uItemState & CDIS_HOT; bPressed = tbcd.nmcd.uItemState & CDIS_SELECTED; bChecked = tbcd.nmcd.uItemState & CDIS_CHECKED; bEnabled = (tbcd.nmcd.uItemState & CDIS_DISABLED) == 0; if (!(dwCustom & CDRF_SKIPDEFAULT)) { int dxFace = rc.Width() - 2 * GetMetrics()->m_cxEdge; dxText = tbcd.rcText.right - tbcd.rcText.left; dyText = tbcd.rcText.bottom - tbcd.rcText.top; int x = rc.left + GetMetrics()->m_cxEdge; int y = rc.top + GetMetrics()->m_cyEdge; BOOL bSplit = HasSplitDropDown(&tbb); int cxMenuCheck = bSplit ? GetSystemMetrics(SM_CYMENUCHECK) : 0; if (HasDropDownArrow(&tbb)) { dxFace -= 5; dxText -= bSplit ? cxMenuCheck : 5; } LRESULT lPad = SendMessage(TB_GETPADDING); int yPad = HIWORD(lPad); int xPad = LOWORD(lPad); int yOffset = (yPad - (2 * GetMetrics()->m_cyEdge)) / 2; if (yOffset < 0) yOffset = 0; HIMAGELIST himl = GetImageList(HIML_NORMAL, 0); int iDxBitmap = 16, iDyBitmap = 16; if (himl) { ImageList_GetIconSize(himl, &iDxBitmap, &iDyBitmap); } int xCenterOffset = (dxFace - iDxBitmap) / 2; if (GetStyle() & TBSTYLE_LIST) { xCenterOffset = xPad / 2; } else if (bSplit) { xCenterOffset = (dxFace + GetMetrics()->m_cxEdge * 2 - (iDxBitmap + cxMenuCheck)) / 2; } if ((bPressed || bChecked) && (!(dwCustom & TBCDRF_NOOFFSET))) { xCenterOffset++; yOffset++; } CXTPSkinManagerClass* pClass = GetSkinClass(); if (!(dwCustom & TBCDRF_NOEDGES)) { if (bSplit) { CRect rcSplit(rc), rcSplitDropDown(rc); rcSplit.right -= cxMenuCheck; rcSplitDropDown.left = rcSplit.right; pClass->DrawThemeBackground(pDC, TP_SPLITBUTTON, !bEnabled ? TS_DISABLED : bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rcSplit); pClass->DrawThemeBackground(pDC, TP_SPLITBUTTONDROPDOWN, !bEnabled ? TS_DISABLED : bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rcSplitDropDown); } else { pClass->DrawThemeBackground(pDC, TP_BUTTON, !bEnabled ? TS_DISABLED : bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rc); } } BOOL fImage = HasButtonImage(&tbb); if (fImage) { int yImage = y, xImage = x; if (GetStyle() & TBSTYLE_LIST) { if (iDyBitmap + yPad >= rc.Height()) yImage -= GetMetrics()->m_cyEdge; if (iDxBitmap + xPad >= rc.Width()) xImage -= GetMetrics()->m_cxEdge; } DrawButtonImage(pDC, xImage + xCenterOffset, yImage + yOffset, nIndex); } CString strText; SendMessage(TB_GETBUTTONTEXT, tbb.idCommand, (LPARAM)(LPTSTR)strText.GetBuffer(256)); strText.ReleaseBuffer(); #ifdef _UNICODE if (strText.IsEmpty() && (int)SendMessage(WM_NOTIFYFORMAT, 0, NF_QUERY) == NFR_ANSI) { char tText[256]; tText[0] = 0; SendMessage(TB_GETBUTTONTEXTA, tbb.idCommand, (LPARAM)tText); strText = tText; } #endif if (!strText.IsEmpty()) { if ((bPressed || bChecked) && (!(dwCustom & TBCDRF_NOOFFSET))) { x++; if (GetStyle() & TBSTYLE_LIST) y++; } if (GetStyle() & TBSTYLE_LIST) { int iListGap = (GetMetrics()->m_cxEdge * 2); if (fImage) { x += iDxBitmap + iListGap; dxText -= iDxBitmap + iListGap; } } else { y += yOffset + iDyBitmap; dyText -= yOffset + iDyBitmap; } DWORD uiStyle = DT_END_ELLIPSIS; int nTextRows = (int)SendMessage(TB_GETTEXTROWS); if (nTextRows > 1) uiStyle |= DT_WORDBREAK | DT_EDITCONTROL; else uiStyle |= DT_SINGLELINE; if (GetStyle() & TBSTYLE_LIST) { uiStyle |= DT_LEFT | DT_VCENTER | DT_SINGLELINE; } else { uiStyle |= DT_CENTER; } pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(bEnabled ? GetColor(COLOR_BTNTEXT) : GetColor(COLOR_BTNSHADOW)); if (dxText > 0) { CRect rcText(x + 1, y + 1, x + 1 + dxText, y + 1 + dyText); pDC->DrawText(strText, rcText, uiStyle); } } if (!bSplit && HasDropDownArrow(&tbb)) { CPoint pt(rc.right - 6, rc.CenterPoint().y); if (bPressed) pt.Offset(1, 1); CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x - 2, pt.y - 1), CPoint(pt.x + 2, pt.y - 1), CPoint(pt.x, pt.y + 1), GetColor(COLOR_BTNTEXT)); } } if (dwCustom & CDRF_NOTIFYPOSTPAINT) CustomDrawNotify(CDDS_ITEMPOSTPAINT, &tbcd.nmcd); }
void CXTPSkinObjectSpin::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(&rcClient); CXTPBufferDC dcMem(*pDC, rcClient); DWORD dwStyle = GetStyle(); int nLower = 0, nUpper = 0; SendMessage(UDM_GETRANGE32, (WPARAM) &nLower, (LPARAM) &nUpper); BOOL bEnabled = (nUpper != nLower) && IsWindowEnabled(); HWND hWndBuddy = (HWND)SendMessage(UDM_GETBUDDY); if (hWndBuddy && bEnabled && !::IsWindowEnabled(hWndBuddy)) bEnabled = FALSE; dcMem.FillSolidRect(rcClient, GetColor(COLOR_3DFACE)); CRect rcBtn = rcClient; CXTPSkinManagerClass* pClassSpin = GetSkinClass(); if (hWndBuddy && GetWindowLong(hWndBuddy, GWL_EXSTYLE) & WS_EX_CLIENTEDGE) { dcMem.FillSolidRect(rcClient, GetColor(COLOR_WINDOW)); if (dwStyle & UDS_ALIGNRIGHT) { rcBtn.DeflateRect(0, 1, 1, 1); CXTPSkinManagerClass* pClassEdit = GetSkinManager()->GetSkinClass(this, _T("EDIT")); COLORREF clrBorderColor = pClassEdit->GetThemeColor(0, 0, TMT_BORDERCOLOR); dcMem.Draw3dRect(rcClient, clrBorderColor, clrBorderColor); dcMem.FillSolidRect(rcClient.left, rcClient.top + 1, 1, rcClient.Height() - 2, GetColor(COLOR_WINDOW)); } else if (dwStyle & UDS_ALIGNLEFT) { rcBtn.DeflateRect(1, 1, 0, 1); CXTPSkinManagerClass* pClassEdit = GetSkinManager()->GetSkinClass(this, _T("EDIT")); COLORREF clrBorderColor = pClassEdit->GetThemeColor(0, 0, TMT_BORDERCOLOR); dcMem.Draw3dRect(rcClient, clrBorderColor, clrBorderColor); dcMem.FillSolidRect(rcClient.right - 1, rcClient.top + 1, 1, rcClient.Height() - 2, GetColor(COLOR_WINDOW)); } } RECT rc = rcBtn; if (dwStyle & UDS_HORZ) { int nState = DNHZS_NORMAL; if (!bEnabled) nState = DNHZS_DISABLED; else if (m_nPressedButton == UD_HITDOWN && m_nHotButton == UD_HITDOWN) nState = DNHZS_PRESSED; else if ((m_nHotButton == UD_HITDOWN || m_nPressedButton == UD_HITDOWN) && (m_nPressedButton != UD_HITUP)) nState = DNHZS_HOT; rc.right = (rcBtn.right + rcBtn.left) / 2; pClassSpin->DrawThemeBackground(&dcMem, SPNP_DOWNHORZ, nState, &rc); nState = UPHZS_NORMAL; if (!bEnabled) nState = UPHZS_DISABLED; else if (m_nPressedButton == UD_HITUP && m_nHotButton == UD_HITUP) nState = UPHZS_PRESSED; else if ((m_nHotButton == UD_HITUP || m_nPressedButton == UD_HITUP) && (m_nPressedButton != UD_HITDOWN)) nState = UPHZS_HOT; rc.left = rcBtn.right - (rc.right - rc.left); // handles odd-x case, too rc.right = rcBtn.right; pClassSpin->DrawThemeBackground(&dcMem, SPNP_UPHORZ, nState, &rc); } else { int nState = UPS_NORMAL; if (!bEnabled) nState = UPS_DISABLED; else if (m_nPressedButton == UD_HITUP && m_nHotButton == UD_HITUP) nState = UPS_PRESSED; else if ((m_nHotButton == UD_HITUP || m_nPressedButton == UD_HITUP) && (m_nPressedButton != UD_HITDOWN)) nState = UPS_HOT; rc.bottom = (rcBtn.bottom + rcBtn.top) / 2; pClassSpin->DrawThemeBackground(&dcMem, SPNP_UP, nState, &rc); nState = DNS_NORMAL; if (!bEnabled) nState = DNS_DISABLED; else if (m_nPressedButton == UD_HITDOWN && m_nHotButton == UD_HITDOWN) nState = DNS_PRESSED; else if ((m_nHotButton == UD_HITDOWN || m_nPressedButton == UD_HITDOWN) && (m_nPressedButton != UD_HITUP)) nState = DNS_HOT; rc.top = rcBtn.bottom - (rc.bottom - rc.top); // handles odd-y case, too rc.bottom = rcBtn.bottom; pClassSpin->DrawThemeBackground(&dcMem, SPNP_DOWN, nState, &rc); } }
void CXTPSkinObjectProgress::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(&rcClient); CXTPBufferDC dcMem(*pDC, rcClient); dcMem.FillSolidRect(rcClient, GetColor(COLOR_3DFACE)); DWORD dwStyle = GetStyle(); BOOL bVert = dwStyle & PBS_VERTICAL; int nBarPart = bVert ? PP_BARVERT : PP_BAR; int nChunkPart = bVert ? PP_CHUNKVERT : PP_CHUNK; CXTPSkinManagerClass* pClassProgress = GetSkinClass(); pClassProgress->DrawThemeBackground(&dcMem, nBarPart, 0, rcClient); CRect rc = rcClient; CRect rcMargins = pClassProgress->GetThemeRect(nBarPart, 0, TMT_SIZINGMARGINS); rc.DeflateRect(rcMargins); int iWidth, dxBlock; if (GetStyle() & PBS_MARQUEE) { rcClient = rc; dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, rc.Height() * 2 / 3); int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2); rc.left = m_nMarqueePos + rcClient.left; if (dxBlock == 1 && dxSpace == 0) { dxBlock = 8; rc.right = rc.left + 5 * dxBlock; if (rc.right > rcClient.right) { CRect rcPart(rcClient.left, rc.top, rcClient.left + rc.right - rcClient.right, rc.bottom); pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0, rcPart); rc.right = rcClient.right; } pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0, rc); return; } for (int i = 0; i < 5; i++) { if (rc.left >= rcClient.right) rc.left = rcClient.left; rc.right = rc.left + dxBlock; if (rc.right > rcClient.right) rc.right = rcClient.right; pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0, rc); rc.left = rc.right + dxSpace; } return; } PBRANGE range; SendMessage(PBM_GETRANGE, (WPARAM) FALSE, (LPARAM) &range); int iLow = range.iLow; int iHigh = range.iHigh; int iPos = (int)SendMessage(PBM_GETPOS); if (bVert) { iWidth = rc.Height(); dxBlock = (rcClient.right - rcClient.left) * 2 / 3; } else { iWidth = rc.Width(); dxBlock = (rcClient.bottom - rcClient.top) * 2 / 3; } int x = MulDiv(iWidth, iPos - iLow, iHigh - iLow); dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, dxBlock); int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2); if (dxBlock == 0) dxBlock = 1; if (dxBlock == 1 && dxSpace == 0) { if (bVert) { rc.top = rc.bottom - x; } else { rc.right = rc.left + x; } pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0, rc); return; } int nBlocks = (x + (dxBlock + dxSpace) - 1) / (dxBlock + dxSpace); for (int i = 0; i < nBlocks; i++) { if (bVert) { rc.top = rc.bottom - dxBlock; if (rc.bottom <= rcClient.top) break; if (rc.top <= rcClient.top) rc.top = rcClient.top + 1; } else { rc.right = rc.left + dxBlock; if (rc.left >= rcClient.right) break; if (rc.right >= rcClient.right) rc.right = rcClient.right - 1; } pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0, rc); if (bVert) rc.bottom = rc.top - dxSpace; else rc.left = rc.right + dxSpace; } }