Листинг 6.12
BOOL CALLBACK SendButton(HWND k.UINT m.LPARAM 1.WPARAM w); //Это прототип WNDPROC Def; //Адрес стандартной оконной процедуры класса button Def = (WNDPROC)GetWindowLong(GetDlgltem(hDlg. IDC_SEND),GWL_WNDPROC); SetWi ndowLong (Get Dl g 11 em (hDl g. IDCJEND). GWL_WNDPROC. (LONG) SendButt on): //Новая оконная процедура для кнопки IDC_SEND реагирует и на нажатие, //и на отпускание кнопки:
BOOL CALLBACK SendButton(HWND k.UINT m.LPARAM 1.WPARAM w) {
int i - CallWindowProcCDef.k.m.l,w); i f (LOWORD (m) -WM_LBUTTONDOWN) {
OnSendO; //Действия по нажатию кнопки }
i f (LOWORD (m) «WM_LBUTTONUP) {
OnFreeMicO: //Действия по отпусканию кнопки
}
return i; }
Старая оконная процедура может вызываться до или после нестандартной обработки сообщений. Я предпочитаю делать это как можно раньше, так как у меня случались такие варианты нестандартной обработки, после которых запуск стандартного обработчика приводил к аварийному завершению или зависанию программы.
Использование рассмотренных функций для изменения флагов стиля в любой момент может сделать кнопку переключателем и вообще изменить внешний вид органа управления. Это демонстрирует фрагмент кода, приведенный в листинге 6.13.
Листинг 6.13
int dwStyle - GetWindowLong(hEdit. GWL_STYLE): if((dwStyle & Oxffff) !- BS_CHECKBOX)
SetWindowLong(hEdit. GWL_STYLE. (dwStyle&OxffffOOOO)|BS_CHECKBOX):
Здесь операция &Oxf f f f0000 используется, чтобы сбросить индивидуальные флаги класса button, не изменяя находящихся в старшем слове общесистемных флагов стиля.
Дочерние окна
Элемент управления Edit
Окно класса Edit предназначено для ввода пользователем строки текста. При его создании можно указывать дополнительные модификаторы стиля ES_LEFT, ES_CENTER, ES_RIGHT, ES_MULTILINE, ES_PASSWORD, ES_READONLY и др. Так, например, флаг ES_PASSWORD позволяет решить рассмотренную в предыдущем разделе задачу ввода пароля стандартными средствами.
Сообщение WM_COMMAND от окна класса Edit сопровождается кодами извещения EN_CHANGE, ENJETFOCUS, EN_KILLFOCUS, EN_MAXTEXT, формируемыми при любом изменении текста в окне, получении и потере окном фокуса ввода, заполнении текстом всей видимой части окна. Полный список кодов можно найти в файле Winuser.h.