Gdiplus in einer dialogbasierten Anwendung



  • Hallo,
    ich habe hier mal etwas von GDI+ gehört und bin dann neugierig geworden.
    Will das nun in einer dialogbasierten Anwendung von mir anwenden.
    Jedoch tauchen da einige Probleme auf.
    Zuerst der Quellcode:

    void CMyDlg::OnPaint() 
    {
       if(IsIconic())
       {
          ....    // Standard
       }
       else 
       {
       GdiplusStartupInput gdiplusStartupInput;
       ULONG_PTR           gdiplusToken;
       HDC hdc;
       PAINTSTRUCT  ps;
    
       GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
       hdc = BeginPaint(this, &ps);
       Graphics graphics(hdc);
       Pen      pen(Color(255, 0, 0, 255));
       graphics.DrawLine(&pen, 0, 0, 200, 200);
       EndPaint(this, &ps);
    
       GdiplusShutdown(gdiplusToken);
    
       CDialog::OnPaint();		
    }
    

    Oben in der cpp nutze ich auch

    using namespace Gdiplus;
    

    da er sonst undeclared identifier meckert.
    Die Gdiplus.lib habe ich auch eingebunden.

    Es kommt aber die folgende Fehlermeldung:
    error C2660: 'CWnd::BeginPaint' : function does not take 2 arguments
    error C2660: 'CWnd::EndPaint' : function does not take 2 arguments

    Und zwar erkennt er nicht HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lpPaint).
    Weiss da jemand Rat.

    Mit der MSDN habe ich mich auch schon rumgeschlagen,
    das Beispielprogramm unter
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/usingGDIPlus/gettingstarted/drawingaline.asp
    läuft, ist aber auch ohne MFC und Dialog. 😞
    Wäre für Hilfe oder Ratschläge, aber auch Hinweise sehr dankbar.
    Gruß.

    [EDIT:] Ach ja, mit den this-Zeigern bin ich auch nicht ganz sicher...



  • Ich kenn gdi+ nicht, aber lass doch mal BeginPaint und EndPaint aus der OnPaint komplett weg. Bei einer dialogfeldbasierten Anwendung brauchste das normal nicht



  • GdiplusStartup und GdiplusShutdown in OnPaint ist in etwa so, als ob du dir nach jedem Schritt die Schuhe ausziehst, um sie für den nächsten Schritt wieder anzuziehen. Jeweils einmal, am Anfang und am Ende des Programms sollte reichen.

    Es ist auch generell nicht gut, GdiplusShutdown aufzurufen, bevor alle GDI+-Objekte wieder zerstört sind.



  • Ok, werde ich alles mal ausprobieren. Danke. Melde mich dann mit den Ergebnissen. 😉



  • So. Hab es jetzt hinbekommen. Zudem habe ich die Funktionen, GdiplusStartup und GdiplusShutdown, nun in die InitInstance bzw. ExitInstance meiner Dialoganwendung geschrieben. Hilfreich dazu war auch diese Seite:
    The Code Project

    Danke für die Hilfe. 🙂 👍


Anmelden zum Antworten