Scrollbar Bitmaps in Controls ?



  • Also ich hab eine Multiline Richedit und will aber nicht diese Standart Scrollleiste sondern eine Bitmap. Ist das moeglich ?



  • Ja klar. Du erstellst mit CreateWindow( "SCROLLBAR", ... ) die Scrollbar. Dann schreibst du dir eine eigene WndProc für die Scrollbar. Dort kannst du die Nachricht WM_PAINT und WM_ERASEBKGND abfangen. Da schreibst du dann deine Bitmap rein. Alle anderen Nachrichten leitest du an die originale WndProc weiter.
    Deine WndProc bringst du mit einem Call auf "SetWindowLong(hWnd,GWL_WNDPROC)" an den Mann. Die SetWindowLong-Funktion gibt dir dabei einen Pointer auf die originale WndProc zurück.



  • oh... aha 🙂

    Gibts da vielleich Codeschnipsel ?



  • Ähm... Ja...:

    // Global
        WNDPROC OrigScrollbarProc;
    
        // Irgendwo
        LRESULT CALLBACK DeineScrollbarProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
        {
            switch ( Msg )
            {
                case WM_PAINT:
                    // Deine Bitmap malen
                    break;
            }
            return CallWindowProc( OrigScrollbarProc, hWnd, Msg, wParam, lParam );
        }
    
        // Irgendwo anders
        HWND hWnd = ...; // Mach da dein Handle zu deinem Hauptfenster rein, wo die Scrollbar erstellt werden soll.
        ULONG ScrollbarWidth = GetSystemMetrics( SM_CXVSCROLL ); // Die Scrollbar-Breite
        RECT ClientRect;
        GetClientRect( hWnd, &ClientRect );
        HWND hScrollbar = CreateWindow( "SCROLLBAR", "", WS_VISIBLE|WS_CHILD|SBS_VERT|SBS_RIGHTALIGN, ClientRect.right-ScrollbarWidth, 0 /*y-Position*/, ScrollbarWidth, ClientRect.bottom, hWnd, (HMENU)1001 /*ID der Scrollbar*/, GetModuleHandle(NULL) /*Instance*/, NULL );
        OrigScrollbarProc = (WNDPROC)SetWindowLong( hScrollbar, GWL_WNDPROC, (LONG)DeineScrollbarProc );
    

    Das ist jetzt ein bissl Code für ne vertikale Scrollbar. Ist nicht getestet ( ⚠ ), musst evtl noch ein bisschen casten, Rechtschreibfehler sind auch nicht ausgeschlossen...
    Und Bitmap-laden ist nicht eingebaut. Bitmap-zeichnen solltest du auch hinkriegen 😉 ➡ BeginPaint und EndPaint



  • Badestrand schrieb:

    Alle anderen Nachrichten leitest du an die originale WndProc weiter. Deine WndProc bringst du mit einem Call auf "SetWindowLong(hWnd,GWL_WNDPROC)" an den Mann. Die SetWindowLong-Funktion gibt dir dabei einen Pointer auf die originale WndProc zurück.

    Kurz: Subclassing 😉 .



  • hoert sich schwer an , isses auch ^^ ich versuchs troztdem


Anmelden zum Antworten