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

#visual-studio-2010 #winapi #mfc #combobox #toolbar

#visual-studio-2010 #winapi #mfc #поле со списком #панель инструментов

Вопрос:

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

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

аннулирует CStyleBar::OnUpdateCmdUI (CFrameWnd* pTarget, 
 BOOL bDisableIfNoHndler)
{
 CToolBar::OnUpdateCmdUI (pTarget, bDisableIfNoHndler);
 CString строка = GetTypefaceAtCaret (); 
 если (m_wndComboBox.SelectString (-1, строка) == CB_ERR)
 m_wndComboBox.SetCurSel (-1); 
}

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

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

Ответ №1:

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

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

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