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

GDI+ AddString - problem z tekstem

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Re: GDI+ AddString - problem z tekstem

Nowy postprzez pioro700 » ś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" ... :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.
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsMozilla

Re: GDI+ AddString - problem z tekstem

Nowy postprzez polymorphism » środa, 15 listopada 2017, 15:01

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?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
pioro700
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ AddString - problem z tekstem

Nowy postprzez Cyfrowy Baron » środa, 15 listopada 2017, 17:33

pioro700 napisał(a):Właśnie ten kod działa .....


A u mnie jednak nie działa.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ AddString - problem z tekstem

Nowy postprzez pioro700 » środa, 15 listopada 2017, 17:43

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:
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsMozilla

Re: GDI+ AddString - problem z tekstem

Nowy postprzez polymorphism » środa, 15 listopada 2017, 19:21

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
pioro700
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

Re: GDI+ AddString - problem z tekstem

Nowy postprzez pioro700 » środa, 15 listopada 2017, 19:50

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.
Avatar użytkownika
pioro700
Bladawiec
Bladawiec
 
Posty: 27
Dołączył(a): niedziela, 29 lipca 2012, 11:36
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Win 10 PRO.
Kompilator: RAD Studio 10.2
SKYPE: pioro700
Gadu Gadu: 0
    WindowsMozilla

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 0 gości

cron