mono で MessageBox.Show() もどき
Gtk# で System.Windows.MessageBox.Show() を実装。
使いたかったので作ってみたけど GtkMessageDialog を素直に使ったほうがいい...
使いたかったので作ってみたけど GtkMessageDialog を素直に使ったほうがいい...
コードとビルド
using System; using Gtk; /* * Gtk# による MessageBox.Show 関数もどき * Windows 名前空間を参照で利用する人は使ってはいけません。 */ namespace System.Windows { public enum MessageBoxButton { Ok, OkCancel, YesNo, YesNoCancel }; public enum MessageBoxImage { DialogAuthentication, //鍵アイコン、Gtk のみ Asterisk, //About でまかなう Error, Exclamation, //Warning と共通 Hand, //VisualStudio もエラーアイコン? Infomation, None, Question, Stop, Warning }; /// <summary> /// System.Windows.MessageBox のラップ /// </summary> public class MessageBox { public static ResponseType Show(string text, string caption, MessageBoxButton type, MessageBoxImage icon) { Dialog d = new Dialog(); d.Title = caption; d.HasSeparator = false; d.BorderWidth = 6; d.Resizable = false; HBox h = new HBox(); h.BorderWidth = 6; h.Spacing = 12; Gtk.Image i; switch (icon) { case MessageBoxImage.Asterisk: i = new Image(); i.SetFromStock(Stock.About, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.Hand: case MessageBoxImage.Error: i = new Image(); i.SetFromStock(Stock.DialogError, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.Infomation: i = new Image(); i.SetFromStock(Stock.DialogInfo, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.Question: i = new Image(); i.SetFromStock(Stock.DialogQuestion, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.Stop: i = new Image(); i.SetFromStock(Stock.Stop, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.Exclamation: case MessageBoxImage.Warning: i = new Image(); i.SetFromStock(Stock.DialogWarning, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; case MessageBoxImage.DialogAuthentication: i = new Image(); i.SetFromStock(Stock.DialogAuthentication, IconSize.Dialog); i.SetAlignment(0.5f, 0); h.PackStart(i, false, false, 0); break; } Label l = new Label(text); l.LineWrap = true; h.PackEnd(l); h.ShowAll(); d.VBox.Add(h); switch (type) { case MessageBoxButton.Ok: d.AddButton(Stock.Ok, ResponseType.Ok); break; case MessageBoxButton.OkCancel: d.AddButton(Stock.Cancel, ResponseType.Cancel); d.AddButton(Stock.Ok, ResponseType.Ok); break; case MessageBoxButton.YesNo: d.AddButton(Stock.Yes, ResponseType.Yes); d.AddButton(Stock.No, ResponseType.No); break; case MessageBoxButton.YesNoCancel: d.AddButton(Stock.Yes, ResponseType.Yes); d.AddButton(Stock.No, ResponseType.No); d.AddButton(Stock.Cancel, ResponseType.Cancel); break; } int result = d.Run(); d.Destroy(); return (ResponseType)result; } public static ResponseType Show(string text, string caption, MessageBoxButton type) { Dialog d = new Dialog(); d.Title = caption; d.HasSeparator = false; d.BorderWidth = 6; d.Resizable = false; HBox h = new HBox(); h.BorderWidth = 6; h.Spacing = 12; Label l = new Label(text); l.LineWrap = true; h.PackEnd(l); h.ShowAll(); d.VBox.Add(h); switch (type) { case MessageBoxButton.Ok: d.AddButton(Stock.Ok, ResponseType.Ok); break; case MessageBoxButton.OkCancel: d.AddButton(Stock.Cancel, ResponseType.Cancel); d.AddButton(Stock.Ok, ResponseType.Ok); break; case MessageBoxButton.YesNo: d.AddButton(Stock.Yes, ResponseType.Yes); d.AddButton(Stock.No, ResponseType.No); break; } int result = d.Run(); d.Destroy(); return (ResponseType)result; } public static ResponseType Show(string text, string caption) { Dialog d = new Dialog(); d.Title = caption; d.HasSeparator = false; d.BorderWidth = 6; d.Resizable = false; HBox h = new HBox(); h.BorderWidth = 6; h.Spacing = 12; Label l = new Label(text); l.LineWrap = true; h.PackEnd(l); h.ShowAll(); d.VBox.Add(h); d.AddButton(Stock.Ok, ResponseType.Ok); int result = d.Run(); d.Destroy(); return (ResponseType)result; } public static ResponseType Show(string message) { MessageDialog d = new MessageDialog( null,//(Window)this, Gtk.DialogFlags.Modal, Gtk.MessageType.Other, Gtk.ButtonsType.Ok, message); int result = d.Run(); d.Destroy(); return (ResponseType)result; } } }
messagebox.cs という名前で保存したとします。
普通に *.cs 指定で利用してもいいけどココではライブラリとして使う方法を。
コレを -target:library にてビルド、-lib 位置は各自で確認。
#!/bin/sh gmcs \ -lib:/usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f \ -reference:gtk-sharp.dll \ -target:library \ messagebox.cs
動作確認
/* test.cs */ using System; using Gtk; using System.Windows; class GtkSharpTest : Window { private void Quit(object sender, EventArgs e) { Application.Quit(); } private void Click(object sender, EventArgs e) { MessageBox.Show("メッセージ"); } public GtkSharpTest(string title) : base(title) { var b = new Button("MessageBox Show"); b.Clicked += Click; Add(b); DeleteEvent += Quit; ShowAll(); } } class __init__ { public static void Main() { // GtkSharp 初期化 Application.Init(); new GtkSharpTest("タイトルバー"); Application.Run(); } }ビルドは -reference に作成した messagebox.dll を含める。
説明不要だろうけど Linux では -target:winexe にする必要は無い。
#!/bin/sh gmcs \ -lib:/usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f \ -reference:gtk-sharp.dll \ -reference:messagebox.dll \ -target:exe \ test.cs
んで。
mono test.exe
mbox.tar.xz
だから GtkMessageDialog のほうがいいよ。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.