Zeichnen außerhalb der Message-Loop?



  • Hallo,

    ich habe mir eine Funktion geschrieben, die eine beliebige Figur auf den Bildschirm zeichnet. Sie sieht in etwa so aus:

    void Paint(HWND p_hWnd)
    {
    	PAINTSTRUCT ps;
    	HDC hdc=BeginPaint(p_hWnd, &ps);
    
    	Polygon(...);
    
    	EndPaint(p_hWnd, &ps);
    }
    

    Jetzt ist nur das Problem, dass sich die Funktion nur bei

    case WM_PAINT:
    

    in der Message-Loop aufrufen lässt, und das auch nur einmal. Andernfalls wird die Figur einfach nicht gezeichnet.

    Wie muss ich jetzt den Code umändern, um die Funktion in einer Kombination mit mit z.B. einem Timer aufrufen zulassen?



  • 1. Das gehört ins WinAPI Forum, das hier ist das C++-Forum (für Fragen zur Standardbibliothek und semantische Problematik o. ä.).
    2. Da musst du aber mal definitiv mehr Code zeigen. Wir sind keine Wahrsager 😉
    3. Hah, Nexus! Nix mit PI vollgespammt.



  • Hacker schrieb:

    2. Da musst du aber mal definitiv mehr Code zeigen. Wir sind keine Wahrsager 😉

    Finde ich nicht. Ich hab zwar keine Ahnung von der WinAPI, aber für mich ist die Frage klar und deutlich gestellt. Ich denke die WinAPI Gurus hier haben ebenfalls verstanden.

    Hacker schrieb:

    3. Hah, Nexus! Nix mit PI vollgespammt.

    *spam*



  • @Hacker:
    Ad 1: richtig
    Ad 2: falsch
    Ad 3: Klappe halten

    @Taeli
    OMG die Frage kann nicht ernst gemeint sein.

    Das BeginPaint/EndPaint muss natürlich aus der Funktion raus wenn du sie auch ausserhalb von WM_PAINT verwenden willst.

    Lies bitte die Doku zu WM_PAINT und BeginPaint . Und bevor du fragst: ergoogle dir die Doku bitte selbst. Tip: wenn die URL "msdn" enthält bist du auf dem richtigen Weg.



  • hustbaer macht mal wieder einen auf aggressiv, weil er im wahren Leben keine Anerkennung bekommt.



  • back bone schrieb:

    hustbaer macht mal wieder einen auf aggressiv, weil er im wahren Leben keine Anerkennung bekommt.

    Arrrgghhh, ich gerate stark in die Versuchung irgendeinen blöden Spruch zu erfinden... gggnnnn...

    Zum Punkt 2: Das ist jetzt Blöd. Ich hab natürlich *keine* Ahnung von der WinAPI, dass die Frage mit 10 Zeilen Code so beantwortet werden kann wusst' ich nicht.



  • hustbaer schrieb:

    Das BeginPaint/EndPaint muss natürlich aus der Funktion raus wenn du sie auch ausserhalb von WM_PAINT verwenden willst.

    Ich hatte es eher so verstanden:

    case WM_TIMER:
      InvalidateRect(hwnd, NULL, true);
      break;
    case WM_PAINT:
      Paint(hwnd);
      break;
    

    Und dann eben bei WM_CREATE oder so SetTimer aufrufen.



  • Zuerst wär imo überhaupt mal interessant, wieso genau du eigentlich nicht in WM_PAINT zeichnen kannst!?



  • HWG schrieb:

    hustbaer schrieb:

    Das BeginPaint/EndPaint muss natürlich aus der Funktion raus wenn du sie auch ausserhalb von WM_PAINT verwenden willst.

    Ich hatte es eher so verstanden:

    case WM_TIMER:
      InvalidateRect(hwnd, NULL, true);
      break;
    case WM_PAINT:
      Paint(hwnd);
      break;
    

    Oh boy...
    Und dann eben bei WM_CREATE oder so SetTimer aufrufen.

    Das BeginPaint/EndPaint muss natürlich aus der Funktion raus wenn er sie auch ausserhalb von WM_PAINT verwenden will.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Es gibt kein "Zeichen" außerhalb von WM_PAINT, Punkt(1).

    Wenn man glaubt, dass man das braucht, hat man ein falsches Konzept und die Windows API/UI nicht verstanden. Punkt(2)...



  • Martin Richter schrieb:

    Es gibt kein "Zeichen" außerhalb von WM_PAINT, Punkt(1).

    Wenn man glaubt, dass man das braucht, hat man ein falsches Konzept und die Windows API/UI nicht verstanden. Punkt(2)...

    Huch? Natürlich gibts das. Die Frage ist nur ob und wann man das braucht...

    Ich glaube der Threadersteller sollte einfach mal das lesen: http://msdn.microsoft.com/en-us/library/dd183315.aspx



  • HWG schrieb:

    hustbaer schrieb:

    Das BeginPaint/EndPaint muss natürlich aus der Funktion raus wenn du sie auch ausserhalb von WM_PAINT verwenden willst.

    Ich hatte es eher so verstanden:

    case WM_TIMER:
      InvalidateRect(hwnd, NULL, true);
      break;
    case WM_PAINT:
      Paint(hwnd);
      break;
    

    Und dann eben bei WM_CREATE oder so SetTimer aufrufen.

    Super, mit SetTimer() und InvalidateRect() klappt es! Danke! 🙂


Anmelden zum Antworten