Учебник по Visual C++ .Net



             

Реакция окна на уведомляющие сообщения


tagNMHDR

{

//=== Описатель окна (счетчика), пославшего сообщение

HWND hwndFrom;

//=== Идентификатор окна (счетчика)

UINT idFrora;

//=== Код сообщения

OINT code;

}

NMHDR;

Но на самом деле указатель pNMHDR содержит адрес другой структуры:

typedef struct _NM_UPDOWN

{

//====== Вложенная структура

NMHDR hdr;

//====== Текущая позиция счетчика

int iPos;

//====== Предлагаемое увеличение показаний

int iDelta;

}

NMUPDOWN, FAR *LPNMUPDOWN;

Так как структура hdr типа NMHDR стоит первой в списке полей NMUPDOWN, то все законно — присланный в iParam указатель действительно показывает на NMHDR, но в составе NMUPDOWN. Эту ситуацию легче запомнить, а может быть, и понять, если использовать аналогию. Способ запоминания замысловатых выкладок с помощью глупых аналогий известен давно. Мне приходит в голову такая: звонят в дверь (WM_NOTIFY), вы подходите к ней и видите, что пришел знакомый мальчик (NMHDR) с сообщением, но, открыв дверь, вы обнаруживаете, что за ним стоит широкоплечий мужчина (NMUPDOWN). Теперь пора ввести в класс CLookDlg реакции на уведомляющие сообщения:

  • Откройте шаблон диалога и установите курсор мыши на счетчике (IDC_SPIN).

  • В окне Properties нажмите кнопку с подсказкой ControlEvents.

  • В появившемся списке уведомляющих сообщений, которые генерирует счетчик, выберите UDN_DELTAPOS, а в ячейке справа укажите действие — <Add>.

    Перейдите в окно LookDlg.cpp и найдите в карте сообщений новый элемент

    ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN, OnDeltaposSpin)

    который был вставлен инструментом ClassWizard и который означает, что если окну диалога, управляемому классом CLookDlg, придет сообщение UDN_DELTAPOS (Up-Down Notification) от элемента с идентификатором IDC_SPIN, то управление будет передано функции-обработчику OnDeltaposSpin. Теперь в конце файла найдите эту функцию:

    void CLookDlg::OnDeltaposSpin(NMHDR *pNMHDR, LRESOLT *pResult)

    {

    NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;

    // TODO: Add your control notification handler code here




    Содержание  Назад  Вперед