void CFontComboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { ASSERT(lpDrawItemStruct->CtlType == ODT_COMBOBOX); CString strText; //判断当前索引的字体名称是否为空 int nIndex = lpDrawItemStruct->itemID; if (GetLBTextLen(nIndex) < 0) return ; GetLBText(nIndex, strText); ASSERT(!strText.IsEmpty()); int nImage = 0; //根据索引值从m_pFontVec得到字体图像类型 if (!m_pFontVec.empty()) nImage = m_pFontVec[nIndex]->GetImage(); CDC dc; dc.Attach(lpDrawItemStruct->hDC); COLORREF crOldTextColor = dc.GetTextColor(); COLORREF crOldBkColor = dc.GetBkColor(); //如果Item处于选择焦点、状态下,用系统高亮色改变文本和背景色 if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) { dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT)); dc.FillSolidRect(&lpDrawItemStruct->rcItem, ::GetSysColor(COLOR_HIGHLIGHT)); } else dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor); CRect rItem(lpDrawItemStruct->rcItem); CRect rText(rItem); CRect rBmp(&rItem); if(m_FontBmp) { //计算Item中字体预览图的贴图位置 rBmp.top += (rBmp.Height() - FNTIMG_Y) / 2; rBmp.bottom = rBmp.top + FNTIMG_Y + 1; rText.left += FNTIMG_X; if (nImage != (int)0XFF) { int x,y; x = nImage * FNTIMG_X; //根据预览图类型计算源图的矩形大小 y = FNTIMG_Y; CDC mdc; mdc.CreateCompatibleDC(&dc); CBitmap* pOldBmp = mdc.SelectObject(CBitmap::FromHandle(m_FontBmp)); COLORREF clrTransparent = mdc.GetPixel(0, y); //调用TransparentBlt进行透明贴图,此函数需要加入MsImg32.Lib文件 ::TransparentBlt (dc.GetSafeHdc(),rBmp.left, rBmp.top, FNTIMG_X, FNTIMG_Y, mdc, x, y, FNTIMG_X, FNTIMG_Y, clrTransparent); } } else rText.left += 10; //rText所代表的字体名称填充位置需要右移图片的宽度 dc.DrawText(strText, rText, DT_LEFT|DT_SINGLELINE|DT_VCENTER); dc.SetTextColor(crOldTextColor); dc.SetBkColor(crOldBkColor); dc.Detach(); }
void CTrayMenuBtn::OnPaint() { CPaintDC dc(this); // device context for painting CRect rClient; GetClientRect(rClient); CDC MemDC; MemDC.CreateCompatibleDC(&dc); CBitmap MemBMP, *pOldBMP; MemBMP.CreateCompatibleBitmap(&dc, rClient.Width(), rClient.Height()); pOldBMP = MemDC.SelectObject(&MemBMP); CFont *pOldFONT = NULL; if(m_cfFont.GetSafeHandle()) pOldFONT = MemDC.SelectObject(&m_cfFont); BOOL bEnabled = IsWindowEnabled(); if(m_bMouseOver && bEnabled) { FillRect(MemDC.m_hDC, rClient, GetSysColorBrush(COLOR_HIGHLIGHT)); MemDC.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)); } else { FillRect(MemDC.m_hDC, rClient, GetSysColorBrush(COLOR_BTNFACE)); MemDC.SetTextColor(GetSysColor(COLOR_BTNTEXT)); } int iLeftOffset = 0; if(m_bUseIcon) { MemDC.DrawState(CPoint(2,rClient.Height()/2-m_sIcon.cy/2),CSize(16,16),m_hIcon,DST_ICON|DSS_NORMAL,(CBrush*)NULL); iLeftOffset = m_sIcon.cx + 4; } MemDC.SetBkMode(TRANSPARENT); CRect rText(0,0,0,0); MemDC.DrawText(m_strText, rText, DT_CALCRECT|DT_SINGLELINE|DT_LEFT); //CPoint pt((rClient.Width()>>1)-(rText.Width()>>1),(rClient.Height()>>1)-(rText.Height()>>1)); CPoint pt(rClient.left+2+iLeftOffset, rClient.Height()/2-rText.Height()/2); CPoint sz(rText.Width(),rText.Height()); MemDC.DrawState(pt, sz, m_strText, DST_TEXT | (bEnabled ? DSS_NORMAL : DSS_DISABLED), FALSE, m_strText.GetLength(), (CBrush*)NULL); dc.BitBlt(0,0,rClient.Width(),rClient.Height(),&MemDC,0,0,SRCCOPY); MemDC.SelectObject(pOldBMP); if(pOldFONT) MemDC.SelectObject(pOldFONT); }
CSize CSkinBase::GetTextExtent(CDC* pDC, LPCTSTR szText) { ASSERT (pDC && szText); if (pDC && szText) { CRect rText(0, 0, 0, SHRT_MAX); pDC->DrawText(szText, rText, DT_SINGLELINE | DT_CALCRECT); return rText.Size(); } // else return 0; }
void CSteadyStatic::OnPaint() { CPaintDC dc(this); // device context for painting COLORREF cBkgnd = GetSysColor(COLOR_3DFACE); HGDIOBJ hPrevFont = dc.SelectObject(m_Font); // select our font dc.SetBkColor(cBkgnd); // set background color dc.TextOut(0, 0, m_Text); // output text; align top left only CSize szText = dc.GetTextExtent(m_Text); // get text size CRect rText(CPoint(0, 0), szText); // text rectangle dc.ExcludeClipRect(rText); // remove text rectangle from clipping rectangle CRect rc; GetClientRect(rc); dc.FillSolidRect(rc, cBkgnd); // fill rest of window with background color dc.SelectObject(hPrevFont); // restore previous font }
void COScopeCtrl::InvalidateCtrl(bool deleteGraph) { int i, j, GridPos; int nCharacters; CPen *oldPen; CPen solidPen(PS_SOLID, 0, m_crGridColor); CFont yUnitFont, *oldFont; CString strTemp; CClientDC dc(this); // if we don't have one yet, set up a memory dc for the grid if (m_dcGrid.GetSafeHdc() == NULL) { m_dcGrid.CreateCompatibleDC(&dc); m_bitmapGrid.DeleteObject(); m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight); m_bitmapOldGrid.Attach(SelectObject(m_dcGrid, m_bitmapGrid)); } COLORREF crLabelBk; COLORREF crLabelFg; bool bStraightGraphs = true; if (bStraightGraphs) { // Get the background color from the parent window. This way the controls which are // embedded in a dialog window can get painted with the same background color as // the dialog window. HBRUSH hbr = (HBRUSH)GetParent()->SendMessage(WM_CTLCOLORSTATIC, (WPARAM)dc.m_hDC, (LPARAM)m_hWnd); if (hbr == GetSysColorBrush(COLOR_WINDOW)) crLabelBk = GetSysColor(COLOR_WINDOW); else crLabelBk = GetSysColor(COLOR_BTNFACE); crLabelFg = GetSysColor(COLOR_WINDOWTEXT); } else { crLabelBk = m_crBackColor; crLabelFg = m_crGridColor; } // fill the grid background m_dcGrid.FillSolidRect(m_rectClient, crLabelBk); // draw the plot rectangle: determine how wide the y axis scaling values are double fAbsUpperLimit = fabs(m_PlotData[0].dUpperLimit); if (fAbsUpperLimit > 0.0) nCharacters = abs((int)log10(fAbsUpperLimit)); else nCharacters = 0; double fAbsLowerLimit = fabs(m_PlotData[0].dLowerLimit); if (fAbsLowerLimit > 0.0) nCharacters = max(nCharacters, abs((int)log10(fAbsLowerLimit))); // add the units digit, decimal point and a minus sign, and an extra space // as well as the number of decimal places to display nCharacters = nCharacters + 4 + m_nYDecimals; //MORPH START - Proper Scale // adjust the plot rectangle dimensions // Changed this so that the Y-Units wouldn't overlap the Y-Scale. m_rectPlot.left = m_rectClient.left + 8*7+4;//(nCharacters) ; m_rectPlot.right = m_rectClient.right - 10; m_nPlotWidth = m_rectPlot.Width(); //MORPH START - Dynamic axis legend reservation oldFont = m_dcGrid.SelectObject(&sm_fontAxis); m_dcGrid.SetTextAlign(TA_LEFT | TA_TOP); int xoffset = m_rectPlot.left + 2; int yneededspace = 4; for (i = 0; i < m_NTrends; i++) { CSize sizeLabel = m_dcGrid.GetTextExtent(m_PlotData[i].LegendLabel); if (xoffset + 12 + sizeLabel.cx + 8*7 > m_rectPlot.right){ xoffset = m_rectPlot.left + 2; yneededspace += sizeLabel.cy; } else if (i == 0) yneededspace += sizeLabel.cy; xoffset += 12 + sizeLabel.cx + 12; } m_rectPlot.top = 10; m_rectPlot.bottom = m_rectClient.bottom - yneededspace; m_nPlotHeight = m_rectPlot.Height(); //MORPH END - Dynamic axis legend reservation // set the scaling factor for now, this can be adjusted in the SetRange functions for(int iTrend = 0; iTrend < m_NTrends; iTrend ++) m_PlotData[iTrend].dVerticalFactor = (double)m_nPlotHeight / m_PlotData[iTrend].dRange; //MORPH END - Proper scale // draw the plot rectangle if (bStraightGraphs) { m_dcGrid.FillSolidRect(m_rectPlot.left, m_rectPlot.top, m_rectPlot.right - m_rectPlot.left + 1, m_rectPlot.bottom - m_rectPlot.top + 1, m_crBackColor); CRect rcPlot(m_rectPlot); rcPlot.left -= 1; rcPlot.top -= 1; rcPlot.right += 3; rcPlot.bottom += 3; m_dcGrid.DrawEdge(rcPlot, EDGE_SUNKEN, BF_RECT); } else { oldPen = m_dcGrid.SelectObject(&solidPen); m_dcGrid.MoveTo(m_rectPlot.left, m_rectPlot.top); m_dcGrid.LineTo(m_rectPlot.right + 1, m_rectPlot.top); m_dcGrid.LineTo(m_rectPlot.right + 1, m_rectPlot.bottom + 1); m_dcGrid.LineTo(m_rectPlot.left, m_rectPlot.bottom + 1); m_dcGrid.LineTo(m_rectPlot.left, m_rectPlot.top); m_dcGrid.SelectObject(oldPen); } // draw the dotted lines, // use SetPixel instead of a dotted pen - this allows for a finer dotted line and a more "technical" look for (j = 1; j < m_nYGrids + 1; j++) { GridPos = m_rectPlot.Height() * j / (m_nYGrids + 1) + m_rectPlot.top; for (i = m_rectPlot.left; i < m_rectPlot.right; i += 4) m_dcGrid.SetPixel(i, GridPos, m_crGridColor); } if (thePrefs.m_bShowVerticalHourMarkers) { // Add vertical reference lines in the graphs. Each line indicates an elapsed hour from the current // time (extreme right of the graph). // Lines are always right aligned and the gap scales accordingly to the user horizontal scale. // Intervals of 10 hours are marked with slightly stronger lines that go beyond the bottom border. int hourSize, partialSize, surplus=0, extra=0; if (m_nXGrids > 0) { hourSize = (3600*m_rectPlot.Width())/(3600*m_nXGrids + m_nXPartial); // Size of an hour in pixels partialSize = m_rectPlot.Width() - hourSize*m_nXGrids; if (partialSize >= hourSize) { partialSize = (hourSize*m_nXPartial)/3600; // real partial size surplus = m_rectPlot.Width() - hourSize*m_nXGrids - partialSize; // Pixel surplus } GridPos = 0; for(j = 1; j <= m_nXGrids; j++) { extra = 0; if (surplus) { surplus--; extra=1; } GridPos += (hourSize+extra); if ((m_nXGrids - j + 1) % 10 == 0) { for(i = m_rectPlot.top; i < m_rectPlot.bottom; i += 2) m_dcGrid.SetPixel(m_rectPlot.left + GridPos - hourSize + partialSize, i, m_crGridColor); } else { for(i = m_rectPlot.top; i < m_rectPlot.bottom; i += 4) m_dcGrid.SetPixel(m_rectPlot.left + GridPos - hourSize + partialSize, i, m_crGridColor); } } } } /* no win98 vs2008 if (afxIsWin95()) { // Win98: To get a rotated font it has to be specified as "Arial" ("MS Shell Dlg" // and "MS Sans Serif" are not created with rotation) yUnitFont.CreateFont(FontPointSizeToLogUnits(8*10), 0, 900, 900, FW_NORMAL, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, _T("Arial")); } else */ // end no win98 vs2008 { yUnitFont.CreateFont(FontPointSizeToLogUnits(8*10), 0, 900, 900, FW_NORMAL, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, theApp.GetDefaultFontFaceName()); } // grab the horizontal font oldFont = m_dcGrid.SelectObject(&sm_fontAxis); // y max m_dcGrid.SetTextColor(crLabelFg); m_dcGrid.SetBkColor(crLabelBk); m_dcGrid.SetTextAlign(TA_RIGHT | TA_TOP); if (m_str.YMax.IsEmpty()) strTemp.Format(_T("%.*lf"), m_nYDecimals, m_PlotData[0].dUpperLimit); else strTemp = m_str.YMax; m_dcGrid.TextOut(m_rectPlot.left - 4, m_rectPlot.top - 7, strTemp); if (m_rectPlot.Height() / (m_nYGrids + 1) >= 14) { for (j = 1; j < (m_nYGrids + 1); j++) { GridPos = m_rectPlot.Height() * j / (m_nYGrids + 1) + m_rectPlot.top; strTemp.Format(_T("%.*lf"), m_nYDecimals, m_PlotData[0].dUpperLimit * (m_nYGrids - j + 1) / (m_nYGrids + 1)); m_dcGrid.TextOut(m_rectPlot.left - 4, GridPos - 7, strTemp); } } else { strTemp.Format(_T("%.*lf"), m_nYDecimals, m_PlotData[0].dUpperLimit / 2); m_dcGrid.TextOut(m_rectPlot.left - 2, m_rectPlot.bottom + ((m_rectPlot.top - m_rectPlot.bottom) / 2) - 7 , strTemp); } // y min if (m_str.YMin.IsEmpty()) strTemp.Format(_T("%.*lf"), m_nYDecimals, m_PlotData[0].dLowerLimit); else strTemp = m_str.YMin; m_dcGrid.TextOut(m_rectPlot.left - 4, m_rectPlot.bottom - 7, strTemp); // x units m_dcGrid.SetTextAlign(TA_RIGHT | TA_BOTTOM); m_dcGrid.TextOut(m_rectClient.right - 2, m_rectClient.bottom - 2, m_str.XUnits); // restore the font m_dcGrid.SelectObject(oldFont); // y units oldFont = m_dcGrid.SelectObject(&yUnitFont); m_dcGrid.SetTextAlign(TA_CENTER | TA_BASELINE); CRect rText(0,0,0,0); m_dcGrid.DrawText(m_str.YUnits, rText, DT_CALCRECT); m_dcGrid.TextOut((m_rectClient.left + m_rectPlot.left - 8) / 2 - rText.Height() / 2, (m_rectPlot.bottom + m_rectPlot.top) / 2 - rText.Height() / 2, m_str.YUnits ); m_dcGrid.SelectObject(oldFont); oldFont = m_dcGrid.SelectObject(&sm_fontAxis); m_dcGrid.SetTextAlign(TA_LEFT | TA_TOP); int xpos = m_rectPlot.left + 2; int ypos = m_rectPlot.bottom + 2; for (i = 0; i < m_NTrends; i++) { CSize sizeLabel = m_dcGrid.GetTextExtent(m_PlotData[i].LegendLabel); if (i != 0 && xpos + 12 + sizeLabel.cx + 8*7 > m_rectPlot.right){ xpos = m_rectPlot.left + 2; ypos += sizeLabel.cy; } if (bStraightGraphs) { const int iLegFrmD = 1; CPen penFrame(PS_SOLID, iLegFrmD, crLabelFg); oldPen = m_dcGrid.SelectObject(&penFrame); const int iLegBoxW = 9; const int iLegBoxH = 9; CRect rcLegendFrame; rcLegendFrame.left = xpos - iLegFrmD; rcLegendFrame.top = ypos + 2 - iLegFrmD; rcLegendFrame.right = rcLegendFrame.left + iLegBoxW + iLegFrmD; rcLegendFrame.bottom = rcLegendFrame.top + iLegBoxH + iLegFrmD; m_dcGrid.MoveTo(rcLegendFrame.left, rcLegendFrame.top); m_dcGrid.LineTo(rcLegendFrame.right, rcLegendFrame.top); m_dcGrid.LineTo(rcLegendFrame.right, rcLegendFrame.bottom); m_dcGrid.LineTo(rcLegendFrame.left, rcLegendFrame.bottom); m_dcGrid.LineTo(rcLegendFrame.left, rcLegendFrame.top); m_dcGrid.SelectObject(oldPen); m_dcGrid.FillSolidRect(xpos, ypos + 2, iLegBoxW, iLegBoxH, m_PlotData[i].crPlotColor); m_dcGrid.SetBkColor(crLabelBk); } else { CPen LegendPen(PS_SOLID, 3, m_PlotData[i].crPlotColor); oldPen = m_dcGrid.SelectObject(&LegendPen); m_dcGrid.MoveTo(xpos, ypos + 8); m_dcGrid.LineTo(xpos + 8, ypos + 4); m_dcGrid.SelectObject(oldPen); } m_dcGrid.TextOut(xpos + 12, ypos, m_PlotData[i].LegendLabel); xpos += 12 + sizeLabel.cx + 12; } m_dcGrid.SelectObject(oldFont); // if we don't have one yet, set up a memory dc for the plot if (m_dcPlot.GetSafeHdc() == NULL) { m_dcPlot.CreateCompatibleDC(&dc); m_bitmapPlot.DeleteObject(); m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight); m_bitmapOldPlot.Attach(SelectObject(m_dcPlot, m_bitmapPlot)); } // make sure the plot bitmap is cleared if (deleteGraph) m_dcPlot.FillSolidRect(m_rectClient, m_crBackColor); int iNewSize = m_rectClient.Width() / m_nShiftPixels + 10; // +10 just in case :) if (m_nMaxPointCnt < iNewSize) m_nMaxPointCnt = iNewSize; if (theApp.emuledlg->IsRunning()) { if (!thePrefs.IsGraphRecreateDisabled()) { // The timer will redraw the previous points in 200ms m_bDoUpdate = false; if (m_nRedrawTimer) KillTimer(m_nRedrawTimer); VERIFY( (m_nRedrawTimer = SetTimer(1612, 200, NULL)) != NULL ); // reduce flickering } } InvalidateRect(m_rectClient); }
void CXTPSyntaxEditColorComboBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); UINT itemState = lpDIS->itemState; UINT itemID = lpDIS->itemID; CRect rcItem = lpDIS->rcItem; if (itemID == (UINT)-1) { return; } BOOL bDisabled = ((itemState & ODS_DISABLED) == ODS_DISABLED); BOOL bSelected = ((itemState & ODS_SELECTED) == ODS_SELECTED); BOOL bFocus = ((itemState & ODS_FOCUS) == ODS_FOCUS); // draw background. if (bDisabled) { pDC->SetTextColor(GetXtremeColor(COLOR_GRAYTEXT)); pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE)); pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_3DFACE)); } else { if (bSelected) { pDC->SetTextColor(GetXtremeColor(COLOR_HIGHLIGHTTEXT)); pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW)); pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_HIGHLIGHT)); } else { pDC->SetTextColor(GetXtremeColor(COLOR_WINDOWTEXT)); pDC->SetBkColor(GetXtremeColor(COLOR_WINDOW)); pDC->FillSolidRect(&rcItem, GetXtremeColor(COLOR_WINDOW)); } // draw focus rectangle. if (bFocus) { pDC->DrawFocusRect(&rcItem); } } // determine the size of the color rectangle. CRect rColor(rcItem); rColor.DeflateRect(2,2); rColor.right = rColor.left + COLOR_ITEM_WIDTH; rColor.bottom = rColor.top + COLOR_ITEM_WIDTH; // draw color rectangle. pDC->FillSolidRect(rColor, bDisabled? GetXtremeColor(COLOR_3DFACE): (COLORREF)lpDIS->itemData); pDC->Draw3dRect(rColor, GetXtremeColor(bDisabled? COLOR_GRAYTEXT: COLOR_WINDOWTEXT), GetXtremeColor(bDisabled? COLOR_GRAYTEXT: COLOR_WINDOWTEXT)); // determine the size of the text display. CRect rText(rColor); rText.top -= 2; rText.bottom = rText.top + (::GetSystemMetrics(SM_CYVTHUMB)-::GetSystemMetrics(SM_CYEDGE)); rText.left = rText.right + 4; rText.right = rcItem.right; // draw text. CString csItemText; GetLBText(itemID, csItemText); if (!csItemText.IsEmpty()) { pDC->SetBkMode(TRANSPARENT); pDC->DrawText(csItemText, rText, DT_LEFT | DT_VCENTER | DT_SINGLELINE); } }
void TabBar::paintRoundedTabs(QStylePainter &p, int dist) { /// TODO: minor highlight bug when mouse goes on another tab without click // Draw all tabs before the selected tab QList<int> tabs; for (int i = 0; i < count(); i++) if (currentIndex() != i) tabs.append(i); tabs.append(currentIndex()); for (int idx = 0; idx < count(); idx++) { int i = tabs.at(idx); QStyleOptionTab o; initStyleOption(&o, i); // Background color if (i != currentIndex()) { o.rect.adjust(0, 2, 0, 0); } else if (i == count()) { o.rect.adjust(2, 2, -4, 0); } /// Adjust parameters to tighten tabs //o.rect.adjust(-dist / 2, 0, dist / 2, 0); // Rounded frame tab QPainterPath ppLeft, ppRight; ppLeft.moveTo(o.rect.x() + dist * 0, o.rect.y() + o.rect.height()); ppLeft.cubicTo(o.rect.x() + dist * 1, o.rect.y() + o.rect.height(), o.rect.x() + dist * 1, o.rect.y() + 1, o.rect.x() + dist * 2, o.rect.y() + 1); QPainterPath ppLeftCurve(ppLeft); // Add another point to be able to fill the path afterwards ppLeft.lineTo(o.rect.x() + dist * 2, o.rect.y() + o.rect.height()); QLine topHozLine(o.rect.x() + dist * 2, o.rect.y(), o.rect.x() + o.rect.width() - dist * 1, o.rect.y()); ppRight.moveTo(o.rect.x() + o.rect.width() - dist * 1, o.rect.y() + 1); ppRight.cubicTo(o.rect.x() + o.rect.width() - dist * 0, o.rect.y() + 1, o.rect.x() + o.rect.width() - dist * 0, o.rect.y() + o.rect.height(), o.rect.x() + o.rect.width() + dist * 1, o.rect.y() + o.rect.height()); QPainterPath ppRightCurve(ppRight); // Like first curve ppRight.lineTo(o.rect.x() + o.rect.width() - dist * 1, o.rect.y() + o.rect.height()); p.save(); if (o.state.testFlag(QStyle::State_MouseOver)) { p.setPen(o.palette.highlight().color()); } else { p.setPen(o.palette.mid().color()); } QRect midRect(topHozLine.p1(), QPoint(topHozLine.p2().x(), topHozLine.p2().y() + o.rect.height())); if (i == currentIndex()) { p.fillPath(ppLeft, o.palette.base()); p.fillRect(midRect, o.palette.base()); p.fillPath(ppRight, o.palette.base()); } else if (o.state.testFlag(QStyle::State_MouseOver)) { p.fillPath(ppLeft, o.palette.highlight().color().lighter()); p.fillRect(midRect, o.palette.highlight().color().lighter()); p.fillPath(ppRight, o.palette.highlight().color().lighter()); } else { p.fillPath(ppLeft, o.palette.window()); p.fillRect(midRect, o.palette.window()); p.fillPath(ppRight, o.palette.window()); } p.setRenderHint(QPainter::Antialiasing, true); p.drawPath(ppLeftCurve); p.drawPath(ppRightCurve); p.setRenderHint(QPainter::Antialiasing, false); p.drawLine(topHozLine); p.restore(); /// DEBUG //p.drawRect(o.rect); // Icon QRect r = tabRect(i); r.setHeight(fontMetrics().ascent()); r.translate(3 + dist * 1.25, (height() - r.height()) / 2); r.setWidth(r.height() / 2); p.setRenderHint(QPainter::SmoothPixmapTransform); o.icon.paint(&p, r, Qt::AlignLeft | Qt::AlignVCenter); // Playlist name if (i == currentIndex()) { p.setPen(o.palette.windowText().color()); } else if (o.state.testFlag(QStyle::State_MouseOver)) { p.setPen(o.palette.windowText().color()); } else { p.setPen(o.palette.mid().color()); } QRect rText(r.x() + r.width() + 5, this->rect().y(), o.rect.width() - (r.width() + 5), this->height() - 2); p.drawText(rText, Qt::AlignLeft | Qt::AlignVCenter, o.text); } }
void TabBar::paintRectTabs(QStylePainter &p) { static const qreal penScaleFactor = 0.2; for (int i = 0; i < count(); i++) { QStyleOptionTab o; initStyleOption(&o, i); // Background color p.save(); if (i != currentIndex()) { o.rect.adjust(0, 2, 0, 0); } else if (i == count()) { o.rect.adjust(2, 2, -4, -4); } // Highlight the tab under the cursor if (o.state.testFlag(QStyle::State_MouseOver) && i != currentIndex()) { p.setPen(QPen(o.palette.highlight(), penScaleFactor)); p.fillRect(o.rect, o.palette.highlight().color().lighter()); } else { p.setPen(QPen(o.palette.mid(), penScaleFactor)); if (i == currentIndex()) { /// XXX if (SettingsPrivate::instance()->isCustomColors()) { p.fillRect(o.rect, o.palette.base().color().lighter(110)); } else { p.fillRect(o.rect, o.palette.base()); } } else { p.fillRect(o.rect, o.palette.window()); } } if (o.state.testFlag(QStyle::State_MouseOver)) { p.setPen(o.palette.highlight().color()); } else { p.setPen(o.palette.mid().color()); } // Frame tab, it is not a rectangle but only 3 lines p.drawLine(o.rect.topLeft(), o.rect.bottomLeft()); p.drawLine(o.rect.topRight(), o.rect.bottomRight()); p.drawLine(o.rect.topLeft(), o.rect.topRight()); //} p.restore(); // Icon QRect r = tabRect(i); r.setHeight(fontMetrics().ascent()); r.translate(10, (height() - r.height()) / 2); r.setWidth(r.height() / 2); p.setRenderHint(QPainter::SmoothPixmapTransform); o.icon.paint(&p, r, Qt::AlignLeft | Qt::AlignVCenter); // Playlist name if (i == currentIndex()) { p.setPen(o.palette.windowText().color()); } else if (o.state.testFlag(QStyle::State_MouseOver)) { p.setPen(o.palette.windowText().color()); } else { p.setPen(o.palette.mid().color()); } QRect rText(r.x() + r.width() + 10, r.y(), o.rect.width() - r.width() - 10, r.height()); p.drawText(rText, Qt::AlignLeft | Qt::AlignVCenter, o.text); } }
void CIconListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if ((int)lpDrawItemStruct->itemID < 0) { // If there are no elements in the List Box // based on whether the list box has Focus or not // draw the Focus Rect or Erase it, if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&lpDrawItemStruct->rcItem); } else if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && !(lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&lpDrawItemStruct->rcItem); } return; } CRect rcItem(lpDrawItemStruct->rcItem); // To draw the focus rect. CRect rClient(rcItem); // Rect to highlight the Item CRect rText(rcItem); // Rect To display the Text CPoint Pt( rcItem.left , rcItem.top ); // Point To draw the Image // if the Image list exists for the list box // adjust the Rect sizes to accomodate the Image for each item. if(m_pImageList) { rClient.left += 16; rText.left += 16; rText.top += 2; } else { rText.top += 2; } COLORREF crText; CString strText; // Image information in the item data. int iImg = (int)lpDrawItemStruct->itemData; // If item selected, draw the highlight rectangle. // Or if item deselected, draw the rectangle using the window color. if ((lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { CBrush br(::GetSysColor(COLOR_HIGHLIGHT)); pDC->FillRect(&rClient, &br); } else if (!(lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & ODA_SELECT)) { CBrush br(::GetSysColor(COLOR_WINDOW)); pDC->FillRect(&rClient, &br); } // If the item has focus, draw the focus rect. // If the item does not have focus, erase the focus rect. if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&rcItem); } else if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && !(lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&rcItem); } // To draw the Text set the background mode to Transparent. int iBkMode = pDC->SetBkMode(TRANSPARENT); if (lpDrawItemStruct->itemState & ODS_SELECTED) crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); else if (lpDrawItemStruct->itemState & ODS_DISABLED) crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT)); else crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); // Get the item text. GetText(lpDrawItemStruct->itemID, strText); // Setup the text format. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER; if (GetStyle() & LBS_USETABSTOPS) nFormat |= DT_EXPANDTABS; // if the ImageList is Existing and there is an associated Image // for the Item, draw the Image. if(m_pImageList && (iImg != -1 ) ) m_pImageList->Draw(pDC,iImg,Pt,ILD_NORMAL); //Draw the Text pDC->DrawText(strText, -1, &rText, nFormat | DT_CALCRECT); pDC->DrawText(strText, -1, &rText, nFormat); pDC->SetTextColor(crText); pDC->SetBkMode(iBkMode); }
void CIconListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); if (((LONG)(lpDrawItemStruct->itemID) >= 0) && (lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT))){ CRect rcItem(lpDrawItemStruct->rcItem); // To draw the focus rect. CRect rClient(rcItem.left,rcItem.top,rcItem.right,rcItem.bottom); // Rect to highlight the Item CRect rText(rClient); // Rect To display the Text CPoint Pt( rClient.left , rClient.top ); // Point To draw the Image // if the Image list exists for the list box // adjust the Rect sizes to accomodate the Image for each item. int cyItem = GetItemHeight(lpDrawItemStruct->itemID); if (m_cyText == 0) { CClientDC dc(this); CFont* pOldFont = dc.SelectObject(GetFont()); TEXTMETRIC tm; VERIFY (dc.GetTextMetrics ( &tm )); dc.SelectObject(pOldFont); m_cyText = tm.tmHeight; } if(m_pImageList) { rClient.left += 32; rText.left += 32; rText.top += max(0, (cyItem - m_cyText) / 2); } else { rText.top += max(0, (cyItem - m_cyText) / 2); } COLORREF crText; CString strText; // Image information in the item data. int iImg = (int)lpDrawItemStruct->itemData; // If item selected, draw the highlight rectangle. // Or if item deselected, draw the rectangle using the window color. if ((lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { CBrush br(::GetSysColor(COLOR_HIGHLIGHT)); //CRect r(rcItem.left+10,rcItem.top,rcItem.right,rcItem.bottom); pDC->FillRect(&rClient, &br); } else if (!(lpDrawItemStruct->itemState & ODS_SELECTED) && (lpDrawItemStruct->itemAction & ODA_SELECT)) { CBrush br(::GetSysColor(COLOR_WINDOW)); //CRect r(rcItem.left+10,rcItem.top,rcItem.right,rcItem.bottom); pDC->FillRect(&rClient, &br); } // If the item has focus, draw the focus rect. // If the item does not have focus, erase the focus rect. if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && (lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&rcItem); } else if ((lpDrawItemStruct->itemAction & ODA_FOCUS) && !(lpDrawItemStruct->itemState & ODS_FOCUS)) { pDC->DrawFocusRect(&rcItem); } // To draw the Text set the background mode to Transparent. //lpDrawItemStruct->CtlID if (lpDrawItemStruct->itemState & ODS_SELECTED) crText = pDC->SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT)); else if (lpDrawItemStruct->itemState & ODS_DISABLED) crText = pDC->SetTextColor(::GetSysColor(COLOR_GRAYTEXT)); else crText = pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); // Get the item text. GetText(lpDrawItemStruct->itemID, strText); int iBkMode = pDC->SetBkMode(TRANSPARENT); // Setup the text format. UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER; if (GetStyle() & LBS_USETABSTOPS) nFormat |= DT_EXPANDTABS; // if the ImageList is Existing and there is an associated Image // for the Item, draw the Image. if(m_pImageList && (iImg != -1 )){ m_pImageList->Draw(pDC,iImg,Pt,ILD_NORMAL); CPen myPen; myPen.CreatePen(PS_SOLID,2,RGB(255,0,0)); pDC->SetROP2(R2_NOTXORPEN); CPen* oldPen=pDC->SelectObject(&myPen); pDC->Rectangle(Pt.x,Pt.y,Pt.x+32,Pt.y+32); pDC->SelectObject(oldPen); } //Draw the Text pDC->DrawText(strText, -1, &rText, nFormat | DT_CALCRECT); pDC->DrawText(strText, -1, &rText, nFormat); pDC->SetTextColor(crText); pDC->SetBkMode(iBkMode); } }