miniPaint! bei maustastendruck malen, etwas fehlt!?!?!



  • hallöchen ich wollte mal nen fenster kreieren in dem man mit der maus malen kann, solange man die linke m.taste gedrueckt haelt.... das klappt aber noch net wirklich so, woran kanns liegen??? HIer der code:

    #include <windows.h>
    
    LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM );
    const char szAppName[] = "Bemal mich !";
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow )
    {
        HWND hWnd;
        MSG messages;
        WNDCLASS wc;
    
        wc.cbClsExtra    = NULL;
        wc.cbWndExtra    = NULL;
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = szAppName;
        wc.lpfnWndProc   = WinProc;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon( NULL, IDI_APPLICATION );
        wc.hCursor       = LoadCursor( NULL, IDC_CROSS );
        wc.hbrBackground = ( HBRUSH ) GetStockObject( WHITE_BRUSH );
        wc.style         = CS_HREDRAW | CS_VREDRAW;
    
        if( !( RegisterClass( &wc ) ) ) {
    
            MessageBox( NULL, "Fehler bei der Registrierung des Fensters!", "FEHLER!",
                        MB_OK );
            return 0;
        }
    
        hWnd = CreateWindow( szAppName,
                             szAppName,
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT, CW_USEDEFAULT,
                             CW_USEDEFAULT, CW_USEDEFAULT,
                             NULL,
                             NULL,
                             hInstance,
                             NULL );
    
        ShowWindow( hWnd, SW_SHOW );
        UpdateWindow( hWnd );
    
        while( GetMessage( &messages, NULL, NULL, NULL ) ) {
    
            TranslateMessage( &messages );
            DispatchMessage( &messages );
        }
        return messages.wParam;
    }
    
    LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {
    
        static bool draw = false;
        static mPosX;
        static mPosY;
        static COLORREF schwarz = RGB( 0, 0, 0 );
    
        switch( message ) {
    
            case WM_SIZE: {
    
                mPosX  = LOWORD( lParam );
                mPosY  = HIWORD( lParam );
            }
    
            case WM_MOUSEMOVE: {
    
                mPosX = LOWORD( lParam );
                mPosY = HIWORD( lParam );
            }
    
            case WM_LBUTTONDOWN: {
    
                if( wParam )
                draw = true;
            }
    
            case WM_LBUTTONUP: {
    
                if( wParam )
                draw = false;
            }
    
            case WM_PAINT: {
    
                PAINTSTRUCT ps;
                HDC hDc;
    
                hDc = BeginPaint( hWnd, &ps ); {
    
                    do {
    
                        SetPixel( hDc, mPosX, mPosY, schwarz );
                    } while( draw );
                }
                EndPaint( hWnd, &ps );
                return 0;
            }
    
            case WM_QUIT:
            case WM_DESTROY: {
    
                PostQuitMessage( 0 );
                return 0;
            }
        }
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    

    danke fuer folgende Hilfe



  • static mPosX;
        static mPosY;
    

    so gehts ja schon mal garnicht ohne den typ anzugeben



  • T0bi schrieb:

    das klappt aber noch net wirklich so

    Ganz schlechte Fehlerbeschreibung.

    Die do-while-Schleife ist Blödsinn. Da muss ein if hin.



  • jo hab ich alles im nach hinein noch verbessert trotz allen funktioniert noch net so wie in paint das wenn ich mtaste gedrueckt halte man lustig los zeichen kann... man kann lediglich nur immer ein pixel ausfüllen... hmm hat wer ne idee, wie besser geht?



  • InvalidateRect bei MouseMove genau für die pos wo die maus ist aufrufen...



  • (D)EVIL, gehts vieleicht etwas genauer was du meinst????, ich soll InvalidateRect() bei mousemove reinbasteln oder wat?



  • Jop... das die Stelle immer neu gezeichnet wird...



  • Als Info: Du kannst InvalidateRect auch nur einen Teilbereich übergeben (in Form der Rect-Struktur) der
    dann neu gezeichnet wird, das ist effizienter, als gleich alles neu zuzeichnen.

    Zum testen reicht aber vllt. erstmal:

    InvalidateRect(hWnd, NULL, TRUE);
    


  • meinst du mit teilbereich, das ich nen childwindow fuer die rect nehmen soll? und dann InvalidateRect( hWndChild, NULL, True ) ??? so in der art?



  • Nein -.- Du machst einfach ein kleines Rect um die Mausposition und gibst das als 2. Parameter an 😉



  • T0bi schrieb:

    meinst du mit teilbereich, das ich nen childwindow fuer die rect nehmen soll? und dann InvalidateRect( hWndChild, NULL, True ) ??? so in der art?

    😃 😃 😃 😃

    Also so meint (D)Evil das (hoffe ich :p ):
    Beispiel:

    // ...
            case WM_MOUSEMOVE: {
    
                mPosX = LOWORD( lParam );
                mPosY = HIWORD( lParam );
                RECT rcReDraw;
                rcReDraw.left   = mPosX - 5; // hängt vom 'Pinsel' ab
                rcReDraw.top    = mPosY - 5;
                rcReDraw.right  = mPosX + 5;
                rcReDraw.bottom = mPosY + 5;
                InvalidateRect(hWnd, &rcReDraw, TRUE);
            }
    // ...
    

Log in to reply