MFC: как произошло изменение положения курсора в вызовах документа OnUpdateCmdUI?

Я читал о панелях инструментов и наткнулся на

Допустим, вы унаследовали класс панели инструментов с именем CStyleBar от CToolBar, который включает поле со списком со списком всех шрифтов, установленных в системе. Когда пользователь перемещает курсор по документу, вы хотите обновить поле со списком, чтобы выбранный в нем элемент был именем гарнитуры в текущей позиции курсора. Вместо того, чтобы реагировать на каждое изменение положения курсора путем непосредственного обновления выбора поля со списком, вы можете переопределить OnUpdateCmdUI, как показано здесь:

void CStyleBar::OnUpdateCmdUI (CFrameWnd* pTarget,
    BOOL bDisableIfNoHndler)
{
    CToolBar::OnUpdateCmdUI (pTarget, bDisableIfNoHndler);
    CString string = GetTypefaceAtCaret ();
    if (m_wndComboBox.SelectString (-1, string) == CB_ERR)
        m_wndComboBox.SetCurSel (-1);
}

Итак, единственное, что меня смущает, это то, как произошло перемещение каретки через вызов документа OnUpdateCmdUI? и если он не вызывает OnUpdateCmdUI, что еще происходит при перемещении каретки через вызовы документа?

Любая помощь приветствуется.
С уважением.


person Razort4x    schedule 09.05.2011    source источник


Ответы (1)


Перемещение каретки не вызывает OnUpdateCmdUI.

Согласно «Книге ответов MFC», когда CWinThread::Run() обнаруживает, что сообщений для обработки больше нет, вызывает CWinThread::OnIdle(), который отправляет WM_IDLEUPDATECMDUI сообщения окну фрейма и всем его дочерним элементам. После еще пары функций вызывается CToolBar::OnUpdateCmdUI().

Таким образом, перемещение курсора не вызывает функцию. Это основной цикл, когда он простаивает, он просит мэйнфрейм и его дочерние элементы обновить полки.

person MikMik    schedule 09.05.2011