Re: GDI+ AddString - problem z tekstem
Napisane: środa, 15 listopada 2017, 13:50
polymorphism napisał(a):Szczerze mówiąc ciężko mi uwierzyć, żeby inny zapis tego samego może powodować aż takie różnice w działaniu.
Mnie również, dlatego zacząłem ten wątek.
Ogólnie niby wszystko jest OK, a jednak całość bardzo "krucha". Staram się pomału optymalizować kod i odkrywam cały czas coś nowego.
A to np. jeśli wyświetlę sobie jakąś wiadomość w środku kodu ... ShowMessage("Funkcja zwróciła dane"); ..... to po wywołaniu
aGraphics.DrawPath(&brush, &path);, w dalszej części kodu .... funkcja zwraca "InvalidParameter" ... ... bez "ShowMessage" działa za każdym razem.
Albo samo wyświetlenie tekstu. Jak pisałem wcześniej, AddPath + DrawPath, nie wyświetlają nic, jeżeli używam jako ciągu znaków "Memo->Lines->Strings[0]", ale nie ma problemu kiedy użyję Memo->Text.. Kiedy napisałem funkcję wyświetlającą tekst:
KOD cpp: UKRYJ
bool gdiDrawString(wchar_t *text, HDC hDC,
Gdiplus::FontFamily *fontFamily,
Gdiplus::StringFormat *stringFormat,
Gdiplus::FontStyle fontStyle,
Gdiplus::Rect rect,
Gdiplus::Color fillColor,
REAL pWidth,
int fontSize,
String &error)
{
using namespace Gdiplus;
Status status;
Gdiplus::Graphics *pGraphics = new Gdiplus::Graphics(hDC);
Gdiplus::GraphicsPath path;
Gdiplus::SolidBrush fillBrush(fillColor);
Gdiplus::Pen pen(Gdiplus::Color(255,0,0,0), pWidth); // Gdiplus::Color(255,0,0,0)
pen.SetLineJoin(LineJoinRound);
pGraphics->SetSmoothingMode( Gdiplus::SmoothingModeAntiAlias );
pGraphics->SetInterpolationMode(InterpolationModeHighQualityBicubic);
status = path.AddString(text, -1, fontFamily, fontStyle, fontSize, rect, stringFormat);
if(status != Gdiplus::Ok)
{
error = "AddString." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
status = pGraphics->DrawPath(&pen, &path);
if(status != Gdiplus::Ok)
{
error = "DrawPath." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
status = pGraphics->FillPath(&fillBrush, &path);
if(status != Gdiplus::Ok)
{
error = "FillPath." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
else
error = gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return (status == Gdiplus::Ok);
}
Gdiplus::FontFamily *fontFamily,
Gdiplus::StringFormat *stringFormat,
Gdiplus::FontStyle fontStyle,
Gdiplus::Rect rect,
Gdiplus::Color fillColor,
REAL pWidth,
int fontSize,
String &error)
{
using namespace Gdiplus;
Status status;
Gdiplus::Graphics *pGraphics = new Gdiplus::Graphics(hDC);
Gdiplus::GraphicsPath path;
Gdiplus::SolidBrush fillBrush(fillColor);
Gdiplus::Pen pen(Gdiplus::Color(255,0,0,0), pWidth); // Gdiplus::Color(255,0,0,0)
pen.SetLineJoin(LineJoinRound);
pGraphics->SetSmoothingMode( Gdiplus::SmoothingModeAntiAlias );
pGraphics->SetInterpolationMode(InterpolationModeHighQualityBicubic);
status = path.AddString(text, -1, fontFamily, fontStyle, fontSize, rect, stringFormat);
if(status != Gdiplus::Ok)
{
error = "AddString." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
status = pGraphics->DrawPath(&pen, &path);
if(status != Gdiplus::Ok)
{
error = "DrawPath." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
status = pGraphics->FillPath(&fillBrush, &path);
if(status != Gdiplus::Ok)
{
error = "FillPath." + gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return false;
}
else
error = gdiGetErrorString(static_cast<int>(status));
pGraphics->ReleaseHDC(hDC);
delete pGraphics;
return (status == Gdiplus::Ok);
}
Wyświetla mi wszystko co tylko wyślę jako text, .....
Ale ... kiedy napisałem funkcję do obliczania wielkości ciągu znaków, w zależności od czcionki, stylu i rozmiaru, wysyłając, jak wyżej, HDC jako parametr, to w zamian otrzymałem RectF(0,0,0,0), natomiast, kiedy parametrem jest Gdiplus::Grahics, to wszystko gra i trąbi.
KOD cpp: UKRYJ
bool gdiMeasureString(wchar_t *text,
Gdiplus::Graphics *pGraphics,
Gdiplus::RectF &rect,
Gdiplus::FontFamily *fontFamily,
REAL fontSize,
Gdiplus::FontStyle fontStyle,
String &error)
{
Status status;
Gdiplus::PointF origin(0.0f, 0.0f);
Gdiplus::Font font(fontFamily, fontSize, fontStyle, Gdiplus::UnitPixel);
status = pGraphics->MeasureString(text, -1, &font, origin, &rect);
error = gdiGetErrorString(static_cast<int>(status));
return (status == Gdiplus::Ok);
}
Gdiplus::Graphics *pGraphics,
Gdiplus::RectF &rect,
Gdiplus::FontFamily *fontFamily,
REAL fontSize,
Gdiplus::FontStyle fontStyle,
String &error)
{
Status status;
Gdiplus::PointF origin(0.0f, 0.0f);
Gdiplus::Font font(fontFamily, fontSize, fontStyle, Gdiplus::UnitPixel);
status = pGraphics->MeasureString(text, -1, &font, origin, &rect);
error = gdiGetErrorString(static_cast<int>(status));
return (status == Gdiplus::Ok);
}
No i cały czas do przodu ... cały czas do przodu .....
Dzięki panowie za zainteresowanie tematem.