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


Anmelden zum Antworten