2010-01-06 3 views
9

от Microsoft User Experience Interaction Guidelines дать некоторые рекомендации для пользовательского интерфейса, когда использовать кнопку меню:Создание кнопки меню в Windows,

http://i.msdn.microsoft.com/Aa511453.command51(en-us,MSDN.10).png

Как я создать одну из этих кнопок меню? Я нашел информацию о

  • как создать кнопку разделения в Vista, и выше
  • как создать кнопку на панели инструментов с помощью выпадающего меню
  • как создать регулярную кнопку и вручную телеграфировать в OnClick обработчик события, который вызывает меню

Но есть ли стандартный способ создания кнопки, а не на панели инструментов, с маленьким треугольником, который автоматически появляется при нажатии на меню?

(я использую Delphi/C++ Builder, но и другие решения приветствуются.)

ответ

11

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

procedure TForm1.Button1Click(Sender: TObject); 
var 
    pt : TPoint; 
begin 
    Pt.X := Button1.Left; 
    Pt.Y := Button1.Top+Button1.Height; 
    pt := ClientToScreen(Pt); 
    PopupMenu1.Popup(pt.x,pt.y); 
end; 

Вы можете добавить «глиф», с помощью кнопки Delphi 2010 или предыдущей версии TBitBtn и присвоить свойство растрового/глифа для соответствующего изображения и выравнивание по правому краю.

+3

Вы также можете использовать символ маленького треугольника с нисходящим указателем ▾ (http://www.fileformat.info/info/unicode/char/25be/index.htm) –

+0

Нужно ли мне делать что-нибудь особенное, чтобы получить этот треугольник, чтобы показать вверх? Он отображается как ящик (непризнанный символ), когда я пытаюсь использовать его в своих элементах управления. –

+0

Если вы не можете быть уверены в наличии шрифта с нужным символом, то бит-кнопка с глифом, выровненным справа, вероятно, является лучшей идеей. Возможно, вы сможете запросить ОС для соответствующего встроенного изображения, но это тема для отдельного вопроса. –

4

Вы не упоминаете, какую версию Delphi вы используете, но в Delphi 2010 TButton имеет новые свойства для этого : DropDownList, который может быть связан с TPopupMenu для определения пунктов меню и Стиль, который может быть установлен в bsSplitButton.

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

procedure TForm1.Button1Click(Sender: TObject); 
var 
    CursorPos: TPoint; 
begin 
    GetCursorPos(CursorPos); 
    PopupMenu1.Popup(CursorPos.X, CursorPos.Y); 
end; 

в предыдущих версиях Delphi Я думаю, вам пришлось использовать TToolBar.

+0

bsSplitButton делает выпадающее меню, но не при нажатии кнопки слева от разделителя. Легче просто обрабатывать в onclick для обработки обоих методов. – skamradt

+0

Я видел, как делать сплит-кнопки (также доступные в Delphi 2009, которые мы используем), но документы Microsoft описывают кнопки меню в отличие от разделенных кнопок и кнопок, и кажется странным, что единственный способ сделать Кнопка меню предназначена для имитации One с OnClick. –

+1

Это не симуляция *, Джош. Как вы думаете, что происходит с «настоящими» кнопками меню, если не отображать меню при нажатии? Я имею в виду, что вы можете создать компонент TMenuButton, но все, что он сделал бы, это переопределить его метод «Click», чтобы отобразить его свойство «PopupMenu» вместо вызова обработчика события OnClick. Таким образом, вы действительно сохраните только один вызов функции. –

Смежные вопросы