Как изменить размер строки меню приложения в приложении MFC?

Я работаю с MFC, и я успешно создал меню. Каждый пункт меню измеряется и отображается правильно, за исключением пунктов основного уровня. Единственное, что я не могу сделать, это перерисовать строку приложения.

Я приложил два изображения:

  1. Первый показывает часть меню. Шрифт Consolas 11pt нарисован правильно. Ширина кнопок рассчитана правильно, кнопки нужно распределить по двум строкам.
  2. Второе изображение показывает ту же строку меню со шрифтом Consolas 20pt. Теперь меню нужно три строки, чтобы содержать все пункты меню. Однако высота для каждой отдельной строки не обновляется. (во время отладки я вижу, что переопределение MeasureItem вычисляет правильную высоту для каждого пункта меню). Под меню отображается панель инструментов (BCGToolBar), которая рассчитывает правильную высоту для своего бара.

Итак, каким бы ни был размер шрифта, строка меню приложения никогда не изменит свою высоту?

Как изменить размер строки меню приложения в этом приложении MFC?

Две строки меню с обычным размером шрифта Две строки меню с большим размером шрифта

До сих пор я пробовал следующие строки кода в разных порядках:

RECT barRect;
barRect.top = 0;
barRect.left = 0;
barRect.bottom = 100;
barRect.right = 1020;
m_pMainWnd->RepositionBars(0, 0, 0, 2, &barRect);

m_pMainWnd->GetTopLevelFrame()->RecalcLayout();
m_pMainWnd->DrawMenuBar();

for (POSITION pos = m_pMainWnd->GetTopLevelFrame()->m_listControlBars.GetHeadPosition(); pos != NULL;)
{
    CControlBar* controlBar = reinterpret_cast<CControlBar*>(m_pMainWnd->GetTopLevelFrame()->m_listControlBars.GetNext(pos));
    controlBar = nullptr; //Let's see what we can do with this. Is the menuBar a ControlBar? Didnt think so.
}
m_pMainWnd->RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

1 ответ

Первая часть не является ответом на прямой вопрос, но она должна прояснить, почему в этом нет необходимости.

Меню является частью глобального пользовательского интерфейса. Также размер пунктов меню является частью глобальных настроек.

Если пользователь что-то делает, он может изменить настройки Windows, чтобы получить увеличенное меню.

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

Теперь к вашему вопросу.

Вы получите сообщение WM_MEASUREITEM. Повторите с этим, и вы можете изменить высоту для меню onwerdraw.

См.: http://www.codeguru.com/cpp/controls/menu/article.php/c3719/The-Easiest-Way-to-Code-the-Owner-Drawn-Menu.htm

Другие вопросы по тегам