CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - GDI+ AddString - problem z tekstem
Strona 2 z 2

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 13:50
przez pioro700
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" ... :shock: ... 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);
}

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);
}


No i cały czas do przodu ... cały czas do przodu .....
Dzięki panowie za zainteresowanie tematem.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 15:01
przez polymorphism
KOD cpp:     UKRYJ  
pGraphics->ReleaseHDC(hDC);

To aby na pewno dobrze jest? Według dokumentacji Graphics::ReleaseHDC() powinieneś użyć tylko w stosunku do uchwytów, które uzyskałeś metodą Graphics::GetHDC().

Zapewne źle zrozumiałeś ten fragment dokumentacji albo w ogóle go nie zauważyłeś:
When you use this constructor to create a Graphics::Graphics object, make sure that the Graphics::Graphics object is deleted or goes out of scope before the device context is released.

Oznacza on tyle, że kontekst (HDC) nie powinien być zwolniony przed zwolnieniem/zniszczeniem obiektu klasy Graphics, do którego został przypisany. I tyle.

To może być powód tych cyrków...




KOD cpp:     UKRYJ  
Gdiplus::Graphics *pGraphics = new Gdiplus::Graphics(hDC);
...

delete pGraphics;
...

delete pGraphics;
...

delete pGraphics;
...

delete pGraphics;
...

Mamy XXI wiek, a w C++ jest std::unique_ptr (lub auto + std::make_unique()) ;)

Zresztą po co tworzysz ten obiekt na stercie?

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 17:33
przez Cyfrowy Baron
pioro700 napisał(a):Właśnie ten kod działa .....


A u mnie jednak nie działa.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 17:43
przez pioro700
polymorphism napisał(a):To aby na pewno dobrze jest? Według dokumentacji Graphics::ReleaseHDC() powinieneś użyć tylko w stosunku do uchwytów, które uzyskałeś metodą Graphics::GetHDC().

A czy Graphics::Graphics(HDC) to nie to somo co Graphics::GetHDC() ?
Jak pisałem wcześniej utworzyłem funkcję którą wywołuję wielokrotnie. Kiedy przekazywałem jej referencje do Graphics, to ona nie działała, musiałem użyć kontekstu urządzenia, czyli jak mniemam, a wiem co piszę bo nie mam na ten temat zielonego pojęcia, :mrgreen: to za każdym wywołaniem funkcji, tworzony jest obiekt Graphics oparty na uchwycie HDC .... czyli przed ponownym wywołaniem funkcji, muszę uchwyt zwolnić ... no chyba, że się mylę, a mylę się na tyle często, że nie zdziwiłbym się.
polymorphism napisał(a):To może być powód tych cyrków...

Już wypróbowałem i nie ma to żadnego wpływu ..
polymorphism napisał(a):Mamy XXI wiek, a w C++ jest std::unique_ptr (lub auto + std::make_unique())

Chyba nie wiesz ile mam lat :lol:
polymorphism napisał(a):Zresztą po co tworzysz ten obiekt na stercie?

Możesz się uśmiać .... nie wiem :roll:

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 19:21
przez polymorphism
A czy Graphics::Graphics(HDC) to nie to somo co Graphics::GetHDC() ?

Nie.

Z dokumentacji GetHDC():

Each call to the Graphics::GetHDC method of a Graphics object should be paired with a call to the Graphics::ReleaseHDC method of that same Graphics object. Do not call any methods of the Graphics object between the calls to Graphics::GetHDC and Graphics::ReleaseHDC.



Kiedy przekazywałem jej referencje do Graphics, to ona nie działała

Jak już pisałem, to coś nieprawdopodobnego...


Już wypróbowałem i nie ma to żadnego wpływu ..

Poszukaj, czy nie masz tego typu kwiatków w innych partiach kodu.

Re: GDI+ AddString - problem z tekstem

Nowy postNapisane: środa, 15 listopada 2017, 19:50
przez pioro700
Część kodu już poprawiłem ...
polymorphism napisał(a):Poszukaj, czy nie masz tego typu kwiatków w innych partiach kodu.

Jak to dobrze, że to zima ... pewnie część już wymarzła. A tak na poważnie, to przejrzę tę moją radosną twórczość.
Jest jeszcze jeden aspekt, który wygrzebałem z czeluści internetu, a mianowicie TGraphics w Builderze trochę się gryzie z Gdiplus::Graphics.