#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()
.
Итак, перемещение курсора не вызывает функцию. Это основной цикл, который в режиме ожидания запрашивает мэйнфрейм и его дочерние элементы обновить свои полки.