[GDIPlus] Gdiplus::Graphics::RotateTransform => std::wstring ...
-
bool Bar::draw(Gdiplus::Graphics* graphics) { if (graphics == NULL) return false; Gdiplus::SolidBrush brush_bar(Gdiplus::Color(173, 222, 107)); Gdiplus::SolidBrush brush_caption(Gdiplus::Color(0, 0, 0)); LONG bar_width = min(static_cast<LONG>((m_rect.right - m_rect.left - m_items.size() * 2) / m_items.size()), 20); for (std::size_t bar = 0; bar < m_items.size(); ++bar) { LONG height = ((m_rect.bottom - m_rect.top) / 100) * m_items[bar].first; Gdiplus::RectF rect(static_cast<Gdiplus::REAL>(m_rect.left + static_cast<LONG>(bar) * (bar_width + 2)), static_cast<Gdiplus::REAL>(m_rect.bottom - height), static_cast<Gdiplus::REAL>(bar_width + 2), static_cast<Gdiplus::REAL>(height)); graphics->FillRectangle(&brush_bar, rect); } return true; }... so diesmal gibt es erst Code

Das ganze ist eine Zeichenfunktion für ein Säulendiagramm. Soweit so gut. Jetzt will ich aber auf die einzellnen Säulen auch noch nen Text schreiben ... gehe ich jetzt aber hin und rufe RotateTransform auf, schreibe den Text, rufe wieder RotateTransform auf, erscheint der TExt nicht, aber die Säulen haben auf einmal nen komischen abstand von einandern ?! Jemand ne Idee warum? Oder wie zeichnen ihr einen gedrehten String?
-
Wie? Keiner ne Idee?
Kommt schon 
-
Hm was zeichnest Du denn jetzt also erstes ? Doch den Säulen-Hintergrund, oder?
Zeig mal den Code, wo Du den Text zeichnest.
-
bool Bar::draw(Gdiplus::Graphics* graphics) { if (graphics == NULL) return false; Gdiplus::SolidBrush brush_bar(Gdiplus::Color(173, 222, 107)); Gdiplus::SolidBrush brush_caption(Gdiplus::Color(0, 0, 0)); Gdiplus::StringFormat stringFormat; stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); LONG bar_width = min(static_cast<LONG>((m_rect.right - m_rect.left - m_items.size() * 2) / m_items.size()), 20); for (std::size_t bar = 0; bar < m_items.size(); ++bar) { LONG height = ((m_rect.bottom - m_rect.top) / 100) * m_items[bar].first; Gdiplus::RectF rect(static_cast<Gdiplus::REAL>(m_rect.left + static_cast<LONG>(bar) * (bar_width + 2)), static_cast<Gdiplus::REAL>(m_rect.bottom - height), static_cast<Gdiplus::REAL>(bar_width + 2), static_cast<Gdiplus::REAL>(height)); graphics->FillRectangle(&brush_bar, rect); graphics->DrawString(m_items[bar].second.c_str(), -1, &m_fontControl, rect, &stringFormat, &brush_caption); } return true; }ohne Rotation ... klappt.
mit Rotation:
bool Bar::draw(Gdiplus::Graphics* graphics) { if (graphics == NULL) return false; Gdiplus::SolidBrush brush_bar(Gdiplus::Color(173, 222, 107)); Gdiplus::SolidBrush brush_caption(Gdiplus::Color(0, 0, 0)); Gdiplus::StringFormat stringFormat; stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); LONG bar_width = min(static_cast<LONG>((m_rect.right - m_rect.left - m_items.size() * 2) / m_items.size()), 20); for (std::size_t bar = 0; bar < m_items.size(); ++bar) { LONG height = ((m_rect.bottom - m_rect.top) / 100) * m_items[bar].first; Gdiplus::RectF rect(static_cast<Gdiplus::REAL>(m_rect.left + static_cast<LONG>(bar) * (bar_width + 2)), static_cast<Gdiplus::REAL>(m_rect.bottom - height), static_cast<Gdiplus::REAL>(bar_width + 2), static_cast<Gdiplus::REAL>(height)); graphics->FillRectangle(&brush_bar, rect); graphics->RotateTransform(90.0f, Gdiplus::MatrixOrderAppend); graphics->DrawString(m_items[bar].second.c_str(), -1, &m_fontControl, rect, &stringFormat, &brush_caption); graphics->RotateTransform(90.0f, Gdiplus::MatrixOrderPrepend); } return true; }klappt nicht ... muss ich erst TranslateTransform aufrufen?
-
Joar, würd ich sagen, ... erst rotieren (RotateTransform) dann TranslateTransform.
-
Öhm du weißt aber schon was TranslateTransform tut? Glaub hab dich reingelegt
Nja hat jemand eine Idee?
-
lol...ne war schon erst gemeint...siehe... (das Beispiel): http://msdn2.microsoft.com/en-us/library/ms535820.aspx
Aber vllt hilft Dir das noch weiter (ist aber leider VB): http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=103219&SiteID=1 (Habs mir aber nit komplett durchgelesen :p )
-
bool Bar::draw(Gdiplus::Graphics* graphics) { if (graphics == NULL) return false; Gdiplus::SolidBrush brush_bar(Gdiplus::Color(173, 222, 107)); Gdiplus::SolidBrush brush_caption(Gdiplus::Color(122, 160, 84)); Gdiplus::StringFormat stringFormat; stringFormat.SetAlignment(Gdiplus::StringAlignmentNear); stringFormat.SetLineAlignment(Gdiplus::StringAlignmentCenter); LONG bar_width = min(static_cast<LONG>((m_rect.right - m_rect.left - m_items.size() * 2) / m_items.size()), 20); for (std::size_t bar = 0; bar < m_items.size(); ++bar) { LONG height = ((m_rect.bottom - m_rect.top) / 100) * m_items[bar].first; Gdiplus::RectF rect(static_cast<Gdiplus::REAL>(m_rect.left + static_cast<LONG>(bar) * (bar_width + 2)), static_cast<Gdiplus::REAL>(m_rect.bottom - height), static_cast<Gdiplus::REAL>(bar_width + 2), static_cast<Gdiplus::REAL>(height)); graphics->FillRectangle(&brush_bar, rect); graphics->TranslateTransform(static_cast<Gdiplus::REAL>(m_rect.left + static_cast<LONG>(bar) * (bar_width + 2) + (bar_width + 2)), static_cast<Gdiplus::REAL>(m_rect.bottom - height + height - m_items[bar].second.second)); graphics->RotateTransform(90.0f); graphics->DrawString(m_items[bar].second.first.c_str(), -1, &m_fontControl, Gdiplus::PointF(0.0f, 0.0f), &brush_caption); graphics->ResetTransform(); } return true; }... ist zwar falsch herum ... aber nja
