原文: http://zetcode.com/gui/vbgtk/menustoolbars/

在 Visual Basic GTK# 编程教程的这一部分中,我们将使用菜单和工具栏。

菜单栏是 GUI 应用中最常见的部分之一。 它是位于各个菜单中的一组命令。 在控制台应用中,我们必须记住许多奥术命令,在这里,我们将大多数命令分组为逻辑部分。 这些公认的标准可进一步减少学习新应用的时间。

简单菜单

在第一个示例中,我们将创建一个带有一个文件菜单的菜单栏。 该菜单将只有一个菜单项。 通过选择项目,应用退出。

  1. ' ZetCode Mono Visual Basic GTK# tutorial
  2. '
  3. ' This program shows a simple
  4. ' menu. It has one action, which
  5. ' will terminate the program, when
  6. ' selected.
  7. '
  8. ' author jan bodnar
  9. ' last modified May 2009
  10. ' website www.zetcode.com
  11. Imports Gtk
  12. Public Class GtkVBApp
  13. Inherits Window
  14. Public Sub New
  15. MyBase.New("Simple menu")
  16. Me.InitUI
  17. Me.SetDefaultSize(250, 200)
  18. Me.SetPosition(WindowPosition.Center)
  19. AddHandler Me.DeleteEvent, AddressOf Me.OnDelete
  20. Me.ShowAll
  21. End Sub
  22. Private Sub InitUI
  23. Dim mb As New MenuBar
  24. Dim filemenu As New Menu
  25. Dim fileItem As New MenuItem("File")
  26. fileItem.Submenu = filemenu
  27. Dim exitItem As New MenuItem("Exit")
  28. AddHandler exitItem.Activated, AddressOf Me.OnActivated
  29. filemenu.Append(exitItem)
  30. mb.Append(fileItem)
  31. Dim vbox As New VBox(False, 2)
  32. vbox.PackStart(mb, False, False, 0)
  33. Me.Add(vbox)
  34. End Sub
  35. Sub OnActivated(ByVal sender As Object, _
  36. ByVal args As EventArgs)
  37. Application.Quit
  38. End Sub
  39. Sub OnDelete(ByVal sender As Object, _
  40. ByVal args As DeleteEventArgs)
  41. Application.Quit
  42. End Sub
  43. Public Shared Sub Main
  44. Application.Init
  45. Dim app As New GtkVBApp
  46. Application.Run
  47. End Sub
  48. End Class

这是一个最小的菜单栏功能示例。

  1. Dim mb As New MenuBar

MenuBar小部件已创建。 这是菜单的容器。

  1. Dim filemenu As New Menu
  2. Dim fileItem As New MenuItem("File")
  3. fileItem.Submenu = filemenu

创建顶层MenuItem

  1. Dim exitItem As New MenuItem("Exit")
  2. AddHandler exitItem.Activated, AddressOf Me.OnActivated
  3. filemenu.Append(exitItem)

将创建出口MenuItem,并将其附加到文件MenuItem中。

  1. mb.Append(fileItem)

顶级MenuItem被附加到MenuBar小部件。

  1. Dim vbox As New VBox(False, 2)
  2. vbox.PackStart(mb, False, False, 0)

与其他工具包不同,我们必须自己照顾菜单栏的布局管理。 我们将菜单栏放入垂直框中。

菜单和工具栏 - 图1

图:简单菜单

子菜单

我们的最后一个示例演示了如何在 GTK# 中创建一个子菜单。

  1. ' ZetCode Mono Visual Basic GTK# tutorial
  2. '
  3. ' This program creates a submenu
  4. '
  5. ' author jan bodnar
  6. ' last modified May 2009
  7. ' website www.zetcode.com
  8. Imports Gtk
  9. Public Class GtkVBApp
  10. Inherits Window
  11. Public Sub New
  12. MyBase.New("Submenu")
  13. Me.InitUI
  14. Me.SetDefaultSize(250, 200)
  15. Me.SetPosition(WindowPosition.Center)
  16. AddHandler Me.DeleteEvent, AddressOf Me.OnDelete
  17. Me.ShowAll
  18. End Sub
  19. Private Sub InitUI
  20. Dim mb As New MenuBar
  21. Dim filemenu As New Menu
  22. Dim ifile As New MenuItem("File")
  23. ifile.Submenu = filemenu
  24. // submenu creation
  25. Dim imenu As New Menu
  26. Dim iimport As New MenuItem("Import")
  27. iimport.Submenu = imenu
  28. Dim inews As New MenuItem("Import news feed...")
  29. Dim ibookmarks As New MenuItem("Import bookmarks...")
  30. Dim imail As New MenuItem("Import mail...")
  31. imenu.Append(inews)
  32. imenu.Append(ibookmarks)
  33. imenu.Append(imail)
  34. // exit menu item
  35. Dim iexit As New MenuItem("Exit")
  36. AddHandler iexit.Activated, AddressOf Me.OnActivated
  37. filemenu.Append(iimport)
  38. filemenu.Append(iexit)
  39. mb.Append(ifile)
  40. Dim vbox As New VBox(False, 2)
  41. vbox.PackStart(mb, False, False, 0)
  42. Me.Add(vbox)
  43. End Sub
  44. Sub OnActivated(ByVal sender As Object, _
  45. ByVal args As EventArgs)
  46. Application.Quit
  47. End Sub
  48. Sub OnDelete(ByVal sender As Object, _
  49. ByVal args As DeleteEventArgs)
  50. Application.Quit
  51. End Sub
  52. Public Shared Sub Main
  53. Application.Init
  54. Dim app As New GtkVBApp
  55. Application.Run
  56. End Sub
  57. End Class

子菜单创建。

  1. Dim imenu As New Menu

子菜单是Menu

  1. Dim iimport As New MenuItem("Import")
  2. iimport.Submenu = imenu

它是菜单项的子菜单,它会登录到顶级文件菜单。

  1. Dim inews As New MenuItem("Import news feed...")
  2. Dim ibookmarks As New MenuItem("Import bookmarks...")
  3. Dim imail As New MenuItem("Import mail...")
  4. imenu.Append(inews)
  5. imenu.Append(ibookmarks)
  6. imenu.Append(imail)

子菜单有其自己的菜单项。

菜单和工具栏 - 图2

图:子菜单

图像菜单

在下一个示例中,我们将进一步探索菜单。 我们将图像和加速器添加到我们的菜单项中。 Accelerators是用于激活菜单项的键盘快捷键。

  1. ' ZetCode Mono Visual Basic GTK# tutorial
  2. '
  3. ' This program shows image
  4. ' menu items, a shorcut and a separator
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Gtk
  10. Public Class GtkVBApp
  11. Inherits Window
  12. Public Sub New
  13. MyBase.New("Image menu")
  14. Me.InitUI
  15. Me.SetDefaultSize(250, 200)
  16. Me.SetPosition(WindowPosition.Center)
  17. AddHandler Me.DeleteEvent, AddressOf Me.OnDelete
  18. Me.ShowAll
  19. End Sub
  20. Private Sub InitUI
  21. Dim mb As New MenuBar
  22. Dim filemenu As New Menu
  23. Dim ifile As New MenuItem("File")
  24. ifile.Submenu = filemenu
  25. Dim agr As New AccelGroup
  26. Me.AddAccelGroup(agr)
  27. Dim inew As New ImageMenuItem("gtk-new", agr)
  28. filemenu.Append(inew)
  29. Dim iopen As New ImageMenuItem(Stock.Open, agr)
  30. filemenu.Append(iopen)
  31. Dim isep As New SeparatorMenuItem
  32. filemenu.Append(isep)
  33. Dim iexit As New ImageMenuItem(Stock.Quit, agr)
  34. AddHandler iexit.Activated, AddressOf Me.OnActivated
  35. filemenu.Append(iexit)
  36. mb.Append(ifile)
  37. Dim vbox As New VBox(False, 2)
  38. vbox.PackStart(mb, False, False, 0)
  39. Me.Add(vbox)
  40. End Sub
  41. Sub OnActivated(ByVal sender As Object, _
  42. ByVal args As EventArgs)
  43. Application.Quit
  44. End Sub
  45. Sub OnDelete(ByVal sender As Object, _
  46. ByVal args As DeleteEventArgs)
  47. Application.Quit
  48. End Sub
  49. Public Shared Sub Main
  50. Application.Init
  51. Dim app As New GtkVBApp
  52. Application.Run
  53. End Sub
  54. End Class

我们的示例显示了具有三个子菜单项的顶级菜单项。 每个菜单项都有一个图像和一个加速器。 退出菜单项的加速器处于活动状态。

  1. Dim agr As New AccelGroup
  2. Me.AddAccelGroup(agr)

要使用加速器,我们创建一个全局AccelGroup对象。 稍后将使用。

  1. Dim inew As New ImageMenuItem("gtk-new", agr)
  2. filemenu.Append(inew)

ImageMenuItem已创建。 图片来自图片库。 GTK# 中有一个错误。 Stock.New与 Visual Basic New关键字冲突。

  1. Dim isep As New SeparatorMenuItem
  2. filemenu.Append(isep)

这些行创建一个分隔符。 它用于将菜单项放入逻辑组。

菜单和工具栏 - 图3

图:图像 menu

菜单将我们可以在应用中使用的命令分组。 使用工具栏可以快速访问最常用的命令。

简单的工具栏

接下来,我们创建一个简单的工具栏。

  1. ' ZetCode Mono Visual Basic GTK# tutorial
  2. '
  3. ' This program creates a
  4. ' toolbar
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Gtk
  10. Public Class GtkVBApp
  11. Inherits Window
  12. Public Sub New
  13. MyBase.New("Toolbar")
  14. Me.InitUI
  15. Me.SetDefaultSize(250, 200)
  16. Me.SetPosition(WindowPosition.Center)
  17. AddHandler Me.DeleteEvent, AddressOf Me.OnDelete
  18. Me.ShowAll
  19. End Sub
  20. Private Sub InitUI
  21. Dim toolbar As New Toolbar
  22. toolbar.ToolbarStyle = ToolbarStyle.Icons
  23. Dim newtb As New ToolButton("gtk-new")
  24. Dim opentb As New ToolButton(Stock.Open)
  25. Dim savetb As New ToolButton(Stock.Save)
  26. Dim sep As New SeparatorToolItem
  27. Dim quittb As New ToolButton(Stock.Quit)
  28. toolbar.Insert(newtb, 0)
  29. toolbar.Insert(opentb, 1)
  30. toolbar.Insert(savetb, 2)
  31. toolbar.Insert(sep, 3)
  32. toolbar.Insert(quittb, 4)
  33. AddHandler quittb.Clicked, AddressOf Me.OnClicked
  34. Dim vbox As New VBox(False, 2)
  35. vbox.PackStart(toolbar, False, False, 0)
  36. Me.Add(vbox)
  37. End Sub
  38. Sub OnClicked(ByVal sender As Object, _
  39. ByVal args As EventArgs)
  40. Application.Quit
  41. End Sub
  42. Sub OnDelete(ByVal sender As Object, _
  43. ByVal args As DeleteEventArgs)
  44. Application.Quit
  45. End Sub
  46. Public Shared Sub Main
  47. Application.Init
  48. Dim app As New GtkVBApp
  49. Application.Run
  50. End Sub
  51. End Class

该示例显示了一个工具栏和四个工具按钮。

  1. Dim toolbar As New Toolbar

Toolbar小部件已创建。

  1. toolbar.ToolbarStyle = ToolbarStyle.Icons

在工具栏上,我们仅显示图标。 没有文字。

  1. Dim opentb As New ToolButton(Stock.Open)

创建带有库存图像的ToolButton

  1. Dim sep As New SeparatorToolItem

这是一个分隔符。 它可用于将工具栏按钮放入逻辑组。

  1. toolbar.Insert(newtb, 0)
  2. toolbar.Insert(opentb, 1)
  3. ...

工具栏按钮插入到工具栏小部件中。

菜单和工具栏 - 图4

图:工具栏

撤销重做

以下示例演示了如何停用工具栏上的工具栏按钮。 这是 GUI 编程中的常见做法。 例如,保存按钮。 如果我们将文档的所有更改都保存到磁盘上,则在大多数文本编辑器中,“保存”按钮将被停用。 这样,应用会向用户指示所有更改都已保存。

  1. ' ZetCode Mono Visual Basic GTK# tutorial
  2. '
  3. ' This program disables/enables
  4. ' toolbuttons on a toolbar
  5. '
  6. ' author jan bodnar
  7. ' last modified May 2009
  8. ' website www.zetcode.com
  9. Imports Gtk
  10. Public Class GtkVBApp
  11. Inherits Window
  12. Private Dim clicks As Integer = 2
  13. Private Dim undo As ToolButton
  14. Private Dim redo As ToolButton
  15. Public Sub New
  16. MyBase.New("Undo redo")
  17. Me.InitUI
  18. Me.SetDefaultSize(250, 200)
  19. Me.SetPosition(WindowPosition.Center)
  20. AddHandler Me.DeleteEvent, AddressOf Me.OnDelete
  21. Me.ShowAll
  22. End Sub
  23. Private Sub InitUI
  24. Dim toolbar As New Toolbar
  25. toolbar.ToolbarStyle = ToolbarStyle.Icons
  26. undo = New ToolButton(Stock.Undo)
  27. undo.Label = "Undo"
  28. redo = New ToolButton(Stock.Redo)
  29. redo.Label = "Redo"
  30. Dim sep As New SeparatorToolItem
  31. Dim quit As New ToolButton(Stock.Quit)
  32. toolbar.Insert(undo, 0)
  33. toolbar.Insert(redo, 1)
  34. toolbar.Insert(sep, 2)
  35. toolbar.Insert(quit, 3)
  36. AddHandler undo.Clicked, AddressOf Me.OnCount
  37. AddHandler redo.Clicked, AddressOf Me.OnCount
  38. AddHandler quit.Clicked, AddressOf Me.OnClicked
  39. Dim vbox As New VBox(False, 2)
  40. vbox.PackStart(toolbar, False, False, 0)
  41. Me.Add(vbox)
  42. End Sub
  43. Private Sub OnCount(ByVal sender As Object, _
  44. ByVal args As EventArgs)
  45. If "Undo".Equals(sender.Label)
  46. clicks += 1
  47. Else
  48. clicks -= 1
  49. End If
  50. If clicks <= 0
  51. undo.Sensitive = True
  52. redo.Sensitive = False
  53. End If
  54. If clicks >= 5
  55. undo.Sensitive = False
  56. redo.Sensitive = True
  57. End If
  58. End Sub
  59. Sub OnClicked(ByVal sender As Object, _
  60. ByVal args As EventArgs)
  61. Application.Quit
  62. End Sub
  63. Sub OnDelete(ByVal sender As Object, _
  64. ByVal args As DeleteEventArgs)
  65. Application.Quit
  66. End Sub
  67. Public Shared Sub Main
  68. Application.Init
  69. Dim app As New GtkVBApp
  70. Application.Run
  71. End Sub
  72. End Class

我们的示例从 GTK# 库存资源创建撤消和重做按钮。 单击几下后,每个按钮均被停用。 按钮显示为灰色。

  1. Private Dim clicks As Integer = 2

clicks变量决定哪个按钮被激活或禁用。

  1. undo = New ToolButton(Stock.Undo)
  2. undo.Label = "Undo"
  3. redo = New ToolButton(Stock.Redo)
  4. redo.Label = "Redo"

我们有两个工具按钮。 撤消和重做工具按钮。 图片来自库存资源。

  1. AddHandler undo.Clicked, AddressOf Me.OnCount
  2. AddHandler redo.Clicked, AddressOf Me.OnCount

我们为两个工具按钮都插入了Clicked事件的方法。

  1. If clicks <= 0
  2. undo.Sensitive = True
  3. redo.Sensitive = False
  4. End If

要激活小部件,我们将其Sensitive属性设置为true。 要停用它,我们将其设置为false

菜单和工具栏 - 图5

图:撤销和重做

在 Visual Basic GTK# 教程的这一章中,我们展示了如何使用菜单和工具栏。