Чтобы поделить на подклассы экземпляр окна, вызовите функцию
SetWindowLong и задайте дескриптор окна, которое делиться на подклассы, флажок GWL_WNDPROC и указатель на процедуру подкласса. SetWindowLong возвращает указатель на первоначальную оконную процедуру; используйте этот указатель, чтобы передать сообщения первоначальной процедуре. Чтобы вызвать первоначальную оконную процедуру, оконная процедура подкласса должна использовать функцию CallWindowProc.Следующий пример показывает, как делить на подклассы экземпляр поля редактирования в диалоговом окне. Оконная процедура подкласса дает возможность полю редактирования принимать весь ввод информации от клавиатуры, включая клавиши
ENTER и TAB, всякий раз, когда орган управления получает фокус ввода.Демонстрационный пример
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); }WNDPROC
|