// // draw_label // int Component_Decorator_Impl::draw_label (Gdiplus::Graphics * g) { float height = (float)this->location_.height (); float px = static_cast <float> (this->location_.x_) + (this->location_.width () / 2.0f); float py = static_cast <float> (this->location_.y_) + (height + 15.0f); static const Gdiplus::Font font (L"Arial", 10); static const Gdiplus::SolidBrush brush (Gdiplus::Color (0, 0, 0)); Gdiplus::StringFormat format; format.SetAlignment (Gdiplus::StringAlignmentCenter); format.SetLineAlignment (Gdiplus::StringAlignmentCenter); CComBSTR bstr (this->label_.length (), this->label_.c_str ()); // Draw the label for the element. g->DrawString (bstr, this->label_.length (), &font, Gdiplus::PointF (px, py), &format, &brush); return 0; }
/** * Event: OnPaint * * Render the Notification Window */ LRESULT NotificationWindow::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { PAINTSTRUCT ps; BeginPaint(&ps); { MyGdiplusHelper gdi_plus_autostart; { // get draw area RECT clientRect; ::GetClientRect(m_hWnd, &clientRect); // create Gdiplus Graphics object Gdiplus::Graphics graphics(m_hWnd, FALSE); graphics.SetClip(Gdiplus::Rect(clientRect.left, clientRect.top, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top)); // draw a background Gdiplus::SolidBrush backgroundBrush(Gdiplus::Color(DEFAULT_ALPHA, 255, 255, 255)); graphics.FillRectangle(&backgroundBrush, clientRect.left, clientRect.top, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top); // shrink draw area int inset = 4; clientRect.left += inset; clientRect.top += inset; clientRect.right -= inset; clientRect.bottom -= inset; // whack a logo TODO //Bitmap* bitmap = new Bitmap(m_icon.c_str(), FALSE); int bitmapWidth = 0;//bitmap->GetWidth(); int bitmapHeight = 15;//bitmap->GetHeight(); //graphics->DrawImage(bitmap, clientRect.left, clientRect.top, //bitmapWidth, bitmapHeight); // draw a separator Gdiplus::Pen blackPen(Gdiplus::Color(0, 0, 0), 1.0f); graphics.DrawLine(&blackPen, clientRect.left, clientRect.top + bitmapHeight + inset, clientRect.right, clientRect.top + bitmapHeight + inset); // setup text properties Gdiplus::Font titleFont(L"Verdana", 10, Gdiplus::FontStyleBold); Gdiplus::Font textFont(L"Verdana", 10, Gdiplus::FontStyleRegular); Gdiplus::RectF titleRect((float)clientRect.left + inset + bitmapWidth, (float)clientRect.top, (float)clientRect.right, 20.0f); Gdiplus::RectF textRect((float)clientRect.left, (float)clientRect.top + bitmapHeight + (inset * 2), (float)clientRect.right, (float)clientRect.bottom - bitmapHeight - (inset * 2)); Gdiplus::StringFormat format; format.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); format.SetFormatFlags(Gdiplus::StringFormatFlagsLineLimit); Gdiplus::SolidBrush blackBrush(Gdiplus::Color(255, 0, 0, 0)); // draw the message graphics.DrawString(m_title.c_str(), (int)m_title.length(), &titleFont, titleRect, &format, &blackBrush); graphics.DrawString(m_message.c_str(), (int)m_message.length(), &textFont, textRect, &format, &blackBrush); } } EndPaint(&ps); bHandled = TRUE; return 0; }
bool CanvasGDIP::MeasureTextLinesW(const WCHAR* str, UINT strLen, const TextFormat& format, Gdiplus::RectF& rect, UINT& lines) { Gdiplus::StringFormat& stringFormat = ((TextFormatGDIP&)format).m_StringFormat; Gdiplus::StringFormat tStringFormat = Gdiplus::StringFormat::GenericTypographic(); // Set trimming and format temporarily. const Gdiplus::StringTrimming stringTrimming = stringFormat.GetTrimming(); stringFormat.SetTrimming(Gdiplus::StringTrimmingNone); const INT stringFormatFlags = stringFormat.GetFormatFlags(); stringFormat.SetFormatFlags(Gdiplus::StringFormatFlagsNoClip); if (m_AccurateText) { tStringFormat.SetTrimming(stringFormat.GetTrimming()); tStringFormat.SetFormatFlags(stringFormat.GetFormatFlags()); tStringFormat.SetAlignment(stringFormat.GetAlignment()); tStringFormat.SetLineAlignment(stringFormat.GetLineAlignment()); } INT linesFilled = 0; const Gdiplus::Status status = m_Graphics->MeasureString( str, (INT)strLen, ((TextFormatGDIP&)format).m_Font.get(), rect, m_AccurateText ? &tStringFormat : &stringFormat, &rect, nullptr, &linesFilled); lines = linesFilled; // Restore old options. stringFormat.SetTrimming(stringTrimming); stringFormat.SetFormatFlags(stringFormatFlags); return status == Gdiplus::Ok; }
void winbox::draw_text_lines() { if (m_lines.empty()) return; Gdiplus::SolidBrush brush(m_log_back_color); m_graphics->FillRectangle(&brush, m_log_box); Gdiplus::Font font(L"宋体", 12); Gdiplus::StringFormat format; format.SetAlignment(Gdiplus::StringAlignment::StringAlignmentNear); format.SetLineAlignment(Gdiplus::StringAlignment::StringAlignmentCenter); float line_pos = m_log_box.GetBottom(); float fontHeight = font.GetHeight(m_graphics) + 3; m_graphics->SetClip(m_log_box); for (auto it = m_lines.begin(); it != m_lines.end(); ++it) { if (line_pos < m_log_box.Y) { m_lines.erase(it, m_lines.end()); break; } Gdiplus::RectF rect(m_log_box.X, line_pos - fontHeight, m_log_box.Width, fontHeight); brush.SetColor(it->tp == log_type::err ? m_log_err_color : m_log_txt_color); m_graphics->DrawString(it->ws.c_str(), (int)it->ws.size(), &font, rect, &format, &brush); line_pos -= fontHeight; } m_graphics->ResetClip(); Gdiplus::Pen pen(m_log_edge_color); m_graphics->DrawRectangle(&pen, m_log_box); }
// sets the line's mWidth, mHeight, mAscent, mDescent, mLeading void Line::calcExtents() { #if defined( CINDER_MAC ) CFMutableAttributedStringRef attrStr = ::CFAttributedStringCreateMutable( kCFAllocatorDefault, 0 ); // Defer internal consistency-checking and coalescing until we're done building this thing ::CFAttributedStringBeginEditing( attrStr ); for( vector<Run>::const_iterator runIt = mRuns.begin(); runIt != mRuns.end(); ++runIt ) { // create and append this run's CFAttributedString ::CFAttributedStringRef runStr = cocoa::createCfAttributedString( runIt->mText, runIt->mFont, runIt->mColor ); ::CFAttributedStringReplaceAttributedString( attrStr, ::CFRangeMake( ::CFAttributedStringGetLength( attrStr ), 0 ), runStr ); ::CFRelease( runStr ); } // all done - coalesce ::CFAttributedStringEndEditing( attrStr ); mCTLineRef = ::CTLineCreateWithAttributedString( attrStr ); ::CFRelease( attrStr ); CGFloat ascentCG, descentCG, leadingCG; mWidth = ::CTLineGetTypographicBounds( mCTLineRef, &ascentCG, &descentCG, &leadingCG ); mAscent = ascentCG; mDescent = descentCG; mLeading = leadingCG; mHeight = 0; #elif defined( CINDER_MSW ) mHeight = mWidth = mAscent = mDescent = mLeading = 0; for( vector<Run>::iterator runIt = mRuns.begin(); runIt != mRuns.end(); ++runIt ) { Gdiplus::StringFormat format; format.SetAlignment( Gdiplus::StringAlignmentNear ); format.SetLineAlignment( Gdiplus::StringAlignmentNear ); Gdiplus::RectF sizeRect; const Gdiplus::Font *font = runIt->mFont.getGdiplusFont();; TextManager::instance()->getGraphics()->MeasureString( &runIt->mWideText[0], -1, font, Gdiplus::PointF( 0, 0 ), &format, &sizeRect ); runIt->mWidth = sizeRect.Width; runIt->mAscent = runIt->mFont.getAscent(); runIt->mDescent = runIt->mFont.getDescent(); runIt->mLeading = runIt->mFont.getLeading(); mWidth += sizeRect.Width; mAscent = std::max( runIt->mFont.getAscent(), mAscent ); mDescent = std::max( runIt->mFont.getDescent(), mDescent ); mLeading = std::max( runIt->mFont.getLeading(), mLeading ); mHeight = std::max( mHeight, sizeRect.Height ); } #endif mHeight = std::max( mHeight, mAscent + mDescent + mLeading ); }
void StringFormat::SetLineAlignment(StringAlignment sa) { Gdiplus::StringFormat* sf = reinterpret_cast<Gdiplus::StringFormat*>(_private); switch(sa) { case StringAlignmentNear: sf->SetLineAlignment(Gdiplus::StringAlignmentNear); break; case StringAlignmentFar: sf->SetLineAlignment(Gdiplus::StringAlignmentFar); break; case StringAlignmentCenter: sf->SetLineAlignment(Gdiplus::StringAlignmentCenter); break; } }
void CanvasGDIP::DrawTextW(const WCHAR* str, UINT strLen, const TextFormat& format, Gdiplus::RectF& rect, const Gdiplus::SolidBrush& brush) { Gdiplus::StringFormat& stringFormat = ((TextFormatGDIP&)format).m_StringFormat; Gdiplus::StringFormat tStringFormat = Gdiplus::StringFormat::GenericTypographic(); if (m_AccurateText) { tStringFormat.SetTrimming(stringFormat.GetTrimming()); tStringFormat.SetFormatFlags(stringFormat.GetFormatFlags()); tStringFormat.SetAlignment(stringFormat.GetAlignment()); tStringFormat.SetLineAlignment(stringFormat.GetLineAlignment()); } m_Graphics->DrawString( str, (INT)strLen, ((TextFormatGDIP&)format).m_Font.get(), rect, m_AccurateText ? &tStringFormat : &stringFormat, &brush); }
void cgGdiplusRender::DrawUIText( LPCTSTR lpctText, int nTextLen, const cgRectF& rect, cgID font, int space , cgColor color, int style ) { Gdiplus::RectF kDrawRect (rect.x, rect.y, rect.w, rect.h); Gdiplus::StringFormat kFormat; if (style&DT_CENTER) kFormat.SetAlignment(Gdiplus::StringAlignmentCenter); if (style&DT_VCENTER) kFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); Gdiplus::Font * pkFont = FindFont(font); Gdiplus::SolidBrush brush(Gdiplus::Color((Gdiplus::ARGB)color)); m_pkGraphics->DrawString(lpctText, nTextLen, pkFont, kDrawRect, &kFormat, &brush); }
void StringFormat::SetTrimming(StringTrimming st) { Gdiplus::StringFormat* sf = reinterpret_cast<Gdiplus::StringFormat*>(_private); switch(st) { case StringTrimmingNone: sf->SetTrimming(Gdiplus::StringTrimmingNone); break; case StringTrimmingCharacter: sf->SetTrimming(Gdiplus::StringTrimmingCharacter); break; case StringTrimmingWord: sf->SetTrimming(Gdiplus::StringTrimmingWord); break; case StringTrimmingEllipsisCharacter: sf->SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); break; case StringTrimmingEllipsisWord: sf->SetTrimming(Gdiplus::StringTrimmingEllipsisWord); break; case StringTrimmingEllipsisPath: sf->SetTrimming(Gdiplus::StringTrimmingEllipsisPath); break; } }
bool CanvasGDIP::MeasureTextW(const WCHAR* str, UINT strLen, const TextFormat& format, Gdiplus::RectF& rect) { Gdiplus::StringFormat& stringFormat = ((TextFormatGDIP&)format).m_StringFormat; Gdiplus::StringFormat tStringFormat = Gdiplus::StringFormat::GenericTypographic(); if (m_AccurateText) { tStringFormat.SetTrimming(stringFormat.GetTrimming()); tStringFormat.SetFormatFlags(stringFormat.GetFormatFlags()); tStringFormat.SetAlignment(stringFormat.GetAlignment()); tStringFormat.SetLineAlignment(stringFormat.GetLineAlignment()); } const Gdiplus::Status status = m_Graphics->MeasureString( str, (INT)strLen, ((TextFormatGDIP&)format).m_Font.get(), rect, m_AccurateText ? &tStringFormat : &stringFormat, &rect); return status == Gdiplus::Ok; }
void TextElement::DrawTextVector(RenderContext& ctx) { Gdiplus::RectF textrect; if (!RectFFromStyle(GetStyle(), textrect) || !m_font || m_text.empty()) return; ctx.pGraphics->SetSmoothingMode(Gdiplus::SmoothingModeHighQuality); Gdiplus::FontFamily family(L"Tahoma"); Gdiplus::StringFormat format; format.SetFormatFlags(Gdiplus::StringFormatFlagsLineLimit); format.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); Gdiplus::GraphicsPath path; path.AddString(m_text.c_str(), -1, &family, Gdiplus::FontStyleBold, 12, textrect, &format); Gdiplus::Pen pen(Gdiplus::Color(192, 0, 0, 0), 0.0); Gdiplus::SolidBrush brush(Gdiplus::Color(255, 255, 255, 255)); ctx.pGraphics->FillPath(&brush, &path); ctx.pGraphics->DrawPath(&pen, &path); }
/*! @brief イメージの取得 @param [in] pSelectItem 選択データ @param [out] bitmap イメージ */ BOOL CImageFontDlg::GetBitmapImage(LPVOID pSelectItem, CImage &bitmap) { CRect rect; GetClientRect(&rect); bitmap.Create(rect.Width(), rect.Height(), 32); HDC hDC = bitmap.GetDC(); Gdiplus::Graphics graphics(hDC); graphics.Clear((Gdiplus::ARGB)Gdiplus::Color::White); CString strMessage; strMessage = _T("1234567890\n"); strMessage += _T("abcdefghijklmnopqrstuvwxyz\n"); strMessage += _T("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"); strMessage += _T("あいおえおかきくけこさしすせそたちつてとなにぬねの\n"); strMessage += _T("はひふへほまみむめもやゆよらりるれろわをん\n"); LOGFONT *pLogfont = (LOGFONT *) pSelectItem; Gdiplus::Font font(hDC, pLogfont); Gdiplus::RectF drawLayout(0, 0, (Gdiplus::REAL)rect.Width(), (Gdiplus::REAL)rect.Height()); Gdiplus::StringFormat stringFormat; stringFormat.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); stringFormat.SetTrimming(Gdiplus::StringTrimmingNone); Gdiplus::SolidBrush brush((Gdiplus::ARGB)Gdiplus::Color::Black); graphics.SetTextRenderingHint((Gdiplus::TextRenderingHint) (GetSpaceKeyDownCount() % (int)Gdiplus::TextRenderingHintClearTypeGridFit)); graphics.DrawString(strMessage, -1, &font, drawLayout, &stringFormat,&brush); bitmap.ReleaseDC(); return TRUE; }
CSize CXTextGdiPlus::Measure( HDC dc, INT nWidthLimit ) { Gdiplus::Graphics graph(dc); graph.SetTextRenderingHint(m_Rendering); Gdiplus::FontFamily fontFamily(XLibST2W(m_strFontName)); Gdiplus::Font font(&fontFamily, m_nSize, m_FontStyle, Gdiplus::UnitPixel); Gdiplus::StringFormat stringformat; stringformat.SetAlignment(m_AlignmentH); stringformat.SetLineAlignment(m_AlignmentV == Gdiplus::StringAlignmentCenter ? Gdiplus::StringAlignmentNear : m_AlignmentV); stringformat.SetFormatFlags(m_FormatFlags); stringformat.SetTrimming(Gdiplus::StringTrimmingEllipsisWord); Gdiplus::SolidBrush brush(Gdiplus::Color(m_cAlpha, m_ColorR, m_ColorG, m_ColorB)); Gdiplus::RectF rfTargetRect(0, 0, nWidthLimit > 0 ? nWidthLimit : INFINITY, INFINITY); CStringW strTextToDraw(XLibST2W(m_strText)); Gdiplus::RectF rfBoundRect(0, 0, 0, 0); graph.MeasureString(strTextToDraw, -1, &font, rfTargetRect, &stringformat, &rfBoundRect); return CSize(ceil(rfBoundRect.Width), ceil(rfBoundRect.Height)); }
BOOL GdiplusUtilities::DrawTextOutline(Gdiplus::Graphics& graphics, LPCTSTR lpchText, int cchText, const RECT* lprc, UINT format, const LOGFONT& lf, COLORREF fill, COLORREF outline, INT outlineWidth, BOOL bCalcOnly /*= FALSE*/, RECT* rcCalc/* = NULL*/) { HDC hdc = graphics.GetHDC(); Gdiplus::Font font(hdc, &lf); graphics.ReleaseHDC(hdc); Gdiplus::StringFormat sFormat; if (format & DT_VCENTER) sFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); else if (format & DT_BOTTOM) sFormat.SetLineAlignment(Gdiplus::StringAlignmentFar); else sFormat.SetLineAlignment(Gdiplus::StringAlignmentNear); if (format & DT_CENTER) sFormat.SetAlignment(Gdiplus::StringAlignmentCenter); else if (format & DT_RIGHT) sFormat.SetAlignment(Gdiplus::StringAlignmentFar); else sFormat.SetAlignment(Gdiplus::StringAlignmentNear); Gdiplus::Rect rcForCalc; Gdiplus::Rect* pRCForCalc = &rcForCalc; if (rcCalc == NULL) pRCForCalc = NULL; if (DrawTextOutline(graphics, lpchText, cchText, RECT2GdiplusRect(*lprc), sFormat, font, COLORREF2Color(fill), COLORREF2Color(outline), outlineWidth, bCalcOnly, pRCForCalc)) { if (pRCForCalc != NULL) *rcCalc = GdiplusRect2RECT(*pRCForCalc); return TRUE; } return FALSE; }
void TextElement::DrawTextNormal(RenderContext& ctx) { Gdiplus::RectF textrect; if (!RectFFromStyle(GetStyle(), textrect) || !m_font || m_text.empty()) return; m_rect.X = textrect.X; m_rect.Y = textrect.Y; m_rect.Width = textrect.Width; m_rect.Height = textrect.Height; Gdiplus::Bitmap bmpTemp(textrect.Width, textrect.Height, PixelFormat32bppARGB); Gdiplus::Graphics gfxTemp(&bmpTemp); gfxTemp.Clear(Gdiplus::Color(255, 0, 0, 0)); Gdiplus::SolidBrush brush(Gdiplus::Color(255, 255, 255, 255)); Gdiplus::StringFormat format; format.SetFormatFlags(Gdiplus::StringFormatFlagsLineLimit); InitTextStyles(gfxTemp, format, GetStyle()); Gdiplus::RectF rect2(0, 0, textrect.Width, textrect.Height); gfxTemp.DrawString(m_text.c_str(), m_text.length(), m_font.get(), rect2, &format, &brush); Gdiplus::BitmapData bmpdataTemp; Gdiplus::Rect textrect2(0, 0, textrect.Width, textrect.Height); bmpTemp.LockBits(&textrect2, Gdiplus::ImageLockModeRead, bmpTemp.GetPixelFormat(), &bmpdataTemp); Gdiplus::PixelFormat pform = ctx.pBitmap->GetPixelFormat(); Gdiplus::BitmapData bmpdataCtx; Gdiplus::Rect textrect3(textrect.X, textrect.Y, textrect.Width, textrect.Height); ctx.pBitmap->LockBits(&textrect3, Gdiplus::ImageLockModeWrite | Gdiplus::ImageLockModeRead, ctx.pBitmap->GetPixelFormat(), &bmpdataCtx); // HACKHACK: blend the alpha channel manually (!!!) { #pragma pack(1) struct Pixel { unsigned char Blue; unsigned char Green; unsigned char Red; unsigned char Alpha; }; #pragma pack() Pixel* pBackground = (Pixel*)bmpdataCtx.Scan0; Pixel* pText = (Pixel*)bmpdataTemp.Scan0; for (UINT y = 0; y < bmpdataTemp.Height; y++) { for (UINT x = 0; x < bmpdataTemp.Width; x++) { UINT indexBG = y * (bmpdataCtx.Stride / sizeof(UINT)) + x; UINT indexText = y * (bmpdataTemp.Stride / sizeof(UINT)) + x; // if (pText[indexText].Red = 0xFF && pText[indexText].Blue == 0xFF && pText[indexText].Green == 0xFF) // pBackground[indexBG].Alpha = 255; pBackground[indexBG].Red = min(255, (UINT)pBackground[indexBG].Red + (UINT)pText[indexText].Red); pBackground[indexBG].Blue = min(255, (UINT)pBackground[indexBG].Blue + (UINT)pText[indexText].Blue); pBackground[indexBG].Green = min(255, (UINT)pBackground[indexBG].Green + (UINT)pText[indexText].Green); } } } ctx.pBitmap->UnlockBits(&bmpdataCtx); bmpTemp.UnlockBits(&bmpdataTemp); }
StringFormatFlags StringFormat::GetFormatFlags() const { Gdiplus::StringFormat* sf = reinterpret_cast<Gdiplus::StringFormat*>(_private); return sf->GetFormatFlags(); }
void StringFormat::SetFormatFlags(StringFormatFlags sf) { Gdiplus::StringFormat* gdiSf = reinterpret_cast<Gdiplus::StringFormat*>(_private); gdiSf->SetFormatFlags(sf); }
void CClipMonView::ReDrawBkBuffer() { if (!m_bUseBkBuffer) { return; } CSize szView = GetScrollViewSize(); if (szView.cx == 0 || szView.cy == 0) { return; } CRect rcClient; TxGetClientRect(rcClient); CRect rcViewShowBuffer(rcClient); rcViewShowBuffer.MoveToXY(0,0); rcViewShowBuffer.OffsetRect(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT)); CRect rcBk(0,0, m_szbmpBackBuffer.cx, m_szbmpBackBuffer.cy); rcBk = GetCenterRect(rcViewShowBuffer, rcBk); if (rcBk.left < 0) { rcBk.MoveToX(0); } if (rcBk.top < 0) { rcBk.MoveToY(0); } m_rcViewBkBuffer = rcBk; m_BkBufferlock.Lock(); ASSERT(m_pBmpBackBuffer != NULL); Graphics gc(m_pBmpBackBuffer); SolidBrush bkBrush(m_drawParam.bkColor); Rect rCet = CRect2Rect(CRect(0,0, rcBk.Width(), rcBk.Height())); gc.FillRectangle(&bkBrush, rCet); CRect rcView(0, 0, szView.cx, szView.cy); //calc In Bound Item int nBegin = (rcBk.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcBk.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); if (nCount == 0) { return; } CTxListHeader& headerCtrl = GetListHeader(); int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight)- rcBk.top; Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentCenter); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit|StringFormatFlagsNoWrap); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(0, nTopPos, rcBk.Width(), m_drawParam.nItemHeight); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); int nLeftPos = 0-rcBk.left; CRect rcItem(nLeftPos,nTopPos, 0, nTopPos + m_drawParam.nItemHeight); for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { if (rcItem.left > rcBk.right) { break; } rcItem.right = rcItem.left + headerCtrl.GetHeaderWidth(cIdx); if (rcItem.right >= rcBk.left) { ENUM_MONTYPE nMonType = (ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType); if (nMonType != MONTYPE_TIMEREMAIN) { CString strText = vData[i].GetValue(nMonType); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0x22000000,0,0,0,0,&fmt); } //draw separate line gc.DrawLine(&pen, rcItem.right-1, rcItem.top, rcItem.right-1, rcItem.bottom); } rcItem.OffsetRect(rcItem.Width(), 0); } gc.DrawLine(&pen, rcBk.left, rcItem.bottom-1, rcBk.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rRowBk.Offset(0, m_drawParam.nItemHeight); } m_BkBufferlock.Unlock(); }
void CSectionCon::OnPaint()/////////////////////// { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here // Do not call CRichEditCtrl::OnPaint() for painting messages Graphics gra(dc); CRect clientRect; CRect abstractRect; GetClientRect(clientRect); dc.FillSolidRect(clientRect, RGB(255, 255, 255)); Gdiplus::FontFamily ff(_T("微软雅黑")); Gdiplus::Font font(&ff,15,FontStyle::FontStyleUnderline|FontStyleBold); SolidBrush brush(Color(255,20, 10, 90)); Gdiplus::StringFormat sf; sf.SetTrimming(StringTrimmingEllipsisPath); sf.SetHotkeyPrefix(HotkeyPrefixHide);///////////////////选择'&'的处理 gra.SetTextRenderingHint(TextRenderingHint::TextRenderingHintSingleBitPerPixelGridFit); gra.DrawString(mtitle, mtitle.GetLength(), &font,RectF(20,0,clientRect.Width()-40,30),&sf,&brush);///////////////绘制标题 RectF titleRectF; gra.MeasureString(mtitle, mtitle.GetLength(), &font, RectF(20, 0, clientRect.Width() - 40, 30), &sf, &titleRectF); titleWidth=titleRectF.Width;////////////////计算标题的宽度 Gdiplus::Font font2(&ff, 10); SolidBrush brush2(Color(255,0,0,0)); gra.DrawString(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width() - 40, clientRect.Height() - 40), &sf, &brush2);/////////准备绘制摘要 //////////////////准备高亮关键字 int count=0; for (int i = 0;i < mabst.GetLength();i++) { i = mabst.Find('&', i); if (i == -1) break; count++; i++; } if (count > 30)///////////////////限制高亮个数,提升性能 count = 30; CharacterRange *cr=new CharacterRange[count]; for (int i = 0, j = 0;i < count;i++) { j = mabst.Find('&', j);///////////找到‘&’ cr[i].First = j + 1;//////找到高亮目标 j = j + 1; cr[i].Length = 1;///////////// } Region *region = new Region[count];////////////保存所有关键字所在的位置 sf.SetMeasurableCharacterRanges(count, cr); gra.MeasureCharacterRanges(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width() - 40, clientRect.Height() - 40), &sf, count, region); RectF rect;//////////关键字所在矩形位置 SolidBrush bru(Color(255, 100, 0));//////////高亮字体颜色 SolidBrush bru2(Color(255, 255, 255));/////////////删除色,用于删除原来的绘制的字 for (int i = 0;i < count;i++) { region[i].GetBounds(&rect, &gra); if (rect.X >= 20) { gra.FillRectangle(&bru2, rect); rect.X = rect.X - 3; gra.DrawString(mabst.Mid(cr[i].First), 1, &font2, rect, &sf, &bru); } } delete[] cr; delete[] region; //CharacterRange cr; //Region re;////////////关键字所在区域 //RectF rec;///////////////关键字所在的矩形区域 //SolidBrush bru(Color(255, 100, 0));//////////高亮字体颜色 //SolidBrush bru2(Color(255, 255, 255));/////////////删除色,用于删除原来的绘制的字 //for (int i = 0,j=0;i < count;i++)//////////////////////将每一个关键字高亮 //{ // j=mabst.Find('&', j); // cr.First = j+1; // j = j + 1; // cr.Length = 1; // sf.SetMeasurableCharacterRanges(1, &cr); // gra.MeasureCharacterRanges(mabst, mabst.GetLength(), &font2, RectF(20, 34, clientRect.Width()-40, clientRect.Height()-40), &sf, 1, &re); // re.GetBounds(&rec, &gra); // //rec.Width += 4; // gra.FillRectangle(&bru2,rec); // rec.X = rec.X - 3; // gra.DrawString(mabst.Mid(j), 1, &font2, rec, &sf, &bru); //} }
void CClipMonView::OnDraw( CDC *pDC) { CRect rcClient; TxGetClientRect(rcClient); Graphics gc(pDC->GetSafeHdc()); SolidBrush bkBrush(m_drawParam.bkColor); Rect rCet = CRect2Rect(rcClient); gc.FillRectangle(&bkBrush, rCet); CSize szView = GetScrollViewSize(); CRect rcView(0, 0, szView.cx, szView.cy); rcView.OffsetRect(rcClient.left, rcClient.top); if (rcView.IsRectEmpty()) { return; } rcView.OffsetRect(-GetScrollPos(SB_HORZ), -GetScrollPos(SB_VERT)); GraphicsContainer container = gc.BeginContainer(); Rect rClip = CRect2Rect(rcClient); gc.SetClip(rClip); if (m_bUseBkBuffer) { CRect rcBuffToDraw(0,0,rcClient.Width(), rcClient.Height()); rcBuffToDraw.OffsetRect(GetScrollPos(SB_HORZ), GetScrollPos(SB_VERT)); if (!IsInRect(rcBuffToDraw, m_rcViewBkBuffer)) { TRACE("\nbufferRedraw %d, %d", rcBuffToDraw.bottom, m_rcViewBkBuffer.bottom); ReDrawBkBuffer(); } //draw bkbuffer m_BkBufferlock.Lock(); rcBuffToDraw.OffsetRect(-m_rcViewBkBuffer.left, -m_rcViewBkBuffer.top); gc.DrawImage(m_pBmpBackBuffer, rClip, rcBuffToDraw.left, rcBuffToDraw.top, rcBuffToDraw.Width(), rcBuffToDraw.Height(), UnitPixel); m_BkBufferlock.Unlock(); } else { int nBegin = (rcClient.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcClient.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); CTxListHeader& headerCtrl = GetListHeader(); int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight); Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentNear); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(rcClient.left, nTopPos, rcClient.Width(), m_drawParam.nItemHeight); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); int nLeftPos = rcView.left; CRect rcItem(nLeftPos,nTopPos, 0, nTopPos + m_drawParam.nItemHeight); for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { if (rcItem.left > rcClient.right) { break; } rcItem.right = rcItem.left + headerCtrl.GetHeaderWidth(cIdx); if (rcItem.right >= rcClient.left) { CString strText = vData[i].GetValue((ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType)); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0xff000000,0,0,0,0,&fmt); //draw separate line gc.DrawLine(&pen, rcItem.right-1, rcItem.top, rcItem.right-1, rcItem.bottom); } rcItem.OffsetRect(rcItem.Width(), 0); } gc.DrawLine(&pen, rcClient.left, rcItem.bottom-1, rcClient.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rRowBk.Offset(0, m_drawParam.nItemHeight); } } //calc In Bound Item gc.EndContainer(container); ReDrawRemainTime(pDC); }
void CClipMonView::ReDrawRemainTime(CDC* pDC) { CRect rcClient; TxGetClientRect(rcClient); if (m_scBar[SB_VERT].IsShowing()) { rcClient.DeflateRect(0,0,m_scBar[SB_VERT].GetBarWidth(), 0); } if (m_scBar[SB_HORZ].IsShowing()) { rcClient.DeflateRect(0,0, 0, m_scBar[SB_HORZ].GetBarWidth()); } // Rect rCet = CRect2Rect(rcClient); // gc.FillRectangle(&bkBrush, rCet); CSize szView = GetScrollViewSize(); CRect rcView(0, 0, szView.cx, szView.cy); rcView.OffsetRect(rcClient.left, rcClient.top); if (rcView.IsRectEmpty()) { return; } rcView.OffsetRect(-GetScrollPos(SB_HORZ), -GetScrollPos(SB_VERT)); int nBegin = (rcClient.top - rcView.top) / m_drawParam.nItemHeight; int nCount = rcClient.Height() /m_drawParam.nItemHeight +1; VECTMPITEM vData; g_monDataMgr.GetRangeData(nBegin, nCount, vData); nCount = vData.size(); if (nCount <= 0) { return; } CTxListHeader& headerCtrl = GetListHeader(); int nLeftPos = rcView.left; int nRightPos = 0; for (int cIdx = 0; cIdx < m_ColSetting.m_vTmpCols.size(); cIdx++) { ENUM_MONTYPE nMonType = (ENUM_MONTYPE)(m_ColSetting.m_vTmpCols[cIdx].nPosInType); if (nMonType == MONTYPE_TIMEREMAIN) { nRightPos = nLeftPos + headerCtrl.GetHeaderWidth(cIdx); break; } else { nLeftPos += headerCtrl.GetHeaderWidth(cIdx); } } if (nRightPos < rcClient.left || nLeftPos > rcClient.right) { return; } CPoint ptOffSetBmp; int nTopPos = rcView.top + (nBegin * m_drawParam.nItemHeight); ptOffSetBmp.x = nLeftPos < 0? -nLeftPos:0; ptOffSetBmp.y = nTopPos < rcClient.top? rcClient.top - nTopPos: 0; CRect rcRemainTimeClient(nLeftPos, rcClient.top, nRightPos-1, rcClient.bottom); Graphics gc(m_pBmpRemainTime); SolidBrush bkBrush(m_drawParam.bkColor); GraphicsContainer container = gc.BeginContainer(); int nClipHeight = m_drawParam.nItemHeight*nCount; if (nClipHeight < rcClient.Height()) { nClipHeight = rcClient.Height(); } Rect rClip(0,0, rcRemainTimeClient.Width(), nClipHeight); gc.SetClip(rClip); Rect rDes(nLeftPos, nTopPos, rClip.Width, rClip.Height); gc.FillRectangle(&bkBrush, rClip); Gdiplus::StringFormat fmt; fmt.SetAlignment(StringAlignmentCenter); fmt.SetLineAlignment(StringAlignmentCenter); fmt.SetTrimming(StringTrimmingEllipsisCharacter); fmt.SetFormatFlags(StringFormatFlagsLineLimit); Pen pen(g_globalInfo.viewSetting.clrSeparateLine, 1.0); Rect rRowBk(0, 0, rcRemainTimeClient.Width(), m_drawParam.nItemHeight); CRect rcItem(0,0, rRowBk.Width,rRowBk.Height); for (int i = 0; i < nCount; i++) { ARGB clr = 0xff000000; ARGB clrBk = 0xffffffff; vData[i].GetMonColor(clr, clrBk); bkBrush.SetColor(clrBk); gc.FillRectangle(&bkBrush, rRowBk); CString strText = vData[i].GetValue(MONTYPE_TIMEREMAIN); GPDrawShadowTextSimple(gc, strText, rcItem, *m_drawParam.pFont, clr, 0, 2,2, &fmt); //GPDrawShadowText(gc, strText, rcItem, *m_drawParam.pFont, clr, 0xff000000,0,0,0,0,&fmt); gc.DrawLine(&pen, rcItem.left, rcItem.bottom-1, rcItem.right, rcItem.bottom-1); nTopPos += m_drawParam.nItemHeight; rcItem.OffsetRect(0, m_drawParam.nItemHeight); rRowBk.Offset(0, m_drawParam.nItemHeight); } gc.EndContainer(container); Graphics gcDes(pDC->GetSafeHdc()); CRect rcDesClip(rcRemainTimeClient); Rect rDesClip = CRect2Rect(rcDesClip); gcDes.SetClip(rDesClip); gcDes.DrawImage(m_pBmpRemainTime, rDesClip, ptOffSetBmp.x, ptOffSetBmp.y, (INT)rDesClip.Width, (INT)rDesClip.Height, UnitPixel); }
BOOL CXTextGdiPlus::RefreashBufferDC(HDC hDCSrc) { ReleaseBufferDC(); m_dcBuffer = ::CreateCompatibleDC(hDCSrc); m_hBufferOldBmp = ::SelectObject(m_dcBuffer, (HGDIOBJ)Util::CreateDIBSection32(m_rcDst.Width(), m_rcDst.Height())); Gdiplus::Graphics graph(m_dcBuffer); graph.SetTextRenderingHint(m_Rendering); Gdiplus::FontFamily fontFamily(XLibST2W(m_strFontName)); Gdiplus::Font font(&fontFamily, m_nSize, m_FontStyle, Gdiplus::UnitPixel); Gdiplus::StringFormat stringformat; stringformat.SetAlignment(m_AlignmentH); stringformat.SetLineAlignment(m_AlignmentV == Gdiplus::StringAlignmentCenter ? Gdiplus::StringAlignmentNear : m_AlignmentV); stringformat.SetFormatFlags(m_FormatFlags); stringformat.SetTrimming(Gdiplus::StringTrimmingEllipsisWord); Gdiplus::SolidBrush brush(Gdiplus::Color(m_cAlpha, m_ColorR, m_ColorG, m_ColorB)); Gdiplus::RectF rfTargetRect(0, 0, m_rcDst.Width(), m_rcDst.Height()); CStringW strTextToDraw(XLibST2W(m_strText)); // When centering texts vertically, gdi+ will put the texts a litter higher, // so we'll handle vertically centering ourselves. if (m_AlignmentV == Gdiplus::StringAlignmentCenter) { Gdiplus::RectF rfBoundRect(0, 0, 0, 0); graph.MeasureString(strTextToDraw, -1, &font, rfTargetRect, &stringformat, &rfBoundRect); UINT nBufferWidth = rfTargetRect.Width, nBufferHeight = ceil(rfBoundRect.Height); UINT32 *pBufferBmp = NULL; HDC dcBuffer = ::CreateCompatibleDC(m_dcBuffer); HGDIOBJ hOldBmp = ::SelectObject(dcBuffer, (HGDIOBJ)Util::CreateDIBSection32(nBufferWidth, nBufferHeight, (BYTE **)&pBufferBmp)); Gdiplus::Graphics graBuffer(dcBuffer); graBuffer.SetTextRenderingHint(m_Rendering); graBuffer.DrawString(strTextToDraw, -1, &font, rfTargetRect, &stringformat, &brush); CRect rcStrictBound(0, 0, nBufferWidth, nBufferHeight); BOOL bTopFound = FALSE, bBottomFound = FALSE; for (UINT line = 0; line < nBufferHeight; line++) { for (UINT col = 0; col < nBufferWidth; col++) { // bottom bits. if (!bBottomFound && *(pBufferBmp + line * nBufferWidth + col) != 0) { bBottomFound = TRUE; rcStrictBound.bottom -= line; } // top bits. if (!bTopFound && *(pBufferBmp + (nBufferHeight - line - 1) * nBufferWidth + col) != 0) { bTopFound = TRUE; rcStrictBound.top += line; } if (bBottomFound && bTopFound) break; } if (bBottomFound && bTopFound) break; } CRect rcTarget(0, (m_rcDst.Height() - rcStrictBound.Height()) / 2, 0, 0); rcTarget.right = rcTarget.left + rcStrictBound.Width(); rcTarget.bottom = rcTarget.top + rcStrictBound.Height(); Util::BitBlt(dcBuffer, rcStrictBound, m_dcBuffer, rcTarget); ::DeleteObject(::SelectObject(dcBuffer, hOldBmp)); ::DeleteDC(dcBuffer); } else graph.DrawString(strTextToDraw, -1, &font, rfTargetRect, &stringformat, &brush); return TRUE; }
void CSimplePanelDlg::DrawBk() { CDC* pDC = GetDC(); CRect rc; GetClientRect(&rc); int nHeight = m_pImLineBK->GetHeight(); int nWidth = m_pImLineBK->GetWidth(); CEsayMemDC* pmemDC = new CEsayMemDC(*pDC, rc); Gdiplus::Color cl = Gdiplus::Color::White; Gdiplus::SolidBrush brush(cl); Gdiplus::Graphics gr(pmemDC->GetDC()); gr.FillRectangle(&brush, rc.left, rc.top, rc.Width(), rc.Height()); //顶部文字 Gdiplus::SolidBrush brushBkWord(Gdiplus::Color(149,158,168)); std::wstring str = L"第一辆车"; Gdiplus::PointF pointFBkWord(60+nWidth, 0); Gdiplus::RectF rectBkWord(pointFBkWord, Gdiplus::SizeF(145, 46)); Gdiplus::Font fontBkWord(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatBkWord; stringFormatBkWord.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatBkWord.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(str.c_str(), str.size(), &fontBkWord, rectBkWord, &stringFormatBkWord, &brushBkWord); str = L"第二辆车"; pointFBkWord.X = 60 + nWidth + 145; rectBkWord.X = pointFBkWord.X; gr.DrawString(str.c_str(), str.size(), &fontBkWord, rectBkWord, &stringFormatBkWord, &brushBkWord); str = L"第一辆车"; pointFBkWord.X = 60 + nWidth*2 + 145 * 2+ 100 + 10; rectBkWord.X = pointFBkWord.X; gr.DrawString(str.c_str(), str.size(), &fontBkWord, rectBkWord, &stringFormatBkWord, &brushBkWord); str = L"第二辆车"; pointFBkWord.X = 60 + nWidth * 2 + 145 * 3+ 100 + 10; rectBkWord.X = pointFBkWord.X; gr.DrawString(str.c_str(), str.size(), &fontBkWord, rectBkWord, &stringFormatBkWord, &brushBkWord); //底部分割线 Gdiplus::SolidBrush brushLine(Gdiplus::Color(215, 215, 215)); Gdiplus::Pen penLine(&brushLine, 1); gr.DrawLine(&penLine, Gdiplus::Point(rc.left, rc.bottom-1), Gdiplus::Point(rc.right, rc.bottom-1)); //中间竖线 Gdiplus::SolidBrush brushLineM(Gdiplus::Color(215, 215, 215)); Gdiplus::Pen penLineM(&brushLineM, 2); gr.DrawLine(&penLineM, Gdiplus::Point(541, rc.top + 46), Gdiplus::Point(541, rc.top + nHeight*3 + 64)); pmemDC->BltMem(*pDC); delete pmemDC; ReleaseDC(pDC); }
BOOL CBSObject::DrawText(HDC hDC, const LPRECT lpRect, const CString& strText, HFONT hFont, COLORREF clrText, UINT uiFormat) { BOOL bResult = FALSE; #ifdef OSK HFONT hFontOld = (HFONT)::SelectObject(hDC, hFont); COLORREF clrTextOld = ::SetTextColor(hDC, clrText); int nBkModeOld = ::SetBkMode(hDC, TRANSPARENT); if (::DrawText(hDC, strText, strText.GetLength(), lpRect, uiFormat)) { bResult = TRUE; } if (hFontOld) { ::SelectObject(hDC, hFontOld); } ::SetTextColor(hDC, clrTextOld); ::SetBkMode(hDC, nBkModeOld); #else Gdiplus::Graphics graphics(hDC); Gdiplus::SolidBrush brush(Gdiplus::Color(255, GetRValue(clrText), GetGValue(clrText), GetBValue(clrText))); Gdiplus::Font font(hDC, hFont); Gdiplus::RectF rect(lpRect->left, lpRect->top, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top); graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintClearTypeGridFit); Gdiplus::StringFormat strformat; if (uiFormat & DT_TOP) { strformat.SetLineAlignment(Gdiplus::StringAlignmentNear); } if (uiFormat & DT_VCENTER) { strformat.SetLineAlignment(Gdiplus::StringAlignmentCenter); } if (uiFormat & DT_BOTTOM) { strformat.SetLineAlignment(Gdiplus::StringAlignmentFar); } if (uiFormat & DT_LEFT) { strformat.SetAlignment(Gdiplus::StringAlignmentNear); } if (uiFormat & DT_CENTER) { strformat.SetAlignment(Gdiplus::StringAlignmentCenter); } if (uiFormat & DT_RIGHT) { strformat.SetAlignment(Gdiplus::StringAlignmentFar); } if ((uiFormat & DT_WORDBREAK) == 0) { strformat.SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap); } if (uiFormat & DT_SINGLELINE) { } if (uiFormat & DT_WORD_ELLIPSIS) { strformat.SetTrimming(Gdiplus::StringTrimmingEllipsisCharacter); } if (uiFormat & DT_NOCLIP) { strformat.SetFormatFlags(Gdiplus::StringFormatFlagsNoClip); } graphics.DrawString(strText, -1, &font, rect, &strformat, &brush); #endif return bResult; }
void CSimplePanelDlg::DrawArrive(Gdiplus::Graphics& gr, vector<BusArrivalInfo>& vecArrival, CRect& rc, CData* pData) { //每次先刷新背景 Gdiplus::Color cl = Gdiplus::Color::White; Gdiplus::SolidBrush brush(cl); gr.FillRectangle(&brush, 0, 0, rc.Width(), rc.Height()); //显示线路号背景 Gdiplus::PointF pointLineBK(60, 0); gr.DrawImage(m_pImLineBK, pointLineBK); int nWidth = m_pImLineBK->GetWidth(); int nHeight = m_pImLineBK->GetHeight(); //显示线路号 CString strLineNum = pData->GetLineNumber(); Gdiplus::SolidBrush brushLineNum(Gdiplus::Color::White); WCHAR wcLineNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strLineNum, strLineNum.GetLength(), wcLineNum, sizeof(wcLineNum)); Gdiplus::PointF pointLineNum = pointLineBK; Gdiplus::RectF rectLineNum(pointLineNum, Gdiplus::SizeF(nWidth, nHeight)); Gdiplus::Font fontLineNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatLineNum; stringFormatLineNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatLineNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcLineNum, wcslen(wcLineNum), &fontLineNum, rectLineNum, &stringFormatLineNum, &brushLineNum); //显示路 std::wstring str = L"路"; Gdiplus::SolidBrush brushLu(Gdiplus::Color::White); Gdiplus::PointF pointWord = pointLineBK; pointWord.X += 0.75 * nWidth; Gdiplus::RectF rectWord(pointWord, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontLu(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatWord; stringFormatWord.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatWord.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(str.c_str(), str.size(), &fontLu, rectWord, &stringFormatWord, &brushLu); if(0 < vecArrival.size()) { //显示第一辆车到站 BusArrivalInfo& stArrive = vecArrival[0]; if(stArrive.iNum > 0) { //距离站 CString strNum; strNum.Format("%d", stArrive.iNum); Gdiplus::SolidBrush brushNum(Gdiplus::Color(23,117,231)); WCHAR wcNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strNum, strNum.GetLength(), wcNum, sizeof(wcNum)); Gdiplus::PointF pointNum(60 + nWidth, 0); Gdiplus::RectF rectNum(pointNum, Gdiplus::SizeF(145, nHeight)); Gdiplus::Font fontNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatNum; stringFormatNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcNum, wcslen(wcNum), &fontNum, rectNum, &stringFormatNum, &brushNum); std::wstring wstr = L"站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(149,158,168)); Gdiplus::PointF pointZhan(60 + nWidth + 145 - 32, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } else if(stArrive.iNum == 0) { if(stArrive.iDistance <= 50) { std::wstring wstr = L"已经进站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } else { std::wstring wstr = L"即将到站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } } } else { std::wstring wstr = L"待发"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } if(1 < vecArrival.size()) { //显示第二辆车到站 BusArrivalInfo& stArrive = vecArrival[1]; if(stArrive.iNum > 0) { //距离站 CString strNum; strNum.Format("%d", stArrive.iNum); Gdiplus::SolidBrush brushNum(Gdiplus::Color(23,117,231)); WCHAR wcNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strNum, strNum.GetLength(), wcNum, sizeof(wcNum)); Gdiplus::PointF pointNum(60 + nWidth + 145, 0); Gdiplus::RectF rectNum(pointNum, Gdiplus::SizeF(145, nHeight)); Gdiplus::Font fontNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatNum; stringFormatNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcNum, wcslen(wcNum), &fontNum, rectNum, &stringFormatNum, &brushNum); std::wstring wstr = L"站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(149,158,168)); Gdiplus::PointF pointZhan(60 + nWidth + 145 + 145 - 32, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } else if(stArrive.iNum == 0) { if(stArrive.iDistance <= 50) { std::wstring wstr = L"已经进站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth + 145, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } else { std::wstring wstr = L"即将到站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth + 145, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } } } else { std::wstring wstr = L"待发"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(23,117,231)); Gdiplus::PointF pointZhan(60 + nWidth + 145, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(145, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentFar); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } }
void CSimplePanelDlg::DrawEmpty(Gdiplus::Graphics& gr, CRect& rc) { //每次先刷新背景 Gdiplus::Color cl = Gdiplus::Color::White; Gdiplus::SolidBrush brush(cl); gr.FillRectangle(&brush, 0, 0, rc.Width(), rc.Height()); //显示线路号背景 Gdiplus::PointF pointLineBK(60, 0); gr.DrawImage(m_pImLineBK, pointLineBK); int nWidth = m_pImLineBK->GetWidth(); int nHeight = m_pImLineBK->GetHeight(); //显示-- CString strLineNum = "--"; Gdiplus::SolidBrush brushLineNum(Gdiplus::Color::White); WCHAR wcLineNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strLineNum, strLineNum.GetLength(), wcLineNum, sizeof(wcLineNum)); Gdiplus::PointF pointLineNum = pointLineBK; Gdiplus::RectF rectLineNum(pointLineNum, Gdiplus::SizeF(nWidth, nHeight)); Gdiplus::Font fontLineNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatLineNum; stringFormatLineNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatLineNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcLineNum, wcslen(wcLineNum), &fontLineNum, rectLineNum, &stringFormatLineNum, &brushLineNum); //显示路 std::wstring str = L"路"; Gdiplus::SolidBrush brushLu(Gdiplus::Color::White); Gdiplus::PointF pointWord = pointLineBK; pointWord.X += 0.75 * nWidth; Gdiplus::RectF rectWord(pointWord, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontLu(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatWord; stringFormatWord.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatWord.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(str.c_str(), str.size(), &fontLu, rectWord, &stringFormatWord, &brushLu); //第一辆车距离站 if(1) { CString strNum = "- -"; Gdiplus::SolidBrush brushNum(Gdiplus::Color(149,158,168)); WCHAR wcNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strNum, strNum.GetLength(), wcNum, sizeof(wcNum)); Gdiplus::PointF pointNum(60 + nWidth, 0); Gdiplus::RectF rectNum(pointNum, Gdiplus::SizeF(145, nHeight)); Gdiplus::Font fontNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatNum; stringFormatNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcNum, wcslen(wcNum), &fontNum, rectNum, &stringFormatNum, &brushNum); std::wstring wstr = L"站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(149,158,168)); Gdiplus::PointF pointZhan(60 + nWidth + 0.7 * 145, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } if(1) { //第二辆车距离站 CString strNum = "- -"; Gdiplus::SolidBrush brushNum(Gdiplus::Color(149,158,168)); WCHAR wcNum[6] = {0}; MultiByteToWideChar(CP_ACP, 0, (char*)(LPCTSTR)strNum, strNum.GetLength(), wcNum, sizeof(wcNum)); Gdiplus::PointF pointNum(60 + nWidth + 145, 0); Gdiplus::RectF rectNum(pointNum, Gdiplus::SizeF(145, nHeight)); Gdiplus::Font fontNum(L"helvetica", 42 , Gdiplus::FontStyleBold, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatNum; stringFormatNum.SetAlignment(Gdiplus::StringAlignmentCenter); stringFormatNum.SetLineAlignment(Gdiplus::StringAlignmentCenter); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wcNum, wcslen(wcNum), &fontNum, rectNum, &stringFormatNum, &brushNum); std::wstring wstr = L"站"; Gdiplus::SolidBrush brushZhan(Gdiplus::Color(149,158,168)); Gdiplus::PointF pointZhan(60 + nWidth + 0.7 * 145 + 145, 0); Gdiplus::RectF rectZhan(pointZhan, Gdiplus::SizeF(40, nHeight - 5)); Gdiplus::Font fontZhan(L"方正兰亭黑简体", 24 , Gdiplus::FontStyleRegular, Gdiplus::UnitPixel); Gdiplus::StringFormat stringFormatZhan; stringFormatZhan.SetAlignment(Gdiplus::StringAlignmentNear); stringFormatZhan.SetLineAlignment(Gdiplus::StringAlignmentFar); gr.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias); gr.DrawString(wstr.c_str(), wstr.size(), &fontZhan, rectZhan, &stringFormatZhan, &brushZhan); } }
void InitTextStyles(Gdiplus::Graphics& gfx, Gdiplus::StringFormat& format, const Style& style) { gfx.SetTextRenderingHint(AntialiasingFromStyleString(style.Get(L"antialiasing", L"default"))); format.SetTrimming(StringTrimmingFromStyleString(style.Get(L"trimming", L"default"))); }
void OnPaint(HDC hdc) { Graphics g(hdc); gOffScreenGraphics->Clear(Color::White); Gdiplus::SolidBrush* redBrush = new Gdiplus::SolidBrush(Gdiplus::Color::Red); gOffScreenGraphics->FillRectangle(redBrush, (150 + (20 * showJoystickId)), 40, 20, 12); delete redBrush; Gdiplus::Font fontJoyState(L"MS ゴシック", 9); Gdiplus::Font fontJoyCaps(L"MS ゴシック", 12); Gdiplus::Font fontJoyInfoEx(L"MS ゴシック", 30); Gdiplus::SolidBrush blackBrush(Color(255, 0, 0, 0)); Gdiplus::StringFormat format; format.SetAlignment(StringAlignmentNear); Gdiplus::StringFormat formatState; formatState.SetAlignment(StringAlignmentNear); REAL* tabMargins = (REAL*) malloc(sizeof(REAL) * (joyGetNumDevs() + 1)); tabMargins[0] = 150; for (unsigned int i = 1; i < joyGetNumDevs() + 1; i++) { tabMargins[i] = 20; } formatState.SetTabStops(0, (joyGetNumDevs() + 1), tabMargins); free(tabMargins); gOffScreenGraphics->DrawString( joyStateString.ToString().c_str(), -1, &fontJoyState, RectF(0.0f, 0.0f, (float)GetSystemMetrics(SM_CXSCREEN) / 2, (float)GetSystemMetrics(SM_CYSCREEN)), &format, &blackBrush); basic_stringstream<TCHAR> stream; stream << _T("表示JoystickID:") << showJoystickId; gOffScreenGraphics->DrawString( stream.str().c_str(), -1, &fontJoyState, RectF(0.0f, 24.0f, (float)GetSystemMetrics(SM_CXSCREEN) / 2, (float)GetSystemMetrics(SM_CYSCREEN)), &format, &blackBrush); gOffScreenGraphics->DrawString( joyStateString.ToStateTabSplitString().c_str(), -1, &fontJoyState, RectF(0.0f, 40.0f, (float)GetSystemMetrics(SM_CXSCREEN) / 2, (float)GetSystemMetrics(SM_CYSCREEN)), &formatState, &blackBrush); gOffScreenGraphics->DrawString( joyCapsString.ToString(&joyCaps).c_str(), -1, &fontJoyCaps, RectF(0.0f, 100.0f, (float)GetSystemMetrics(SM_CXSCREEN) / 2, (float)GetSystemMetrics(SM_CYSCREEN)), &format, &blackBrush); gOffScreenGraphics->DrawString( joyInfoExString.ToString(&joyInfoEx).c_str(), -1, &fontJoyInfoEx, RectF((float)GetSystemMetrics(SM_CXSCREEN) / 2, 100.0f, (float)GetSystemMetrics(SM_CXSCREEN) / 2, (float)GetSystemMetrics(SM_CYSCREEN)), &format, &blackBrush); g.DrawImage(gOffScreenBitmap, 0, 0); return; }