subclassing eines scrollbalkens auf 2 arten, 1e funktioniert
-
So funktionierts:
[cpp]static LONG_PTR PrevWndProcEdit;
LRESULT CALLBACK subClass(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return CallWindowProc((WNDPROC)PrevWndProcEdit,hDlg,message,wParam,lParam);
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndScroll;
switch (message)
{
case WM_CREATE:
{
hwndScroll = CreateWindow(
"scrollbar",
NULL,
WS_CHILD | SBS_VERT|WS_VISIBLE|WS_TABSTOP,
0,
0,
100,
200,
hWnd,
(HMENU) 0,
hInst,
NULL);
SetScrollRange(hwndScroll,SB_CTL,0,255,false);
SetScrollPos(hwndScroll,SB_CTL,0,false);
ShowWindow(hwndScroll,true);
PrevWndProcEdit = SetWindowLong (hwndScroll, GWL_WNDPROC,
(LONG_PTR) subClass);
return 0;
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}[/cpp]
So Funktionierts nicht: (es wird also der Scrollbalken nicht angezeigt - aber warum? - bekommt die Funktion WndProc jedesmal eine neue Adresse?)LRESULT CALLBACK subClass(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { return CallWindowProc((WNDPROC)WndProc,hDlg,message,wParam,lParam); }
-
CallWindowProc benötigt einen funktionszeiger nicht die funktion an sich.
ich vermute mal das intern dann der zeiger aufgerufen. am besten wäre es du würdest mal etwas über funktionszeiger lesen
http://www.function-pointer.org/
-
richtig ist:
[cpp]
return CallWindowProc((WNDPROC)PrevWndProcEdit,hDlg,message,wParam,lParam);
[/cpp]
Du mußt aus der Subclass-WndProc die alte WndProc der Scrollbars aufrufen, sonst gehts nicht