MFC: как изменилось положение каретки в вызовах документов OnUpdateCmdUI? - PullRequest
0 голосов
/ 09 мая 2011

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

Допустим, вы вывели класс панели инструментов с именем 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, что еще делает перемещение каретки через документ?

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

1 Ответ

2 голосов
/ 09 мая 2011

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

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

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

...