原文: http://zetcode.com/gui/gtksharp/widgetsII/

在 GTK# 编程教程的这一部分中,我们继续介绍 GTK# 小部件。

我们将介绍Entry小部件,Scale小部件,ToggleButtonCalendar小部件。

Entry

Entry是单行文本输入字段。 该小部件用于输入文本数据。

entry.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. Label label;
  5. public SharpApp() : base("Entry")
  6. {
  7. SetDefaultSize(250, 200);
  8. SetPosition(WindowPosition.Center);
  9. BorderWidth = 7;
  10. DeleteEvent += delegate { Application.Quit(); };
  11. label = new Label("...");
  12. Entry entry = new Entry();
  13. entry.Changed += OnChanged;
  14. Fixed fix = new Fixed();
  15. fix.Put(entry, 60, 100);
  16. fix.Put(label, 60, 40);
  17. Add(fix);
  18. ShowAll();
  19. }
  20. void OnChanged(object sender, EventArgs args)
  21. {
  22. Entry entry = (Entry) sender;
  23. label.Text = entry.Text;
  24. }
  25. public static void Main()
  26. {
  27. Application.Init();
  28. new SharpApp();
  29. Application.Run();
  30. }
  31. }

此示例显示了条目小部件和标签。 我们输入的文本将立即显示在标签控件中。

  1. Entry entry = new Entry();

Entry小部件已创建。

  1. entry.Changed += OnChanged;

如果Entry小部件中的文本被更改,我们将调用OnChanged()方法。

  1. void OnChanged(object sender, EventArgs args)
  2. {
  3. Entry entry = (Entry) sender;
  4. label.Text = entry.Text;
  5. }

我们从Entry小部件获取文本并将其设置为标签。

GTK 中的小部件 II - 图1

图:Entry小部件

HScale

Scale是一个小部件,可让用户通过在有限间隔内滑动旋钮以图形方式选择一个值。 我们的示例将显示音量控制。

hscale.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. Gdk.Pixbuf mute, min, med, max;
  5. Image image;
  6. public SharpApp() : base("Scale")
  7. {
  8. SetDefaultSize(260, 150);
  9. SetPosition(WindowPosition.Center);
  10. DeleteEvent += delegate { Application.Quit(); };
  11. HScale scale = new HScale(0, 100, 1);
  12. scale.SetSizeRequest(160, 35);
  13. scale.ValueChanged += OnChanged;
  14. LoadPixbufs();
  15. image = new Image(mute);
  16. Fixed fix = new Fixed();
  17. fix.Put(scale, 20, 40);
  18. fix.Put(image, 219, 50);
  19. Add(fix);
  20. ShowAll();
  21. }
  22. void LoadPixbufs()
  23. {
  24. try {
  25. mute = new Gdk.Pixbuf("mute.png");
  26. min = new Gdk.Pixbuf("min.png");
  27. med = new Gdk.Pixbuf("med.png");
  28. max = new Gdk.Pixbuf("max.png");
  29. } catch {
  30. Console.WriteLine("Error reading Pixbufs");
  31. Environment.Exit(1);
  32. }
  33. }
  34. void OnChanged(object obj, EventArgs args)
  35. {
  36. HScale scale = (HScale) obj;
  37. double val = scale.Value;
  38. if (val == 0) {
  39. image.Pixbuf = mute;
  40. } else if (val > 0 && val < 30) {
  41. image.Pixbuf = min;
  42. } else if (val > 30 && val < 80) {
  43. image.Pixbuf = med;
  44. } else {
  45. image.Pixbuf = max;
  46. }
  47. }
  48. public static void Main()
  49. {
  50. Application.Init();
  51. new SharpApp();
  52. Application.Run();
  53. }
  54. }

在上面的示例中,我们有HScaleImage小部件。 通过拖动比例尺,我们可以在Image小部件上更改图像。

  1. HScale scale = new HScale(0, 100, 1);

HScale小部件已创建。 参数是下边界,上边界和阶跃。

  1. HScale scale = (HScale) obj;
  2. double val = scale.Value;

OnChange()方法中,我们获得了比例小部件的值。

  1. if (val == 0) {
  2. image.Pixbuf = mute;
  3. } else if (val > 0 && val <= 30) {
  4. image.Pixbuf = min;
  5. } else if (val > 30 && val < 80) {
  6. image.Pixbuf = med;
  7. } else {
  8. image.Pixbuf = max;
  9. }

根据获得的值,我们在图像小部件中更改图片。

GTK 中的小部件 II - 图2

图:HScale小部件

ToggleButton

ToggleButton是具有两种状态的按钮:已按下和未按下。 通过单击可以在这两种状态之间切换。 在某些情况下此功能非常合适。

togglebuttons.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. DrawingArea darea;
  5. Gdk.Color col;
  6. public SharpApp() : base("ToggleButtons")
  7. {
  8. col = new Gdk.Color(0, 0, 0);
  9. SetDefaultSize(350, 240);
  10. SetPosition(WindowPosition.Center);
  11. BorderWidth = 7;
  12. DeleteEvent += delegate { Application.Quit(); };
  13. ToggleButton red = new ToggleButton("Red");
  14. red.SetSizeRequest(80, 35);
  15. red.Clicked += OnRed;
  16. ToggleButton green = new ToggleButton("Green");
  17. green.SetSizeRequest(80, 35);
  18. green.Clicked += OnGreen;
  19. ToggleButton blue = new ToggleButton("Blue");
  20. blue.SetSizeRequest(80, 35);
  21. blue.Clicked += OnBlue;
  22. darea = new DrawingArea();
  23. darea.SetSizeRequest(150, 150);
  24. darea.ModifyBg(StateType.Normal, col);
  25. Fixed fix = new Fixed();
  26. fix.Put(red, 30, 30);
  27. fix.Put(green, 30, 80);
  28. fix.Put(blue, 30, 130);
  29. fix.Put(darea, 150, 30);
  30. Add(fix);
  31. ShowAll();
  32. }
  33. void OnRed(object sender, EventArgs args)
  34. {
  35. ToggleButton tb = (ToggleButton) sender;
  36. if (tb.Active) {
  37. col.Red = 65535;
  38. } else {
  39. col.Red = 0;
  40. }
  41. darea.ModifyBg(StateType.Normal, col);
  42. }
  43. void OnGreen(object sender, EventArgs args)
  44. {
  45. ToggleButton tb = (ToggleButton) sender;
  46. if (tb.Active) {
  47. col.Green = 65535;
  48. } else {
  49. col.Green = 0;
  50. }
  51. darea.ModifyBg(StateType.Normal, col);
  52. }
  53. void OnBlue(object sender, EventArgs args)
  54. {
  55. ToggleButton tb = (ToggleButton) sender;
  56. if (tb.Active) {
  57. col.Blue = 65535;
  58. } else {
  59. col.Blue = 0;
  60. }
  61. darea.ModifyBg(StateType.Normal, col);
  62. }
  63. public static void Main()
  64. {
  65. Application.Init();
  66. new SharpApp();
  67. Application.Run();
  68. }
  69. }

在我们的示例中,我们显示了三个切换按钮和一个DrawingArea。 我们将区域的背景色设置为黑色。 切换按钮将切换颜色值的红色,绿色和蓝色部分。 背景颜色取决于我们按下的切换按钮。

  1. col = new Gdk.Color(0, 0, 0);

这是将使用切换按钮更新的颜色值。

  1. ToggleButton red = new ToggleButton("Red");
  2. red.SetSizeRequest(80, 35);
  3. red.Clicked += OnRed;

ToggleButton小部件已创建。 我们将其大小设置为80x35像素。 每个切换按钮都有其自己的处理器方法。

  1. darea = new DrawingArea();
  2. darea.SetSizeRequest(150, 150);
  3. darea.ModifyBg(StateType.Normal, col);

DrawingArea小部件是显示颜色的小部件,由切换按钮混合。 开始时,它显示为黑色。

  1. if (tb.Active) {
  2. col.Red = 65535;
  3. } else {
  4. col.Red = 0;
  5. }

我们根据Active属性的值更新颜色的红色部分。

  1. darea.ModifyBg(StateType.Normal, col);

我们更新DrawingArea小部件的颜色。

GTK 中的小部件 II - 图3

图:ToggleButton widget

Calendar

我们最终的窗口小部件是Calendar小部件。 它用于处理日期。

calendar.cs

  1. using Gtk;
  2. using System;
  3. class SharpApp : Window {
  4. private Label label;
  5. public SharpApp() : base("Calendar")
  6. {
  7. SetDefaultSize(300, 270);
  8. SetPosition(WindowPosition.Center);
  9. DeleteEvent += delegate { Application.Quit(); };
  10. label = new Label("...");
  11. Calendar calendar = new Calendar();
  12. calendar.DaySelected += OnDaySelected;
  13. Fixed fix = new Fixed();
  14. fix.Put(calendar, 20, 20);
  15. fix.Put(label, 40, 230);
  16. Add(fix);
  17. ShowAll();
  18. }
  19. void OnDaySelected(object sender, EventArgs args)
  20. {
  21. Calendar cal = (Calendar) sender;
  22. label.Text = cal.Month + 1 + "/" + cal.Day + "/" + cal.Year;
  23. }
  24. public static void Main()
  25. {
  26. Application.Init();
  27. new SharpApp();
  28. Application.Run();
  29. }
  30. }

我们有Calendar小部件和Label。 从日历中选择的日期显示在标签中。

  1. Calendar calendar = new Calendar();

Calendar小部件已创建。

  1. Calendar cal = (Calendar) sender;
  2. label.Text = cal.Month + 1 + "/" + cal.Day + "/" + cal.Year;

OnDaySelected()方法中,我们将引荐给Calendar小部件,并将标签更新为当前选择的日期。

GTK 中的小部件 II - 图4

图:日历

在本章中,我们结束了有关 GTK# 小部件的讨论。