windows_programming_notes.nbk: Home | Index | Next Page: how to subclass a dialog control - installing and removing | Previous Page: How To Handle Checkboxes


 how to subclass a dialog control

Installing and removing the subclass function

A simple subclass function:

//##############################################################################
// Edit Control subclass callback function
//##############################################################################

LRESULT CALLBACK EditControlSubclass(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    int  shift   = (GetKeyState(VK_SHIFT) < 0) ? SHFT : 0;
    int  control = (GetKeyState(VK_CONTROL) < 0) ? CTRL : 0;
    int  my_id   = GetWindowLong(hwnd, GWL_ID);
    HWND parent  = GetParent(hwnd);

    dbgprintf("EditControlSubclass %s %08X %08X", message_name(message), wparam, lparam);

    switch(message) {
/*
//    case WM_CHAR:
//        DumpMessage("EditControlSubclass WM_CHAR   ", hwnd, message, wparam, lparam);
    case WM_KEYDOWN:
//        DumpMessage("EditControlSubclass WM_KEYDOWN", hwnd, message, wparam, lparam);
        switch(wparam + control + shift) {
        case VK_ESCAPE:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_ABORT_EDIT), (LPARAM)hwnd);
            return TRUE;
        case VK_F2:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_END_EDIT), (LPARAM)hwnd);
            return TRUE;
        case VK_RETURN:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_COL_RIGHT), (LPARAM)hwnd);
            return TRUE;
        case CTRL + VK_HOME:
        case CTRL + VK_UP:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_FIRST_ROW), (LPARAM)hwnd);
            return TRUE;
            break;
        case CTRL + VK_END:
        case CTRL + VK_DOWN:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_LAST_ROW), (LPARAM)hwnd);
            return TRUE;
            break;
        case VK_UP:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_ROW_UP), (LPARAM)hwnd);
            return TRUE;
            break;
        case VK_DOWN:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_ROW_DOWN), (LPARAM)hwnd);
            return TRUE;
            break;
        case VK_NEXT: // page up
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_PAGE_DOWN), (LPARAM)hwnd);
            return TRUE;
            break;
        case VK_PRIOR: // page down
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_PAGE_UP), (LPARAM)hwnd);
            return TRUE;
            break;
        case VK_TAB:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_COL_RIGHT), (LPARAM)hwnd);
           return TRUE;
            break;
        case SHFT + VK_TAB:
            SendMessage(parent, WM_COMMAND, MAKEWPARAM(my_id, EN_COL_LEFT), (LPARAM)hwnd);
            return TRUE;
            break;
        case CTRL + VK_TAB:
        case SHFT + CTRL + VK_TAB:
            // control-tab and control-shift-tab are forwarded to the parent,
            SendMessage(parent, message, wparam, lparam);
            return TRUE;
            break;
        }
*/
    }
    // call the original window function for anything we don't care to deal with.
    return CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA), hwnd, message, wparam, lparam);
}


windows_programming_notes.nbk: Home | Index | Next Page: how to subclass a dialog control - installing and removing | Previous Page: How To Handle Checkboxes


Notebook exported on Monday, 7 July 2008, 18:56:50 PM Eastern Daylight Time