Подчеркните букву на кнопке в Maxscript

#maxscript

Вопрос:

Я искал способ сделать это, например, в поле запроса, где подчеркнуты Y и N » Да » и «Нет», чтобы указать, что если вы нажмете их, это то, что будет нажато.

введите описание изображения здесь

Вот код и неправильный результирующий снимок экрана, который у меня есть, где я поставил кнопку «амперсанд перед».

 try destroyDialog testRol catch()
rollout testRol "testRol" (
  button btn_test "amp;Button"
  )
createDialog testRol 100 45
 

введите описание изображения здесь


Редактировать:

Даже если я попытаюсь, x0332Yes это не сработает. Это так, но подчеркивание выстроено неправильно, и при использовании перед a B оно выглядит беспорядочно.

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

Вот эта попытка, поскольку она может помочь вам разобраться в этом:

 try destroyDialog testRol catch()
rollout testRol "testRol" (
  button btn_yes "Y̲es (Working)" width:120 across:4
  button btn_no "N̲o (Working)" width:120
  button btn_button_not_working "x0332Button (Not Working)" width:120
  button btn_yes_not_working "x0332Yes (Kinda Working)" width:120
  )
createDialog testRol 525 45
 

введите описание изображения здесь

Ответ №1:

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

 try destroyDialog testRol catch()
rollout testRol "MXS   .NET"
(
    dotNetControl btnMakeCylinder "Button" text:"amp;Make Cylinder" width:120 height:25
    on btnMakeCylinder mouseClick evnt arg do with undo on Cylinder isSelected:on
    on testRol open do btnMakeCylinder.FlatStyle = btnMakeCylinder.FlatStyle.System
)
createDialog testRol
 

Или вы можете использовать MaxForm, где кнопка унаследует цвета, но она все равно будет выглядеть не так, как остальная часть пользовательского интерфейса:

 (
    local form = dotNetObject "MaxCustomControls.MaxForm"
    form.Text = ".NET form"

    fn makeCylinder = with undo on Cylinder isSelected:on

    local btnMakeCylinder = dotNetObject "Button"
    btnMakeCylinder.Text = "amp;Make Cylinder"
    dotNet.addEventHandler btnMakeCylinder "MouseClick" makeCylinder

    form.Controls.Add btnMakecylinder
    form.ShowModeless()
)
 

Или вы можете использовать пользовательский интерфейс Qt, который имеет свой собственный набор недостатков (например, необходимость всегда явно указывать записи отмены), и он довольно многословен:

 (
    local legacy = (python.import "sys").version_info[1] < 3
    local QtGui = python.import "PySide2.QtGui"
    local QtWidgets = python.import "PySide2.QtWidgets"
    local GetQMaxMainWindow = (if legacy then python.import "MaxPlus" else python.import "qtmax").GetQMaxMainWindow

    if isProperty ::testQtDialog #close do testQtDialog.close()
    testQtDialog = QtWidgets.QDialog(GetQMaxMainWindow())
    testQtDialog.setWindowTitle "Qt Window"

    local dialogLayout = QtWidgets.QVBoxLayout()

    fn makeCylinder = with undo on Cylinder isSelected:on

    local btnMakeCylinder = QtWidgets.QPushButton "amp;Make Cylinder"
    btnMakeCylinder.clicked.connect makeCylinder
    dialogLayout.addWidget btnMakeCylinder

    testQtDialog.setLayout dialogLayout
    testQtDialog.show()
)
 

С 2022 года вы также можете сделать окна Qt с собственными элементами управления max таким образом:

 if isKindOf testQtRol RolloutClass do UIAccessor.closeDialog testQtRol.hwnd
rollout testQtRol "Qt Rollout"
(
    QtButton btnMakeCylinder "amp;Make cylinder" row:0 column:2
    on btnMakeCylinder pressed do with undo on Cylinder isSelected:on
)
createQtDialog testQtRol
 

Комментарии:

1. Спасибо за отличный ответ, хотя, к сожалению, нет способа сделать это со стандартным управлением, что очень жаль. Я посмотрю-может быть, это . Кнопка «СЕТЬ» может быть оформлена в соответствии со встроенной кнопкой. Что вы думаете о том, как я жестко закодировал букву Y Y̲es ? Отредактируйте, когда сценарий зашифрован, он делает это так, что жесткое кодирование не годится. https://i.imgur.com/xZci87d.png

2. если вы используете btn.FlatStyle = btn.FlatStyle.System кнопку dotNet, она будет выглядеть точно так же, как кнопка в Макс. Я получил это от Дениста . Так что в итоге я пошел с этим . СЕТЕВОЕ управление кнопками, и это отлично работает. Вы можете добавить этот стиль к ответу, и я отмечу его как принятый 🙂 Спасибо @Swordslayer.

3. Молодец, ДенисТ-тот самый мужчина 🙂 Отредактированный.

4. Да, я был поражен, что это было что-то настолько непонятное и простое. Я провел поиск по своим фрагментам maxscript и другим примерам, и единственным, кто использовал это, является скрипт Show DotNet Properties от Kstudio. пс. Я не могу поверить, что научил тебя чему-то (ну, по крайней мере, передал это!)