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



Взаимодействие классов Класс CPropDlg - часть 4


  • Дайте команду Debug > Windows > Call Stack (или Alt+7).

  • Внедрите это окно, если необходимо, в блок окон отладчика (внизу экрана).

  • Убедитесь, что вызов произошел из функции DialogРгос одного из базовых классов, точнее шаблонов классов, CDialoglmplBaseT.

    Этот опыт иллюстрирует тот факт, что все необычно в мире ATL. Этот мир устроен совсем не так, как MFC. Шаблоны классов дают удивительную гибкость всей конструкции, способность приспосабливаться и подстраиваться. Теперь рассмотрим вторую, весьма вероятную, ошибку. Секцию protected в классе CPropDlg следует правильно разместить (странно, не правда ли?). Лучше это сделать так, чтобы сразу за ней шло объявление какой-либо из существующих секций public. Если поместить ее, например, перед макросом

    DECLARE_REGISTRY_RESOURCEID(IDR__PROPDLG)

    то макрос окажется безоружным против такой атаки, хотя по идее он должен сопротивляться и даже не замечать наскоков подобного рода. Возможно, этот феномен исчезнет в окончательной версии Studio.Net.

    Сообщение о прокрутке в окне

    Сообщение WM_HSCROLL приходит в окно диалога (читайте: объекту диалогового класса, связанного с окном) всякий раз, как пользователь изменяет положение одного из ползунков, расположенных на лице диалога. Это довольно удобно, так как мы можем в одной функции обработки (onHScroll) отследить изменения, произошедшие в любом из 11 регуляторов. Введите коды обработки этого сообщения, которые сходны с кодами, приведенными в приложении на основе MFC, за исключением СОМ-специфики общения между классами CPropDlg и COpenGL:

    LRESULT CPropDlg::OnHScroll(UINT /*uMsg*/, WPARAM wParam,

    LPARAM iParam, BOOL& /*bHandled*/)

    {

    //====== Информация о событии запакована в wParara

    int nCode = LOWORD(wParam), nPos = HIWORD(wParam), delta, newPos;

    HWND hwnd = (HWND) IParam;

    // Выясняем номер и идентификатор активного ползунка

    UINT nID;

    int num = GetSliderNum(hwnd, nID);

    //====== Выясняем суть события

    switch (nCode)

    {

    case SB_THUMBTRACK:

    case SBJTHUMBPOSITION:




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