Я заметил, что высота TToolButton увеличивается при установке Стиля кнопки на tbsDropdown. Я могу понять увеличение ширины, таким образом, кнопка имеет пространство для рисования стрелки вниз, но я не уверен, что увеличение высоты необходимо.
Шаги для репродуцирования проблемы (Delphi 2010, Windows 7 x64):
То же увеличение высоты происходит, когда существуют изображения, присвоенные панели инструментов, в этом случае уже существует еще много вертикального пространства, доступного в кнопке для рисования выпадающего.
Вот визуальный пример: сопроводительный текст http://img440.imageshack.us/img440/1462/ttoolbar02.png сопроводительный текст http://img291.imageshack.us/img291/966/ttoolbar01.png
Существует ли обходное решение для этого, не взламывая VCL или этот hardcoded в управление Windows?
Это часть базового элемента управления Windows. Быстрый просмотр ComCtrls
показывает, что изменение TToolButton.Style
вызывает его метод SetStyle
. Если в SetStyle
, ShowCaptions
имеет значение True, тогда TToolBar.ButtonWidth
и ButtonHeight
оба установлены в 0, а TToolButton .RecreateButtons
вызывается.
RecreateButtons
, в свою очередь, вызывает TToolBar.ResizeButtons
, который просто отправляет (публикует) сообщение на ToolBar
, используя
Perform(TB_AUTOSIZE, 0, 0);
TB_AUTOSIZE
, предназначенный для в соответствии с MSDN ,
после изменения размера панели инструментов путем установки кнопки или размера растрового изображения или путем добавления строк в первый раз.
Поскольку SetStyle
устанавливает для ButtonWidth
и ButtonHeight
значение 0, это сообщение будет отправлено правильно.
Похоже, что-то не так с поддержкой тем в базовом элементе управления окнами. Отключите темы времени выполнения (Project/Options/Application, снимите флажок "Enable runtime themes"), игнорируйте увеличенную высоту кнопок во время проектирования (Delphi IDE использует темы) и запустите приложение - вы увидите нормальную высоту кнопок панели инструментов.