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