none
handle herausfinden und übergeben RRS feed

  • Frage

  • Hallo,

    ich habe ein kleines Problem.

    Ich habe ein eigene Klasse geschrieben die mir verschiedene zeichenobjekte in
    meinen Dialog zeichnet.
    Das Zeichnen funktioniert ganz gut nur die Funktion zum löschen eines Teils
    mit dem Befehl "InvalidateRect" funktioniert nicht so ganz.
    Da die Funktion nicht weiß im welchem Fenster es was löschen soll
    benötigt es dessen Handle, so das der Befehl so aussehen müsste "InvalidateRect(hwnd_handle, lp_reg, true); ". Wenn ich den Handle durch NULL ersetze löscht er mir leider den ganzen Zeichenbereich.
    Wie kann ich nun den Handle meines Dialogs herausfinden und diesen übergeben?

    Die Funktion zum löschen sieht so aus:

    kreis::loesche_kreish(HWND hwnd_handle, CString c_name)
    {
    CRect reg;
    reg.SetRect(0,0,20,20);
    InvalidateRect(hwnd_handle, reg, true);
    return 0;
    };



    Schon mal Danke im voraus.
    Mittwoch, 30. September 2009 11:46

Antworten

  • Hi,

    danke für die schnelle Antwort.

    Hoffentlich nur mittels WM_PAINT, oder?

    Ich habe mir einfach mit  CClientDC cDC(this) den Gerätekontext geholt, diesen an meine Funktion übergeben und dann mit
    cDC.Ellipse(x,y,x+(int)radius,y+(int)radius) meine Kreise gezeichnet.

    Mit "InvalidateRect" _löscht_ man doch nichts... man sagt nur, dass er
    eine WM_PAINT Nachricht erzeugen soll...

    Ich habe das so verstanden das der Invalidate Befehl das Fenster oder ein Teil davon neu zeichnet also löscht. Wie soll ich sonst die
    Objekte die ich gezeichnet habe löschen ?

    Und warum übergibst Du "NULL"?

    NULL habe ich nur eingesetzt um zu sehen ob es überhaupt Funktioniert.

    Mit Get SafeHwnd() funktioniert es jetzt. Ich übergebe jetzt den Handle und meine Funktion zeichnet nun den Bereich neu.


    Nochmal danke für die Hilfe.

     

    Mittwoch, 30. September 2009 12:16

Alle Antworten

  • Hallo Sepentis!

    > Ich habe ein eigene Klasse geschrieben die mir verschiedene
    > zeichenobjekte in
    > meinen Dialog zeichnet.

    Hoffentlich nur mittels WM_PAINT, oder?

    > Das Zeichnen funktioniert ganz gut nur die Funktion zum löschen eines Teils
    > mit dem Befehl "InvalidateRect" funktioniert nicht so ganz.

    Mit "InvalidateRect" _löscht_ man doch nichts... man sagt nur, dass er
    eine WM_PAINT Nachricht erzeugen soll...

    > Da die Funktion nicht weiß im welchem Fenster es was löschen soll
    s der Befehl so aussehen müsste
    > "InvalidateRect(hwnd_handle, lp_reg, true); ".

    Wie "in welchem Fenster"? Du übergibst doch das Fenster-Handle...

    > Wenn ich den Handle durch
    > NULL ersetze löscht er mir leider den ganzen Zeichenbereich.

    Und warum übergibst Du "NULL"?

    > Wie kann ich nun den Handle meines Dialogs herausfinden und diesen
    > übergeben?

    MFC? => GetSafeHwnd()
    Ansonsten liefert Dir doch Dein "CreateDialog" das Fenster-Handle...

    Greetings
    Jochen

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 30. September 2009 11:55
  • Hi,

    danke für die schnelle Antwort.

    Hoffentlich nur mittels WM_PAINT, oder?

    Ich habe mir einfach mit  CClientDC cDC(this) den Gerätekontext geholt, diesen an meine Funktion übergeben und dann mit
    cDC.Ellipse(x,y,x+(int)radius,y+(int)radius) meine Kreise gezeichnet.

    Mit "InvalidateRect" _löscht_ man doch nichts... man sagt nur, dass er
    eine WM_PAINT Nachricht erzeugen soll...

    Ich habe das so verstanden das der Invalidate Befehl das Fenster oder ein Teil davon neu zeichnet also löscht. Wie soll ich sonst die
    Objekte die ich gezeichnet habe löschen ?

    Und warum übergibst Du "NULL"?

    NULL habe ich nur eingesetzt um zu sehen ob es überhaupt Funktioniert.

    Mit Get SafeHwnd() funktioniert es jetzt. Ich übergebe jetzt den Handle und meine Funktion zeichnet nun den Bereich neu.


    Nochmal danke für die Hilfe.

     

    Mittwoch, 30. September 2009 12:16