2017年4月28日金曜日

C# VisualStudio for Mac でGtk#を使ってみた。gtk-sharp

「VisualStudio for Mac」を入れてはみたが、
MacのGUI作るのに「Gtk#」使っている人を見ないのでちょっと触ってみました。
(「Xamarin.Form」はMac非対応です。
 「Xamarin.Mac」から「cocoa」のUIを使った方がMacライクなUIになります。)
「Gtk#」は「Gtk+」のC#版です。
ついでに「Gtk#」を使って、
Windowsとのクロスプラットフォーム開発がどの程度できるかテストしてみます。


Macで「Gtk#」を使ってみる


とりあえず新しいプロジェクトを作成。
「Gtk#」を選びます。

私は「testGtk」の名前で新規プロジェクトを作成しました。

「ユーザーインターフェィス」の「MainWindow」を選択すると、

無事に「デザイナ」が立ち上がりました。
コントロールを配置します。
「ツールボックス」から「Fixed」を配置。
続いて「Button」と「Label」を配置します。
「button1」のプロパティを変更します。
「Button Properties」の「Label」を
「GtkButton」から「開始」に変更して下さい。

「デザイナ」の下にチラ見している「ソース」を選択すると、
ソースコードが表示されます。

「MainWindow」クラス内の一番下に以下のコードを追加します。
  //ボタンクリックイベント
  protected void ButtonClicked_Event(object sender, EventArgs e)
  {
    var task = System.Threading.Tasks.Task.Run(new System.Action(()=>{
      for (int i = 0; i < 6; i++)
      {
        label1.Text = zenRep(i.ToString()) + "秒";
        System.Threading.Thread.Sleep(1000);
      }
    }));
  }

  // 半角文字列を全角文字列へ変換
  private string zenRep(string s)
  {
    var resultStr = s;
    resultStr = System.Text.RegularExpressions.Regex.Replace(resultStr, "[0-9]", (p) => ((char)(p.Value[0] - '0' + '0')).ToString());
    resultStr = System.Text.RegularExpressions.Regex.Replace(resultStr, "[A-Z]", (p) => ((char)(p.Value[0] - 'A' + 'A')).ToString());
    return resultStr;
  }

コードを追加したら、表示を「デザイナ」に戻して
「ボタン」の「シグナル」の「clicekd」イベントの「ハンドラー」へ
クリックイベントのメソッド名を入れます。
「ButtonClicked_Event」と入力して下さい。



これで完成です。
「コマンド+エンター」等で「実行」してみましょう。
以下のようなFormが表示されます。



開始ボタンを押してみると…

無事「0秒」〜「5秒」までカウントされます。



クラスプラットフォーム化


クロスプラットフォームで動くかテストする為に、
完成した「VisualStudio for Mac」の「ソリューション」をフォルダごと
「Windows」側へコピーするか、共有して下さい。

次に、
「Gtk#for.NET」を「Windows」にインストールします。
「Windows」で以下のサイトへ行きます。
http://www.mono-project.com/download/#download-win
以下のファイルをダウンロード。


インストールを進めて下さい。

問題なくインストールが終了したら、
「Windows」の「VisualStudio」で「ソリューション」を開き、
実行してみて下さい。


「Windows」側でも無事動きました。
「0秒」〜「5秒」までカウントされます。
非同期処理も問題無く動いています。


感想


簡単な物であればすぐ実用に使えそうな気がします。
UIの見え方は「Gtk#」独特の物となりますが、
「Mac」と「Windows」のUIを共通で気軽に作れるのは凄く魅力的です。
ただ今の所、
プラットフォーム毎のショートカットの制御がわかりません。
誰か教えて下さい…

「Gtk#」のチュートリアルはここ。
http://www.mono-project.com/docs/gui/gtksharp/tutorials/

「Windows」側でのGUIデザイナ用エディタについて…
「Stetic」→「Monodevelop」「Xamarin Studio」に含まれている。「Gtk2」のみ対応
「Glade」→「Gtk2」「Gtk3」両方に対応
「VisualStudio」に組み込まれたGUIデザイナは今の処存在しない。
直接コードで書く事も選択肢に入るかも…。
http://grbd.github.io/posts/2016/01/29/gtksharp-part-2-setting-up-glade/

補足
「Gtk#」でダイアログを表示させる。
        //「Gtk#」のダイアログ
        //「using」は使えないので注意
        var md = new MessageDialog(
            this, DialogFlags.Modal, MessageType.Info,
            ButtonsType.Ok, "てすと\r\nテスト");
        md.Run();
        md.Destroy(); //←「Dispose()」は使えないので注意
ちょっと面倒な印象。
参考→http://7shi.hateblo.jp/entry/2012/04/24/233941



個人的メモ…

MacOS10.11.6上でlabelの半角欧文が文字化けした際、
解決はしなかったが勉強になったサイト。
「Gtk#」の日本語が文字化けに関する対処が書かれている。
http://kki-zakki.blogspot.jp/2008/12/monodevelop-20-alphamac-os-x.html

https://discussionsjapan.apple.com/thread/10052914?start=0

「gtkrc」ファイルをいじる
→「Visual Studio.app/Contents/Resources/lib/monodevelop/bin」
http://reiji1020.hatenablog.com/entry/2012/07/12/203443

フォント「サンフランシスコ」入れてもダメだった
https://www.ipentec.com/document/document.aspx?page=software-font-download-apple-san-francisco
https://developer.apple.com/fonts/

欧文系は全部試してダメだったので、たぶん日本語フォントっぽい。

「SuitcaseFusion」の問題だったみたい。
「Helvetica」をシステムから引っ張り出して、
「SuitcaseFusion」へ登録し直したら解決した。


winとmacのクロスプラットフォームなGUIならば
「electron.net」を検討してみるのも良いかも


teratail:Macで開発できるまでの手間が少なくて、
MacとWindowsで動作するGUIの
Twitterクライアントを作るにはどの言語が良いでしょうか。
https://teratail.com/questions/65420

0 件のコメント:

コメントを投稿

↑Topへ