Dynamisch mit WM_PAINT zeichnen lassen



  • Hallo,

    also ich möchte folgendes realisieren, ich möchte wenn sich das fenster öffnet und der user zum beispiel durch ziehen das fenster vergrößert das sich dynamisch dazu auch meine gezeichneten linien mitbewegen, also neugezeichnet werden, desweiteren möchte ich das sich auch die Buttons mit verschieben. Kann mir da einer zu hand gehen und erklären wie ich das machen muss, weil ich gar keine plan hab wie man da rangeht? danke wäre echt super



  • Du fängst WM_SIZE ab (kommt immer, wenn die Fenstergröße verändert wird) und fragst die Fenstergröße ab (nWidth = LOWORD(lParam), nHeight = HIWORD(lParam). Die kannst Du in einer RECT-Sturktur speichern. Mit der kannst Du dann unter WM_PAINT die Positionen der Linien neu berechnen.
    Bezogen auf den Bildschirm kannst Du auch die Fensterkoordinaten und -Größe mit GetWindowRect() oder bezogen auf das Fenster mit GetClientRect() die Client-Area-Daten abfragen.



  • könntest du da vieleicht ein kleines beispiel anbringen, weil bei mir fängt wird nämlich zur erzeugung des fensters eine linie gezeichnet und diese soll sich dann eigentlich nur dynamisch mitbewegen wenn das fenster vergrößert wird. alsoe in kleines beispiel wäre wirklich nett

    EDIT: also ich habs hinbekommen wie man die linie dynamisch mit zeichnet aber wie kann ich es realiseren das er die buttons dynamisch neusetzt aber dabei die alten wieder löscht?



  • SetWindowPos() oder MoveWindow(), je nach bedarf.



  • hmm so irgendwie is mir das unklar, ich poste mal ein bild wo es vieleicht genauer wird.Also ihr seht ja auch dem Bild den Strich unten und die beide buttons. Wenn das Fenster nun vergrößert wird, muss sich ja der strich und die Buttons automatisch an die größe mit anpassen und wieder in ihrer Ecke unten stehen. Nur leider weiß ich nciht wie.Ich habe shcon rausbekommen wie man den strich in horizontale richtung mitzeichnet wenn sich die größe verändert. Aber was wenns nach unten verschoben wird, da hängst bei mir noch ein bissel. Wäre über hilfe sehr dankbar

    http://img246.imageshack.us/img246/464/bildvk7.th.jpg



  • Hi, so sehen die Funktionsaufrufe (bzw. die Formeln der Parameter) aus, die du benötigst.

    //...
    case WM_SIZE:
    MoveWindow(hWndButton0, rect.right - ((cxButtonWidth * 2) + (cxMargin * 2)), rect.bottom - (cyButtonHeight + cyMargin), cxButtonWidth, cyButtonHeight, TRUE) ;
    
    MoveWindow(hWndButton1, rect.right - (cxMargin + cxButton), rect.bottom - (cyButtonHeight + cyMargin), cxButtonWidth, cyButtonHeight, TRUE) ;
    return 0 ;
    //...
    

    Jetzt musst du eigentlich nur noch die Variablen, die ich verwendet habe, berechnen und fertig!

    MfG WilMen



  • aber vorgefertigte Lösungen gibts hier nicht 😉
    dafür tipps:

    du fängst WM_SIZING oder WM_SIZE ab
    hat sich das fenster vergrößert oder verkleinert?
    berechne die länge des striches bzw. die größe deiner controls neu
    und setze diese



  • @hey

    Das, was du schriebst, wurde schon gesagt. 😉 Also erst lesen, dann posten bitte!

    MfG WilMen



  • ok alles klar, wie kann ich denn aber einen vorher gezeichneten strich wieder löschen und den neuen dafür zeichnen lassen?

    EDIT: @wilmen, wenn ich jetzt noch wüsste was deine variablen aussagen sollen und ich mir im ansatz vorstellen könnte wie man die berechnet dann müsste es gehen:D wie gesagt ich hab gerade erst angefangen und es fällt mir relativ schwer, alleine da durchzblicken



  • Firefighter schrieb:

    ok alles klar, wie kann ich denn aber einen vorher gezeichneten strich wieder löschen und den neuen dafür zeichnen lassen?

    Dafür packst Du die Linienzeichen- und Button-Anpaßfunktion in die Bearbeitung von WM_PAINT. Diese Nachricht wird immer gesendet, wenn sich an dem Fenster IRGEND_ETWAS verändert, z. B. die Größe. Dadurch wird jedesmal der Hintergrund automatisch gelöscht, und alles, was unter WM_PAINT gezeichnet wird, erscheint dann neu.

    EDIT: @wilmen, wenn ich jetzt noch wüsste was deine variablen aussagen sollen und ich mir im ansatz vorstellen könnte wie man die berechnet dann müsste es gehen:D wie gesagt ich hab gerade erst angefangen und es fällt mir relativ schwer, alleine da durchzblicken

    Dafür solltest Du Dir die Übergabeparameter von MoveWindow anschauen. Steht am genauesten in der MSDN:

    MSDN schrieb:

    The MoveWindow function changes the position and dimensions of the specified window. For a top-level window, the position and dimensions are relative to the upper-left corner of the screen. For a child window, they are relative to the upper-left corner of the parent window's client area.

    BOOL MoveWindow(

    HWND hWnd, // handle of window
    int X, // horizontal position
    int Y, // vertical position
    int nWidth, // width
    int nHeight, // height
    BOOL bRepaint // repaint flag);

    Parameters:

    hWnd
    Identifies the window.

    X
    Specifies the new position of the left side of the window.

    Y
    Specifies the new position of the top of the window.

    nWidth
    Specifies the new width of the window.

    nHeight
    Specifies the new height of the window.

    bRepaint
    Specifies whether the window is to be repainted. If this parameter is TRUE, the window receives a WM_PAINT message. If the parameter is FALSE, no repainting of any kind occurs. This applies to the client area, the nonclient area (including the title bar and scroll bars), and any part of the parent window uncovered as a result of moving a child window. If this parameter is FALSE, the application must explicitly invalidate or redraw any parts of the window and parent window that need redrawing.

    Return Values

    If the function succeeds, the return value is nonzero.
    If the function fails, the return value is zero.



  • sorry ich weiß garnich wie ich das anwenden muss damit es den gewünschten effekt ergibt den ich mir vorgestellt hatte. Dann muss ich es erstmal ohne Dynamik machen. Danke trotzdem für jegliche Hilfe

    EDIT:hab jetzt raus wie es geht.danke für die Hilfe


Anmelden zum Antworten