facebook twitter hatena line google mixi email
★お気に入り追加


  • 1
  •  
  • 2010/04/09(金) 15:12:36
クロスプラットフォーム GUI ライブラリの wxWidgets (旧 wxWindows)についてのスレ。

本家
ttp://www.wxwidgets.org/
wxWindows日本語プロジェクト
ttp://wxwindowsjp.sourceforge.jp/
Cross-Platform Programming with wxWidgets
ttp://wxwidgets.info/
Let's wxWidgets
ttp://dot-gray.s33.xrea.com/
wxWindowsで始めるC++ GUIプログラミング
ttp://www.h3.dion.ne.jp/~k5_n/wxwin/
wxWidgets でクロスプラットフォーム GUIアプリを作ろう
ttp://0xcc.net/pub/uu-2004-08/

前スレ
【GUI】wxWidgets(旧wxWindows) その4【サイザー】
http://pc12.2ch.net/test/read.cgi/tech/1214657360/

ここまで見た
  • 650
  •  
  • 2014/06/19(木) 19:37:20.57
http://www.wxwidgets.org/about/screenshots/
とか

ここまで見た
  • 651
  •  
  • 2014/06/19(木) 19:41:04.43
おーありがとう
後で見て回る
テンプレにあってもいいじゃないかな?

ここまで見た
  • 652
  •  
  • 2014/06/19(木) 20:07:59.88
車の再発見

ここまで見た
  • 653
  •  
  • 2014/06/19(木) 22:56:02.45
商用アプリは
http://wiki.wxwidgets.org/Commercial_applications_using_wxWidgets

ここまで見た
  • 654
  •  
  • 2014/08/20(水) 15:57:43.03
>>644
そんなんあったっけ?

ここまで見た
  • 655
  •  
  • 2014/08/24(日) 18:20:53.22
wxWidgetsで、フォームを閉じる処理をして実際に閉じるまでの間に発生するイベントとかある?
.NETで言うところのOnClosingみたいな感じで。

ここまで見た
  • 656
  •  
  • 2014/08/25(月) 02:12:21.61
OnClose
OnVeto

ここまで見た
  • 657
  •  
  • 2014/08/25(月) 14:23:49.85
>>656
?
おかげで作業が進みました。

ここまで見た
  • 658
  •  
  • 2014/08/26(火) 17:09:00.43
Windows で、
CrossBlock + MinGW + wxWidget
で最も簡単な GUI アプリを基本プロジェクトで作成してみたところ、

MyTest.exe のサイズ:736KB
(wxWidgetのDLL) wxmsw28u_gcc_custom.dll のサイズ : 15.9MB
MyTest.exe のメモリ使用量 : 7,732KB // TaskManagerの表示

となった。

この基本アプリは、HelpでAboutでメッセージ・ボックスが表示できる
ようになっているが、メニュー項目をクリックしてから実際にそれが
出るまで数秒かかる。実験したのはそこそこ速いマシンと速いWindows
での事。

ここまで見た
  • 659
  •  
  • 2014/08/26(火) 17:09:45.00
ただし、遅いのは最初の一回だけ。
一度でも表示すると後は速い。

ここまで見た
  • 660
  •  
  • 2014/08/26(火) 17:56:51.72
Mailer の Thunderbird-Portable なんかもマルチプラットフォーム対応
だけど、起動がかなり遅い。これも巨大な dll を読み込んだりしてる
からかな。

起動やメニュー操作が遅くなるのはマルチプラットフォーム化する代償
として負わされるのかも知れん。

こういうツールキットで軽快なアプリを作るのは難しいのかもな。

ここまで見た
  • 661
  •  
  • 2014/08/26(火) 19:14:34.45
小規模の自作ソフトでwxWidgetsをスタティックリンクしない理由が分からん
わざわざ合計バイナリサイズを大きく、速度も遅くする理由がどこにあるのだろう

ここまで見た
  • 662
  •  
  • 2014/08/26(火) 21:27:38.25
>>661
なるほど、スタティックリンクにすれば、起動後になってからユーザーの
命令に対する応答が遅れる事はなくなるかもしれない。
起動が遅くなるだけで済むんなら、そっちの方がストレスが少ないかも。

ここまで見た
  • 663
  •  
  • 2014/08/26(火) 21:50:56.10
ある程度規模が大きくなるとスタティックリンクだと初回起動が遅すぎになので
dllにモジュールを分割してやったほうがいい
起動時のメモリへのロード時間はどうしようもないのでスプラッシュをつけてごまかす

ここまで見た
  • 664
  •  
  • 2014/08/26(火) 22:39:34.76
CrossBlockでは、monolithic タイプのライブラリをビルドしてから使う
ようになってるんだけど、それも遅い原因なのかな。

でも起動後にユーザー入力に対するレスポンスが遅いのはどう説明すれば
いいんだろう?

普通の Windows の仕様だと原則、起動時に全ての DLL をロードする。
LoadLibrary()を使えば動的にロードすることも可能は可能だけど、
それをする必要は旧OSでサポートしてなかった新OSのDLLをロードする
ような場合は、多言語化のサポートなど。

なるほど、多言語化のせいかも。_("xxx") みたいなのがあったから、
gettext を使ってる。それでリソースを動的ロードしているのか。

ここまで見た
  • 665
  •  
  • 2014/08/27(水) 04:40:25.51
何度かアプリ起動しているうちにWindowsのFetchが学習してくれて
DLLとか先読みしてくれるようにならないのだろうか

ここまで見た
  • 666
  •  
  • 2014/08/27(水) 06:47:58.33
>>665
それはなる。
・ディスクの内容は、メモリにキャッシュされる。
・同じDLLは、全てのアプリで物理メモリが共有されると聞いたことがある。

# >>664 は、CrossBlockではなく、CodeBlocksだった。スマン。

それより、wxWidget 本家のソース配布に入っている samples を
Windows の mingw32 でビルドしてみたところ、全然遅くなかった。

・アプリの起動は速い。
・起動後のメニューコマンドやユーザー入力に対するレスポンスも速い。
・Aboutダイアログも瞬間ではないが、0.3秒程度で、Windows Nativeアプリ
 でも、その程度の遅さはある場合があるので遜色ない。

CodeBlocks で作ったものが遅い原因は今のところ謎。やはり monolithic な
ライブラリを使用しているからか。

ここまで見た
  • 667
  •  
  • 2014/08/27(水) 07:54:18.52
>>666

># >>664 は、CrossBlockではなく、CodeBlocksだった。スマン。

なんだと思ったらわりと素人じゃねえかおい

>CodeBlocks で作ったものが遅い原因は今のところ謎。やはり monolithic な
>ライブラリを使用しているからか。

monolithicってのはwxWidgetsのモジュール全部入りのDLL作るという意味なので遅くて当然
(実際試したことないので遅いというのは初めて知ったが…)

普通は ./configure --prefix=/mingw --enable-shared みたいに指定してビルドするから
モジュールごとに分割されたDLLが作成される
Windows上で開発する時はMinGW + NTEmacs/eclipse CDTの環境がおすすめ

ここまで見た
  • 668
  •  
  • 2014/08/27(水) 09:58:52.27
>>667
最後の段落:多分、wxWidgets 本体を MInGW32 用のビルドする際は、
configure は使えない気がする。
CodeBlocks のQuickなんたらRefの説明では、いきなり、
make するように支持されていた。しかも、-fno なんたら dll-export
みたいなオプションを付けろと指示。これは、MinGW32のバグで、
付けないと最後のldの段階でldがクラッシュする事をたまたま発見。


ところで話は変わって聞いておきたいのですが、 eclipse では
wxWidget のイベントを書くようなときに

・BEGIN_EVENT_MAP に自動的に一行マクロを挿入してくれて
・*.h にもメンバ関数宣言を書いてくれて
・*.cpp にも5行くらいの関数定義本体の雛形を書いてくれ

たりしますか?

ここまで見た
  • 669
  •  
  • 2014/08/27(水) 10:01:06.29
つまり、イベント・ハンドラを追加したとき、

BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
EVT_PAINT (wxListMainWindow::OnPaint)
EVT_MOUSE_EVENTS (wxListMainWindow::OnMouse)
EVT_CHAR (wxListMainWindow::OnChar)
EVT_KEY_DOWN (wxListMainWindow::OnKeyDown)
EVT_KEY_UP (wxListMainWindow::OnKeyUp)
EVT_SET_FOCUS (wxListMainWindow::OnSetFocus)
EVT_KILL_FOCUS (wxListMainWindow::OnKillFocus)
EVT_SCROLLWIN (wxListMainWindow::OnScroll)
EVT_CHILD_FOCUS (wxListMainWindow::OnChildFocus)
END_EVENT_TABLE()

とか、クラスを書くとき

IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow)

見たいなものの自動生成があるとうれしいんですが、そういう IDE
はありません?

ここまで見た
  • 670
  •  
  • 2014/08/29(金) 11:13:03.59
wxWidgetsの問題点の1つは、プログラムのサイズが大きくなる事。
特に静的リンクしたときに顕著。

Windows は、VC++ にて、
ac1rd: CUI の Win32 と printf() を使ったもののリリース・動的リンク版が 16KB程度。
    puts() を使えばもっと小さく出来る。
ac1rs: CUI の Win32 と printf() を使ったもののリリース・静的リンク版が 40KB程度。
    puts() を使えばもっと小さく出来る。
ag2rd: GUI の MFC の 基本的な MDI アプリがリリース・動的リンク版で 36 KB 程度。
ag2rs: GUI の MFC の 基本的な MDI アプリがリリース・静的リンク版で 332 KB 程度。


wxWidgets 2.8.12 の samples では、
bc1rd: CUI の console.exe がリリース・動的リンク版で 138KB
bc1rs: CUI の console.exe がリリース・静的リンク版で 863KB
bc1dd: CUI の console.exe がデバッグ・動的リンク版で 184KB

bg2rd: GUI の keyboard.exe がリリース・動的リンク版で 293KB
bg2rs: GUI の keyboard.exe がリリース・静的リンク版で 2,924KB
bg2dd: GUI の keyboard.exe がデバッグ・動的リンク版で 492KB

ただし、bc1xx は、アプリ本体のプログラムが複雑なことをしているようなので、
もっと小さく出来る可能性があり。

ここまで見た
  • 671
  •  
  • 2014/08/29(金) 19:04:31.75
その説明にac1だの何だの自分以外分からない定義を使う必要があったのだろうか

ここまで見た
  • 672
  •  
  • 2014/08/29(金) 19:07:59.00
今から見るとそうかも。
a: Windows Native or MFC
b: wzWidgets
c: CUI
g: GUI
r:release, d:debug
d:dynamic link, s:static link

ここまで見た
  • 673
  •  
  • 2014/08/30(土) 00:17:55.46
>>668

>最後の段落:多分、wxWidgets 本体を MInGW32 用のビルドする際は、
>configure は使えない気がする。

なにいってんだCodeBlocksのドキュメントにそう書いてあるだけで
基本autotoolsで作られたソースはconfigureでビルドできるぞ
実際自分はWindows上のmingw32/64、LinuxのクロスビルドからのMinGWでconfigure使ってる

なぜMakefileでやれという指示なのかというと、そのほうが簡潔で保守しやすいからだ
あとGNU MakeじゃないMakeでもビルドできるようにしたいとかいう微妙なこだわりが有る場合も有る

>>669
エディタの補助機能を使うべきだ、Emacsなら矩形範囲選択で一気に書ける
ソースのひな形自動生成機能は知らんなあ

ここまで見た
  • 674
  •  
  • 2014/08/30(土) 00:21:29.81
>>670
MinGWビルドでバイナリをストリップしたやつとか比較しないのか

ここまで見た
  • 675
  •  
  • 2014/08/30(土) 07:56:49.02
>>674
Stripに詳しくないので、言っている意味が分からない。

Stripって Release 用に Build した Binary に対して行っても
サイズダウンできたりするの?

ここまで見た
  • 676
  •  
  • 2014/08/30(土) 07:58:19.03
>>674
Stripに詳しくないので、言っている意味が分からない。

Stripって Release 用に Build した Binary に対して行っても
サイズダウンできたりするの?

ここまで見た
  • 677
  •  
  • 2014/08/30(土) 08:15:51.54
日本語インライン入力の対応ってまだなの?
というか予定自体なくて諦めた方がいい?
wxWidgets使ってるEditraってエディタにそろそろ移行できるかなと
思って試してみたら、未だにインライン入力できない

ここまで見た
  • 678
  •  
  • 2014/08/30(土) 08:19:53.34
>>674

小さくなりますた!!


Relese, 動的リンク
/wxWidgets-2.8.12/samples/keyboard/gcc_mswdll/keyboard.exe

strip 前:299,808 bytes
strip 後:124,430 bytes

Relese, 静的リンク
/wxWidgets-2.8.12/samples/keyboard/gcc_msw/keyboard.exe

strip 前:2,993,255 bytes
strip 後:1,887,758 bytes

strip 後も、*.exe が正常に起動することを確認済み。

ここまで見た
  • 679
  •  
  • 2014/08/30(土) 08:22:26.84
>>673
>エディタの補助機能を使うべきだ、Emacsなら矩形範囲選択で一気に書ける

詳しく:

ここまで見た
  • 680
  •  
  • 2014/08/30(土) 11:51:11.86
馬鹿には無理

ここまで見た
  • 681
  •  
  • 2014/08/30(土) 12:02:34.82
スタンド・アローン・コンプレックスと化した馬鹿には無理さんオッスオッス

>>679
cua-modeでググって
http://qiita.com/yyamamot/items/7efcbfdcccdb5fa45ebe

例えばイベントテーブルとかはこれでザクッと一気に書ける
もちろん個々のwxWindowIDとメソッド定義は書かなくてはいけないが
クラス名とマクロ定義は同じ文字列の繰り返しなのでだいぶ楽になる

ここまで見た
  • 682
  •  
  • 2014/08/30(土) 13:53:01.64
>>681
あー、そういう風に沢山のイベントを一気に書きたいんじゃなくて、
開発段階で徐々にイベントを追加して行く際に、

1. *.h のクラス内にメンバ関数宣言
2. *.cpp に EVENT MAP
3. *.cpp に メンバ関数定義の本体

の三箇所にコードを書くのが面倒ということなんだわ。

ここまで見た
  • 683
  •  
  • 2014/08/30(土) 14:33:49.98
>>682
それは自分で作らないと無さげですねえ

ここまで見た
  • 684
  •  
  • 2014/08/30(土) 19:11:57.66
wxFormBuilderでしかGUIとイベントを設計できない俺には何言ってるのかさっぱりわからんぜよ……

ここまで見た
  • 685
  • 678
  • 2014/08/31(日) 15:54:21.95
wxAUI のデモ・アプリ wxauitest.exe のサイズは、1,417,216 bytes。
スタンドアロンのアプリで、環境変数からパスを完全に消去しても起動
できた。つまり、ライブラリはDLLを使わずに静的リンクされている。
wxAUIはFloating & Dockingのできる強力なGUI。

>>678 に示した keyboard.exe はキーボードから押されたキーの値を
表示するだけで、上記アプリよりずっとシンプルなのにも関わらず、
1,887,758 bytes と 470,542 bytes も大きい。

理由は不明。

ここまで見た
  • 686
  •  
  • 2014/08/31(日) 15:56:18.96
そんなことしなくても
DLLの依存関係調べるツールあるのに

ここまで見た
  • 687
  •  
  • 2014/08/31(日) 16:01:12.95
ちなみにwxWidgetsで作った一番小さいexe探したら65kbのがあった

ここまで見た
  • 688
  • 678
  • 2014/08/31(日) 17:34:23.46
Windows実行形式であっても、コンパイラが、MinGW32 と VC++ でサイズに
大幅な違いが出てくるのかな?

ここまで見た
  • 689
  • 678
  • 2014/08/31(日) 17:41:03.82
>>687
それは DLL 版だよ。絶対に。

ここまで見た
  • 690
  •  
  • 2014/08/31(日) 19:56:13.33
>>685
実行ファイルの関数テーブルに何が入っているか nm で確認したら少しはわかるかもね

>>688
大幅とは行かないかもしれないがVC++はWindowsのみをターゲットにしているから
基本的にコンパイル後のバイナリサイズは MinGW > VC++ だよね

ここまで見た
  • 691
  •  
  • 2014/08/31(日) 20:18:05.13
CodeBlocks + MinGW32 で、
wxWidgets の Monolithic、ASCIIライブラリ, 静的リンク で
最も簡単な Frame Based な GUI を作成してみたら、
2,073,600 バイトよりは小さくならなかった。

wxWidgets のライブラリは、
-Os
-ffunction-sections
-fdata-sections
でコンパイルし、
-Wl,--gc-sections -s
でライブラリ化した。その時のコマンド:

mingw32-make -j2 -f makefile.gcc CPPFLAGS="-MD -MP -DHAVE_W32API_H
-D__WXMSW__ -DNOPCH -DwxDEBUG_LEVEL=0 -DNDEBUG" CFLAGS="-mthreads
-fmessage-length=0 -ffunction-sections -fdata-sections -fno-builtin
-Os" CXXFLAGS="-mthreads -Wno-ctor-dtor-privacy -fmessage-length=0
-ffunction-sections -fdata-sections -fno-builtin -Os
-fno-keep-inline-dllexport" LDFLAGS="-Wl,--subsystem,windows
-Wl,--gc-sections -s -mthreads -mwindows"
BUILD=release UNICODE=0 SHARED=0 MONOLITHIC=1


CodeBlocks でアプリのリンクのオプションにも、
-Wl,--gc-sections -s
は付けてある。

ここまで見た
  • 692
  •  
  • 2014/08/31(日) 20:27:38.74
ちなみに、Unicode 版より ASCII 版のほうが小さくなることを確認済みである。

[Compiler settings - #defines]
が、標準では、
__GNUWIN32__, __WXMSW__, WXUSINGDLL, wxUSE_UNICODE, WX_PRECOMP
となるところを:
__GNUWIN32__, __WXMSW__
だけとし、

[Search Directories] の Compiler, Linker, Compiler
の、gcc_dll の部分を、gcc_lib に変えた。

アプリにリンクするリンクライブラリとしては、上記で作成した Monolithic
ライブラリだけでは足りず、以下が必要であった。Win32のimport libraryは、
ライブラリを動的リンクする場合はライブラリのDLLが行っているので必要ない
が、ライブラリを静的リンクする場合は、アプリが直接リンクする必要がある
ため必要となるのは理解できる。libwxpng, libwxjpeg, libwxtiff, libwxzlib
が必要となった理由は不明。

libwxmsw28 // これが wxWidgets の monolithic ライブラリ本体。
libwxpng
libwxjpeg
libwxtiff
libwxzlib
libuuid // Win32 の import library
libcomctrl32 // Win32 の import library
libwinspool // Win32 の import library
liboleaut32 // Win32 の import library
libole32 // Win32 の import library

ちなみに、wxWidgets を動的リンクする場合は、ここが、libwxmsw28
だけで済む。

ここまで見た
  • 693
  •  
  • 2014/08/31(日) 20:33:24.61
誤:[Search Directories] の Compiler, Linker, Compiler
正:[Search Directories] の Compiler, Linker, Resource Compiler

誤:Win32のimport libraryは、ライブラリを動的リンクする場合はライブ
  ラリのDLLが行っているの
正:wxWidgets ライブラリをアプリに動的リンクする場合は
  wxWidgets ライブラリの DLL 部分が Win32 の import library の
  リンクを行っているの

ここまで見た
  • 694
  •  
  • 2014/08/31(日) 20:45:44.37
サイズはどうでもよくないか。exeを使う側としては速度では?
あとコア、主要のライブラリのビルドから、ダイナミックリンクを徹底してOSに丸投げしたら小さくなるだろ。

ここまで見た
  • 695
  •  
  • 2014/08/31(日) 20:48:05.22
完全テンプレートライブラリにしたら軽くなるんだろうか

ここまで見た
  • 696
  •  
  • 2014/08/31(日) 20:58:57.78
>>694
でも wxWidgets がやっていることの割にはリンクされるバイト数が多すぎる
感じがする。
基本、Win32をラッピングしているだけなのだから、2MBも必要ない。

ここまで見た
  • 697
  •  
  • 2014/08/31(日) 21:00:34.83
ラッピングしてるだけじゃなくマルチプラットフォームのために徹底した抽象化をしてるんでしょ
とソースも読まず推測

ここまで見た
  • 698
  •  
  • 2014/08/31(日) 21:04:00.35
>>697
でもソースを呼んでみたら、たとえば、wxListCtrl なんかは、
Win32 の LIST CONTROL をそのまま使っていた。
DrawRect()などで書いているわけではない。
ただし、wxGenericListCtrl だったかは、DrawRect()みたいなグラフィック
関数で独自に描画していた。が、それは、Windows版では簡単には使えない
という噂を聞いたが。

ここまで見た
  • 699
  •  
  • 2014/08/31(日) 21:06:47.60
>>697
wxWidgets の基本設計は、Widgetは、OS nativeの物を使うが、
どんなサイズであっても対応できるように Sizer で Layout を
コントロールする、という物。

なので、抽象化はサイズと配置程度で済むはずなのだが・・・。

ここまで見た
  • 700
  •  
  • 2014/08/31(日) 21:09:35.31
>>696

>>697の言ってることが正しい。

---------------------
    wxWidgets
---------------------
Win32 | GTK | Cocoa etc...
---------------------

wxWidgetsは通常のGUI用ライブラリに一枚レイヤを重ねた形になるので
型情報・関数テーブルの情報だけで結構容量食う

>>692
ASCIIモードでビルドするのはやめておいたほうがいい
日本語使えないし

というかなぜMonolithicビルドにこだわるのか…
普通にconfigureからビルドしてdllごと配布したほうが立ち上がりは早い

フリックゾンビ
フリック回転寿司
ここまで見た

★お気に入り追加

このページを共有する
facebook twitter hatena line google mixi email
おすすめワード