WM_Paint unregelmässig



  • hi,
    nein, ich zitiere 'If there is no update region, GetUpdateRect retrieves an empty rectangle (sets all coordinates to zero).'
    quelle: http://msdn.microsoft.com/en-us/library/ms534867(VS.85).aspx

    es sei denn ich verstehe irgendwas falsch?

    mfg nullpunkt


  • Mod

    Und wie änderst Du sekündlich die Hintergrundfarbe?
    Ohne InvalidateRect gibt es kein WM_PAINT!



  • hi,
    ich ändere über einen timer nur die property backColor.
    ansonten tu ich nix.

    aber die farbe ändert sich ja, also muss windows ja auch
    eine wm_paint erhalten/senden?

    grundfsätzlich würde ich das ganze auch anders aufziehen.
    ziel ist einfach, dass ich das jeweilige rectangle erhalte, welches von windows
    neu gezeichnet wird.

    und wenn sich die farbe des panels ändert, dann sollte das eigentlich auch
    funktionieren oder?

    mfg nullpunkt


  • Mod

    nullpunkt schrieb:

    ich ändere über einen timer nur die property backColor.
    ansonten tu ich nix.

    Welches Property bitte?
    Ich kenne kein Property Background Colorin der Windows API, außer Du hast es hier mit einem ActiveX Control zu tun!

    nullpunkt schrieb:

    aber die farbe ändert sich ja, also muss windows ja auch
    eine wm_paint erhalten/senden?

    Nein! Soclh ein WM_APINT wird nicht gesendet sondern ausgelsöt, wenn ein InvalidateRect erfolgte!

    Was hast Du denn da für ein Sample? Zeig mal mehr Code!



  • hi,
    ich habe die frage nur in WinAPI gestellt, da eine frage betreffend
    wm_paint hierhin gehört. eventuell habe ich die sache zu wenig erklärt, sorry.

    du hast mich gefragt wie ich die hintergrundfarbe ändere und ich habe dir
    gesagt, dass ich sekündlich (timer) die property 'backColor' meines panels
    ändere. ich sprach also von Panel.BackColor

    code:
    das hooking muss ich wohl nicht posten, da mir (das sieht man am log) alle
    win-messages zugesandt werden.

    die messages verarbeite ich dann schlussendlich so: (C#-Code)

    void GetMsg_GetMsg(IntPtr Handle, IntPtr Message, IntPtr wParam, IntPtr lParam)
    {
        // Filter für WM_PAINT
        if (Message.ToInt32() == WM_PAINT)
        {
            // Update-Region über WIN32 holen
            Rectangle rect = new Rectangle();
            GetUpdateRect(Handle, ref rect, 0);
    
            if (rect.Size == new Size(0, 0))
            {
                // Kein Upgrade-Region empfangen !
            }
            else
            {
                // Weitere Aktionen mit dem erhaltenen Rectangle.
            }
        }
    }
    [DllImport("user32")]
    public static extern int GetUpdateRect(IntPtr hwnd, ref Rectangle lpRect, int bErase);
    

  • Mod

    1. Ob ein .NET Form Library in dieser Art und Weise genauso arbeitet wie ein normales Fenster wage ich zu bezweifeln.
    2. Weißt Du ob ein Neuzeichnen durch das setzen der Backgroundfarbe auslöst?
    Weißt Du ob das .NET Control diese Aktion nicht evtl. bündelt? Oder ob diese Aktion evtl. direkt ohne ausführen von WM_PAINT auf dem DC ausgelöst wird?

    Es steht .NET frei es anders zu machen... 😉



  • Das was du vorhast macht man mit nem "Mirror Driver"



  • WM_PAINT wird durch InvalidateRect ausgelöst, aber verzögert, bis keine Messages mehr in der Queue stehen 8vereinfacht).

    Wenn Du aber nur den Hintergrund änderst, wird evtl. nur eine WM_ERASEBKGND - Message ausgelöst, würde mich zwar verblüffen, aber möglich ist es.



  • @Martin Richter:
    1: das weiss ich auch nicht genau, jedoch sehe ich das ultravnc die sache auch so löst (zumindest in dieselbe richtung)
    2: nein, das weiss ich nicht. ich weiss aber, dass ich genau in dem moment (in meinem test alle sekunden) ein wm_paint erhalte, welches leider einfach leer ist. aber eintreffen tuts.
    3: nein, wissen tuh ich das wirklich nicht.

    @tenet:
    darüber habe ich auch schon gelesen, jedoch meine ich, es sollte auch mit wie geplant lösbar sein (siehe andere beispiele)

    @peterchen:
    hmm.. ich habe jetzt diverse andere versuche gemacht und stelle fest, dass ich in keinem fall eine WM_ERASEBKGND erhalte. könnte es sein, dass ich beim exportieren der hooks was flasch mache?

    vielleicht könnte sich jemand die hooks mal anschauen, der damit vertraut ist?
    (ich erhalte sonst alles was ich brauche)

    hooks:
    [url]
    http://www.marcobrunold.ch/share/he/GlobalCbtHook.zip
    [/url]

    author/quelle:
    http://www.xaipete.net/softdev/

    ich sah jedoch keine einschränkung der messages.

    mfg nullpunkt



  • hi,
    ich muss diesen alten thread leider nochmals pushen und bitte erneut um
    hilfe eines c-experten, welcher mir vielleicht die c-hooks anschauen könnte.

    ich bin mittlerweile bereit für die lösung des problems zu bezahlen.

    mfg nullpunkt


Anmelden zum Antworten