Деление на подклассы окна


Чтобы поделить на подклассы экземпляр окна, вызовите функцию SetWindowLong и задайте дескриптор окна, которое делиться на подклассы, флажок GWL_WNDPROC и указатель на процедуру подкласса. SetWindowLong возвращает указатель на первоначальную оконную процедуру; используйте этот указатель, чтобы передать сообщения первоначальной процедуре. Чтобы вызвать первоначальную оконную процедуру, оконная процедура подкласса должна использовать функцию CallWindowProc.

Следующий пример показывает, как делить на подклассы экземпляр поля редактирования в диалоговом окне. Оконная процедура подкласса дает возможность полю редактирования принимать весь ввод информации от клавиатуры, включая клавиши ENTER и TAB, всякий раз, когда орган управления получает фокус ввода.

Демонстрационный пример

WNDPROC wpOrigEditProc; 
 
LRESULT APIENTRY EditBoxProc(
    HWND hwndDlg, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam) 
{ 
    HWND hwndEdit; 
 
    switch(uMsg) 
    { 
        case WM_INITDIALOG: 
            // Извлечение дескриптора поля редактирования. 
            hwndEdit = GetDlgItem(hwndDlg, ID_EDIT); 
 
            // Подкласс органа редактирования. 
            wpOrigEditProc = (WNDPROC) SetWindowLong(hwndEdit, 
                GWL_WNDPROC, (LONG) EditSubclassProc); 
            // 
            // Продолжение инициализации процедуры. 
            // 
            return TRUE; 
 
        case WM_DESTROY: 
            // Удаление подкласса из поля редактирования. 
            SetWindowLong(hwndEdit, GWL_WNDPROC, 
                (LONG) wpOrigEditProc); 
            // 
            // Продолжение очистки процедуры. 
            // 
            break; 
    } 
    return FALSE; 
        UNREFERENCED_PARAMETER(lParam); 
} 
 
// Процедура подкласса 
LRESULT APIENTRY EditSubclassProc(
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam) 
   { 
    if (uMsg == WM_GETDLGCODE) 
        return DLGC_WANTALLKEYS; 
 
    return CallWindowProc(wpOrigEditProc, hwnd, uMsg, 
        wParam, lParam); 
   } 

 

 

Назад в оглавление
На главную страницу

Hosted by uCoz