1 名前:デフォルトの名無しさん mailto:sage [03/05/06 11:04] クロスプラットフォームGUIライブラリのwxWindowsについて語りましょう。 本家 www.wxwindows.org/ dW : Linux : wxWindowsの概要 www-6.ibm.com/jp/developerworks/linux/010413/j_l-wxwin.html SunWorld Online:wxWindows――無名だが成熟したGUIツールキット www.idg.co.jp/sw/back/200102/20010219_01_report.html メルマガ www.mag2.com/m/0000108320.htm 1はこれからインストールします
449 名前:の [03/09/20 13:31] >446 VC++.net/MS-WindowsではwxEvtHandler::ConnectでOKですた。 #ソースをハックしないと何指定すればいいかわからないのは難点ですな class MyApp : public wxApp { virtual bool OnInit() { wxFrame* frame = new wxFrame(0, wxID_ANY, wxT("TITLE")); wxPanel* panel = new wxPanel(frame); MyWindow* window = new MyWindow(panel); panel->Connect( wxID_ANY, wxEVT_SIZE, (wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction) MyWindow::OnSize); frame->Show(TRUE); return TRUE; } };
450 名前:466 mailto:sage [03/09/20 14:29] >>449 素早いお返事ありがとうございます。 しかしその方法ではMyWindow::OnSize内でthisは使えませんよね。 …というかそもそもイベントハンドラ内でthisは使っちゃいけないんでしょうか。 だとしたら俺すごいあほですね。。。
451 名前:466 mailto:sage [03/09/20 16:05] すいません。どうやらwxPanel自体がそういう仕様のようです。 つまりwxPanelに載せたオブジェクトはwxFrameに載せた場合と異なり、 明示的に指示しない限りリサイズされないようです。 MyWindowの代わりにwxButtonで確めました。 結局MyWindowの使用者は、wxPanelに載せる場合wxPanel#OnSizeから ProcessEventでMyWindow#OnSizeを呼び出してあげるのが正攻法ということでしょうか。 自己レスですが、 >イベントハンドラ内でthisは使っちゃいけないんでしょうか。 いいみたいです。でもConnectで異なるオブジェクトから接続すると thisが変わってしまいますのでやらない方が無難です。 代わりにwxWindow#PushEventHandlerが使えるような気がしたのですが OnGtkだと正しいthisで呼び出された直後にSearchEventTableの中でセグってしまいます。 (サンプルではPushEventHandlerは同一クラス内でしか使用してない) こういう使い方をするものじゃないかもしれません。
452 名前:の [03/09/20 17:51] >450 >しかしその方法ではMyWindow::OnSize内でthisは使えませんよね。 はっ、そういやオブジェクト渡していない…… ->*ではないみたいですね。 マニュアルに書いてある通り、あくまで"静的イベントテーブルの使用に代わるもの" か……ほかのオブジェクトへのコールバックには使えないですね。 m_parent->Connect(wxID_ANY, wxID_ANY, wxEVT_SIZE, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &MyWindow::OnSize, window); } として wxEvent::m_callbackUserData 越しのアクセスである程度うまくいくけど…… panelを削除するときに、先に削除したwindowにアクセスしにいってエラーになるなぁ どうしたもんだか……
453 名前:デフォルトの名無しさん [03/09/22 10:12] MicroWindowsとwxWindowsってどういう関係でしたっけ? 自分の記憶では、DOSでMicroWindowsが動作して、 wxWindowsはMicroWindowsがあれば動作できましたっけ? 知りたいのは、DOSでwxWindowsを動作させるには、だったりして。
454 名前:の [03/09/23 01:20] www.wxwindows.org/wxuniv.htm にwxMicroWindows projectについての記載があるけれど……まだまだみたいだね。 # まだ生きてるのかな? 活発な印象は受けないけど……
455 名前:の [03/09/23 01:41] 2.4.2がリリースされましたな。 バグとりが中心のようです。
456 名前:デフォルトの名無しさん [03/09/23 14:09] >>454 wxMicroWindowsでDOS動作なんだー。 まだツカテナイケド便利。
457 名前:の [03/09/23 14:42] 最近だとwxEmbeddedというくくりになってますな、Microwindows www.wxwindows.org/embedded.htm 興味ないからあまりトレースしないけど……
458 名前:デフォルトの名無しさん mailto:sage [03/09/23 17:27] 起動時に既にそのアプリケーションが起動しているかどうか調べたいんですが どうすればいいのでしょう?ポインタだけでもいいです。 あと、もしそれができるのであれば、WindowsのPostMessageのように その既に開いているウィンドウに通知したいのです。宜しくお願いします。
459 名前:デフォルトの名無しさん mailto:sage [03/09/23 17:32] 質問ばっかりでアレなのでちょっとしたTips。 Windows版の時にwxWindow#GetHandle()で返ってくるのは描画領域を持つHWNDですが、 GTK+版では描画領域(GdkWindow)を持たないGdkScrolledWindowが返ってきます。(GetHandle(){return m_widget}) GdkWindowを持っているのはwxWindow#m_wxwindow(GTK_PIZZA型 win_gtk.h)なので ネイティブなウィンドウに描画する場合はその部分だけ#ifで分けねばなりません。 ちなみにwxWindow#m_wxwindowはwxWindow#m_widgetの子供になっているので gtk_container_children(GTK_CONTAINER(wxWindow#m_widget))->data == wxWindow#m_wxwindow となります。 ま、あまり使う人はいなさそうですが結構苦労したのでメモっときます。
460 名前:思兼 ◆l3iwkTImVo mailto:sage [03/09/23 18:53] >>458 プロセス間通信までしたいのなら www.wxwindows.org/manuals/2.4.1/wx498.htm 同じアプリが動いているかどうか確かめるだけならこっちのほうが楽 www.wxwindows.org/manuals/2.4.1/wx340.htm 結局日本語化はBorlandがやってくれるのかな?プロコンまで3週間切ったけど,どうせ 漏れが翻訳してもBorlandみたいな企業が使ってくれるようなドキュメントにならないと 思うのだが. それよりはEclipse用にwxWindowsプラグインでも作ったほうが良いかも.まぁEclipseは CDTがまだ使い物にならないけどね.
461 名前:デフォルトの名無しさん mailto:sage [03/09/23 20:00] >>460 ぐはっ!wxSingleInstanceCheckerってそのまんまの名前ですね。ありがとうございます。 日本語訳あるかどうか見に行こうとしたらメンテナンス中だって言われてしまった。
462 名前:灰@もっぱらPerler, C++に戻りたい… ◆v/.u/aNe9w mailto:sage [03/09/23 23:38] 日本語プロジェクトのお話スマソ。 >>460 > 結局日本語化はBorlandがやってくれるのかな?プロコンまで3週間切ったけど,どうせ どうやら、C++BuilderXはC++Builder6の後継開発環境臭いですね。 Kylix的位置付けなら英語マニュアルしかないのも考えられるけど、 日本語のマニュアルが今まで付属していた既存パッケージの後継であれば、 当然のように日本語圏用のパッケージには日本語マニュアルが付属する可能性は高いッス。 むむむ。 しばし、静観するしかないですな。 時期を見てボーランドに問い合わせでもしてみるべ。 wx340.html 翻訳してもいいかしら?
463 名前:デフォルトの名無しさん mailto:sage [03/09/24 01:43] >>460 >漏れが翻訳してもBorlandみたいな企業が使ってくれるようなドキュメントにならないと >思うのだが. そのあきらめのよさは一体・・・ せっかくなんだからBorlandにコンタクトとってみたら? 多分外注に一括して翻訳依頼出すんだろうから 逆に翻訳予定のないところを聞いてそこから手をつけるとか。
464 名前:デフォルトの名無しさん mailto:sage [03/09/24 02:03] 某はwxWindowsのドキュメントのみをフリーで公開する気があるんだろうか。 personalとは別にドキュメントだけで。
465 名前:デフォルトの名無しさん mailto:sage [03/09/24 03:32] それはない。
466 名前:灰 ◆v/.u/aNe9w mailto:sage [03/09/24 08:54] ヤフー! SFメンテ中でまだ読めませんが、 wxSingleInstanceChecker の翻訳ageますた! >>463 そうですね、早めに問い合わせしてはっきりさせた方が、 無駄がなくてよさげですね。 >>464-465 > Rest assured that Borland is adapting itself to wxWindows' open source nature, がどこまでを意味しているかですね、むむむむ。
467 名前:灰 ◆v/.u/aNe9w mailto:sage [03/09/24 09:07] ボーランドへの問い合わせのタイミングは、 日本法人からのC++BuilderXかwxWindowsに関する正式発表がでたあたりかな。 今のところ、それらの名前は一切出てないみたいですから、 今問い合わせしてもフライングかと思われ。
468 名前:デフォルトの名無しさん mailto:sage [03/09/24 21:55] MSYSにwx2.4.2をconfigure;make;make installして正常終了、wx-config等のコマンドも通るのに | hoge.cpp:4: wx/wxprec.h: No such file or directory | hoge.cpp:9: wx/wx.h: No such file or directory とincludeファイルが見つからないというようなエラーでコンパイル止まるのはどういうわけなんでしょう… 独自にパスを通さなきゃいけないんですかね
469 名前:デフォルトの名無しさん mailto:sage [03/09/24 22:07] まずは大人しくreadmeにしたがってみる事にします to compile with optimizations: > cd c:\wx\src\msw > make -f makefile.g95 clean > make -f makefile.g95 FINAL=1 > cd c:\wx\samples\minimal > make -f makefile.g95 cleanall > make -f makefile.g95 FINAL=1
470 名前:思兼 ◆l3iwkTImVo mailto:sage [03/09/24 22:42] >>468 いちおう確認.バッククォートって知ってる? wx-configはバッククォートでくくってgccにオプションを渡して使う. あと,INCLUDEパスには関係ない話だからそのコンパイルエラーには関係ないけど, gccがリンクする順序の関係で,wx-configのオプションはソースファイルより後ろに 置かないといけない.
471 名前:デフォルトの名無しさん mailto:sage [03/09/24 22:58] >470 レスサンクス とりあえずunix系の知識は軽くあるんで``でのサブシェル実行(って言っていいんだよな・・)は分かってる。 gccのバージョンを差し替えたり色々環境をいじり壊してたんでこの機にMinGW MSYS wx全部再インストールすることにした。 今make中です
472 名前:灰 ◆v/.u/aNe9w mailto:sage [03/09/24 23:13] >>471 もし、再インストールしてもエラーが出てしまうようなら、 MSYS 環境は良くわからないが、 試しに echo `wx-config --cppflags` して、インクルードパスがどうなっているか見てみるといいかも。 おかしければ、wx-config はシェルスクリプトなので、 直接修正しちゃう手もアリかもしれないッス。
473 名前:デフォルトの名無しさん mailto:sage [03/09/24 23:24] 吐き出されたlibとincludeをみんぐーのフォルダにコピーしたら問題無しでした。バカみたい(ノД`) スレ汚しスマソ
474 名前:デフォルトの名無しさん mailto:sage [03/09/25 00:30] それをしないためのwx-configなのだが・・・
475 名前:デフォルトの名無しさん mailto:sage [03/09/25 01:25] >>473 環境変数WXWINをC:\wxWindowsとかにしてないかい? みんぐーは"\"でなく"/"にしないと-Iオプションのいみないかもよ
476 名前:デフォルトの名無しさん mailto:sage [03/09/25 02:03] リソース扱う物が #error "wxr resources require PrologIO" で止まるなぁ・・・ 検索して出てくるとこも入手先書いてないし ( mitbates.mit.edu/oops/Html/SW/wxwin/prologio/proio6.htm )
477 名前:思兼 ◆l3iwkTImVo mailto:sage [03/09/25 03:24] >>476 それはconfigureのオプションだったと思います. confiugre --helpで,prologなんちゃらをEnableにするオプションが無いかどうか 調べてみてください.
478 名前:デフォルトの名無しさん mailto:sage [03/09/25 15:30] wxXmlResourceでxrcファイルに日本語が使えないんですけどどうすればいいんですかね? UTF-8で書くと化けるし、Shift_JISやEUC-JPだと Cannot convert from encoding 'EUC-JP'! とかwxLogErrorで言われちゃいます。 ちゃんとXMLファイルのencoding指定とファイルの文字コードは合ってるんだけど。 環境はWindows2000+wxWindows2.4.1です。 Gtk+でも確かできなかったような覚えがあります。 ・・・って今思ったんですけどUNICODEビルドすればUTF-8でいけるんですかね。 ちょっと試してみますけど明日になっちゃうので、どなたか既に情報をもっていらっしゃったらお願いします。
479 名前:デフォルトの名無しさん mailto:sage [03/09/25 19:24] >>478 XRCはXMLパーザが原因で日本語通らなかったはず Unicodeビルドしても変わらないんじゃないかな ただwxXmlResourceはwxLocaleを設定してやれば getopt風のメッセージ変換してくれるから poファイル用意してやれば一応日本語は出せるよ (Windowsでしか確認していないけどね) 中途半端な情報スマソ
480 名前:デフォルトの名無しさん mailto:sage [03/09/25 21:03] >>479 > getopt風のメッセージ変換してくれるから > poファイル用意してやれば一応日本語は出せるよ それは gettext
481 名前:デフォルトの名無しさん mailto:sage [03/09/25 22:55] >>480 半端な上に嘘書いちゃったよスマソ
482 名前:灰 ◆v/.u/aNe9w [03/09/26 00:32] News Release www.borland.co.jp/news/cbuilderx_ja.html C++BuilderX (Enterprise|Developer) 9/29 に発売。 Perlsonal 版は無償なり。 だだし、 > 2003年10月中旬より、弊社Webサイトにて無償ダウンロードサービス(商業開発不可)を開始する予定です。 らしい。 製品情報はこちら www.borland.co.jp/cbuilderx/index.html 関連スレ: C++Builder相談室 Part7 pc2.2ch.net/test/read.cgi/tech/1061594556/219-
483 名前:デフォルトの名無しさん mailto:sage [03/09/26 00:36] 商業開発不可版のドキュメントでひたすら勉強してあとは本家をゲフゲフ
484 名前:灰 ◆v/.u/aNe9w mailto:sage [03/09/26 00:43] 製品情報からの引用 > C++BuilderXは、ボーランドが今まで提供してきたGUIを伴うアプリケーションに主軸 > をおいた「C++Builder」の直接的な後継製品ではありません。ビジュアルデザイナや > ウィザードなど、従来のC++Builderで提供されてきたような機能は含まれていませ > ん。 RADがないのか。残念。 んで、なんだかKylixと近い扱いみたいですね。 >>483 日本語マニュアルつかない予感。
485 名前:思兼 ◆l3iwkTImVo mailto:sage [03/09/26 00:46] www.borland.com/cbuilderx/tour/C%2B%2BBuilderX%20Turbo%20Demo.htm このデモを見ると,一応RADっぽくコンポーネントをぺたぺた貼り付けられるみたいだよ.
486 名前:デフォルトの名無しさん mailto:sage [03/09/26 00:53] >日本語マニュアルつかない予感。 翻訳し放題でよかったじゃん(藁 とりあえずGUI抜きのgccの統合開発環境として使い物になればいいや。 ってスレ違いだけど。
487 名前:灰 ◆v/.u/aNe9w mailto:sage [03/09/26 01:07] >>485 んじゃ、今までより機能が落ちるデザイナが付属する感じなのかな? >>486 > 翻訳し放題でよかったじゃん(藁 蓋が開けられるまで確かなことはいえないですが、 嬉しいような悲しいような…。 本音は日本語マニュアルが付属する方がうれしいなぁ。 正直、自分の翻訳に自信ないしー。
488 名前:デフォルトの名無しさん mailto:sage [03/09/27 08:22] >>479 レスどうもありがとう。 > XRCはXMLパーザが原因で日本語通らなかったはず > Unicodeビルドしても変わらないんじゃないかな そうですか。残念です。 今日初めて気づいたんですが、Gtk版ってUNICODEビルドがないんですね。 いまいちUNICODEビルドが何なのか分からないんですが、どなたか解説願えませんか? > ただwxXmlResourceはwxLocaleを設定してやれば > getopt風のメッセージ変換してくれるから > poファイル用意してやれば一応日本語は出せるよ > (Windowsでしか確認していないけどね) 今はこれでやってます。 ただいろいろと問題や悩みがあって、 ・_Fileに対応するmsgstrが&Fileで直観的ではないし、xgettextで取り出すとsedをかまさなきゃいけない ・下の二つのどちらにしようかという悩み 1.xrcの方を_Fileとしてja.poでファイル(&F)とする 2.xrcの方をFileとしてen.poで&File、ja.poでファイル(&F)とする poを使うとメッセージの翻訳にインターフェイス(キーバインド)の定義も含まれてしまうから、 キーバインドを変えるためだけにユーザがpoを編集してmsgfmtしなければいけないのが大きな悩みです。 それから、多言語での整合性を取るためにxrcの方で指定するラベルやツールチップ文字列等に 決まった文字列を使わなければならないという悩みもあります。 それならいっそのことインターフェイスの定義に翻訳も含めてしまうのがいいのではないかと。 (というか、翻訳ってインターフェイスの一部ですよね) なので時間ができればxrcを多言語対応に書き換えようかと思っています。 このレスちょっと日本語おかしいですが勘弁して下さい。宿酔いなので
489 名前:デフォルトの名無しさん mailto:sage [03/09/28 15:37] 複数フレームが開いている時に、一度に全て閉じるには普通どうするのでしょうか? 例えばあるフレームで「ファイル→終了」を選んだ時です。 wxExitは緊急の時だけにしろって書いてありますし、 wxWindow#FindWindow*はidやnameが分からないので使えませんし、 wxApp#GetTopWindowは複数回呼んでも同じウィンドウを戻してくるし。。 教えてください えろい人。
490 名前:の [03/09/28 19:33] えろい人と呼ばれて答えないわけにはいかないですね。 > 例えばあるフレームで「ファイル→終了」を選んだ時です。 アプリを終了させるのなら、wxApp::GetTopWindowでメインウインドウの ポインタを入手してwxWindow::Closeすればいいと思う。 # wxWindow::Destroyかな? wxApp, DECLARE_APP()も参考のこと。
491 名前:デフォルトの名無しさん mailto:sage [03/09/28 20:00] >>490 レスありがとうございます。僕も早くえろい人になりたいです。 説明不足で申し訳ありませんが、複数フレームとは各々独立しているものでして、 トップウィンドウが閉じられても他のフレームは存在しつづけるのです。 つまり、全てのフレームの親はNULLなのです。 複数インスタンスを起動すればいいだけの話なんですが、 起動時に重い処理を行うためにそれを避けています。
492 名前:デフォルトの名無しさん mailto:sage [03/09/28 20:53] wxwindowsjp.sourceforge.jp/docs/html/wx/wx454.htm (翻訳ありがとうございます)では、 「新しいウィンドウを作成する時には可能な限り常に親フレームを使うことを推奨する. そうしない時は,トップレベルフレームのwxCloseEventのハンドラで,全ての子フレームを確実に破棄する事.」 とあるのですが、その「全ての子フレームを確実に破棄する」方法が知りたいのです。 全てのウィンドウのリストを保持する・・・?んー。。。 うおーーーーーできましたっ! Sえんd
493 名前:デフォルトの名無しさん mailto:sage [03/09/28 20:56] すいません。取り乱しました。。。えっと、wxAppに bool SendIdleEvents() すべてのトップレベルウィンドウにアイドルイベントを送ります。 というのを見つけまして、ソースを見たところwxTopLevelWindowsに対して処理をしていましたので、 case wxID_EXIT:{ wxWindowList::Node* node = wxTopLevelWindows.GetFirst(); while (node) { wxWindow* win = node->GetData(); win->Close(TRUE); node = node->GetNext(); } break; } としたところ、うまくいきました。お騒がせ致しました。
494 名前:の [03/09/28 21:49] おっと失礼……特殊なケースですな。 グローバル変数の wxTopLevelWindows を利用するという手もありそうですが、 ドキュメント化されていない変数を利用するのもまずいかな? # どっかでドキュメント化されていましたっけ? 私だったら、素直にwxApp(の派生クラス)でNULL親のウインドウリストを 持つようにしますかね……
495 名前:の mailto:sage [03/09/28 21:58] 入れ違いですな……wxTopLevelWindows を利用しましたか。 このあたりのグローバル変数もドキュメント化してくれると助かるのですけどね # 仕様Fixという意味からも
496 名前:デフォルトの名無しさん mailto:sage [03/09/28 22:29] 確かにドキュメント化されてないのは心配ですね。でも結構不変的なオブジェクトっぽいですよ。 REV:1.5以降は wx/window.h に存在してます。REV:HEADでも依然として存在しています。 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/window.h?annotate=1.5 REV:1.4以前は各々のプラットフォーム毎に持っていたようです。 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/window.h?annotate=1.4 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/msw/window.h?annotate=1.1 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/gtk/window.h?annotate=1.1 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/motif/window.h?annotate=1.1 cvs.wxwindows.org/viewcvs.cgi/wxWindows/include/wx/mac/window.h?annotate=1.1 つまり、wxTopLevelWindowsという識別子はwxWindowsの歴史の中で存在しなかった事はないようです。 wxWindowsのどのリビジョンを取り出しても、必ずwxTopLevelWindowsは存在します。 これからもずっとこうだと限りませんが、1998年存在しつづけているオブジェクトなので余程のことが無い限り大丈夫だと思います。 また、もし変更があった場合は toplvcmn.cpp utilscmn.cpp wincmn.cpp helpctrl.cpp app.cpp data.cpp mdi.cpp nativdlg.cpp taskbar.cpp toplevel.cpp window.cpp app.h window.h に一度に変更が入るため、変更の可能性は低いように思えます。
497 名前:デフォルトの名無しさん mailto:sage [03/09/28 23:43] と思ったんですが、 wxguide.sourceforge.net/guidelines/basics.html のガイドラインでは WX_DEFINE_ARRAY (AppFrame*, AppFrames); で全てのフレームをApp(public wxApp)で管理していました。 のさんの言うように自前で管理することにします。どうも。
498 名前:デフォルトの名無しさん [03/09/29 20:54] 最近wxWindowsの勉強を始めたのですが、サンプルを見ると、 どれもボタンとかメニューを作るたびにIDを割り当てて、 そのIDをベースにコールバックを登録してますよね? みなさん、そのスタイルでプログラムされてるんですか? wxID_ANYでまかせて、GetIdを使うやり方は、将来何かまず いことがおきるでしょうか? ついでにいうと、せっかくオブジェクト指向なのに、なんで IDなんていう内部情報を表に見せるようなAPIになってるん でしょうね。
499 名前:の mailto:sage [03/09/29 23:58] > 498 >wxID_ANYでまかせて、GetIdを使うやり方は、将来何かまず 具体的にはどんな感じ? # ハンドラ内でif判定? マクロとか使用せずに登録したいのなら、EvtHandler::Connectを使うのが スマートだけど……どのみちIDを使用しますな。 > IDなんていう内部情報を表に見せるようなAPIになってるん IDをメッセージの一種と考えているんでしょうね。 メンバ関数をコールバックするためにオブジェクトそのものをやりとりするよりも 効率的と判断したのですかね?
500 名前:デフォルトの名無しさん mailto:sage [03/09/30 00:10] >>498 >なんでIDなんていう内部情報を表に見せるようなAPIになってるん OnFileMenu(wxCommandFileMenuEvent) {} OnEditMenu(wxCommandEditMenuEvent) {} OnExitMenu(wxCommandExitMenuEvent) {} OnOpenMenu(wxCommandOpenMenuEvent) {} 俺はこんなのやりたくないぞ。 OnCommand(wxCommandEvent) {switch (event.GetId())} の方が素直でいい。
501 名前:デフォルトの名無しさん mailto:sage [03/09/30 02:01] >>500 やりたくないって最近のGUIフレームワークはみんなそうなんだが。 拡張無しのC++だと発生したイベントとイベントハンドラOnFileMenuの呼び出しを 結びつけるのが難しいから(まさかvirtualにもできないし)wxWではやってないというだけで。
502 名前:デフォルトの名無しさん mailto:sage [03/09/30 02:12] >>501 ほんとにメニューが増えるたびにクラス作るの? まじでやりたくないな。。とりあえずSwingは違ったけど。 その最近のGUIフレームワークって何てやつ?
503 名前:501 mailto:sage [03/09/30 02:26] >>502 >みんなそうなんだが。 >>500 の例は少し違ったな。クラスをボコボコ作るわけじゃない。 ↓な感じ。 class Form1 { OnFileMenu(wxCommandMenuEvent) {} OnEditMenu(wxCommandMenuEvent) {} OnExitMenu(wxCommandMenuEvent) {} OnOpenMenu(wxCommandMenuEvent) {} }
504 名前:デフォルトの名無しさん mailto:sage [03/09/30 02:31] (´-`).。oO(なんで「MFCに似てるな」で片づけられないんだろう…)
505 名前:デフォルトの名無しさん mailto:sage [03/09/30 02:41] >>503 それって EVT_COMMAND(wxID_FILE, wxCommandMenuEvent, OnFileMenu) EVT_COMMAND(wxID_EDIT, wxCommandMenuEvent, OnEditMenu) EVT_COMMAND(wxID_EXIT, wxCommandMenuEvent, OnExitMenu) EVT_COMMAND(wxID_OPEN, wxCommandMenuEvent, OnOpenMenu) と何が違うん?
506 名前:デフォルトの名無しさん mailto:sage [03/09/30 02:46] あ、違うか。そうしないのは何故かってことか。なんでだろ? 関数増えまくるのがめんどくさいからかな。 ヘッダにも書かないかんし。まあC++の宿命っつーか。
507 名前:デフォルトの名無しさん [03/09/30 06:45] WideStudio のドキュドキューンさになんとも馴染めなかったので、 これはどうかと wxWindows を見てみたが、 設計古すぎ もうだめぽ
508 名前:デフォルトの名無しさん mailto:sage [03/09/30 11:00] >>507 来年また覗きにおいで www.wxwindows.org/roadmap.htm Version 3.0.0 Stable Release 15/12/2003 This stable release will have STL compatibility for compilers that support templates fully. For example the wxString class will derive from std::basic_string<>.
509 名前:デフォルトの名無しさん mailto:sage [03/09/30 12:23] よーするにdelegateのないC++は糞だしその上に構築されたライブラリも糞ってこった。
510 名前:デフォルトの名無しさん mailto:sage [03/09/30 13:44] >>509 delegate自分で書けねーのかよ(激藁
511 名前:507 mailto:ageサンクスコ [03/10/01 00:35] >>508 おぉ # gtkmm から早く抜け出したいので期待age.
512 名前:デフォルトの名無しさん mailto:sage [03/10/02 20:27] ドキュメントかなりvirtualの間違いがあるんですけど こういうのってどうしたらいいんでしょうかね? 報告した方がいいんですか? virtualってドキュメントに書いてあったからオーバーライドしてはまった人より。
513 名前:デフォルトの名無しさん mailto:sage [03/10/02 21:12] >>512 そりゃもちろん報告した方がいいでしょ。
514 名前:デフォルトの名無しさん mailto:sage [03/10/04 17:26] どなたかwxDynamicLibrary(wxPluginLibrary)をうまく使えている方いませんか? まだ突き詰めて実験してないんですけど、現象としては class MyWindow : public wxWindow { DECLARE_DYNAMIC_CLASS(MyWindow); } IMPLEMENT_DYNAMIC_CLASS(MyWindow, wxWindow); というクラスをDLLにしてあり、アプリケーションから wxDynamicLoaderやwxPluginManagerを使って読み込んでインスタンスを生成しているんですが instance->GetBaseName1() == wxT("wxWindow") なのに instance->GetBaseClass() == NULL という良く分からない状態になっています。 ドキュメントにはstrlenのサンプルがありますが、wxWindowsの型システムを使った オブジェクトの生成方法のサンプルがなかなか見つかりません。 一応 lists.wxwindows.org/cgi-bin/ezmlm-cgi/8/26949 も見たんですけど何だか良く分からん(;´Д`) 何か情報があればお願いします(英語でも何かのソースでもいいです)
515 名前:デフォルトの名無しさん mailto:sage [03/10/04 17:30] すいません。めちゃくちゃ間違えました instance->GetClassInfo()->GetBaseClassName1() == wxT("wxWindow") なのに instance->GetClassInfo()->GetBaseClass1() == NULL です。
516 名前:デフォルトの名無しさん mailto:sage [03/10/04 21:03] >>514 おお、そんなものがあるのか。 漏れも試してみます。
517 名前:デフォルトの名無しさん mailto:sage [03/10/06 00:16] イベントを兄弟ウィンドウに伝播させるには、 1.子ウィンドウAがイベントを親ウィンドウに投げて、 2.親ウィンドウが受け取ったイベントを子ウィンドウBへ投げる としているのですが、これだと親ウィンドウが全てのイベントを 管理しなきゃいけないんですがこんなもんなんですか? GUIアプリ作ったことないんでこれが普通なのかどうかよく分かりません。
518 名前:デフォルトの名無しさん mailto:sage [03/10/06 07:20] 1.子ウィンドウAが親ウィンドウのハンドルを取得する 2.親ウィンドウから子ウィンドウA,B,C,D,...のリストを取得する 3.子ウィンドウリストから必要なウィンドウをピックアップしてイベントを投げる でも,動作すると思いますよ.
519 名前:デフォルトの名無しさん mailto:sage [03/10/06 08:34] >>518 レスありがとうございます。 XRCを使っているという前提で聞いてもらいたいんですが、 「必要なウィンドウをピックアップ」とありますが、ユーザが勝手に作ったクラスの場合は 必要かどうか分からないので、結局どこかで while を使って子ウィンドウ全てに イベントを投げる必要があるということですね。 そうすると、孫ウィンドウに送る場合はどうするのでしょう? 途中にwxPanelやwxSplitterWindowなどがはさまってしまうとそれ以上イベントが飛ばないので、 1.まず最初にトップウィンドウにイベントを投げて、 2.トップウィンドウの全ての子孫ウィンドウを再帰的に検索して 3.それぞれのウィンドウのProcessEventを呼び出す ということをしなければならないのでしょうか。 「しなければならない」のならするのは全然平気なのですが、ちょっと不安になってしまいまして。
520 名前:デフォルトの名無しさん [03/10/10 19:20] C++BuilderXはどうだったんだろう。
521 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/10 22:03] >>520 10月半ばにPersonal版がDL可能になる・・・筈
522 名前:デフォルトの名無しさん mailto:sage [03/10/10 22:03] へぇ
523 名前:デフォルトの名無しさん mailto:sage [03/10/11 03:10] 英語版のPersonal入れてみたけどwxWindowsは入ってなかったしRADも見当たらなかったぞ
524 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/11 10:48] >>523 まぢ? とりあえずプロコンが終わったら入れてみよう.
525 名前:デフォルトの名無しさん mailto:sage [03/10/11 22:31] そういえばBitTorrentもwxWindows/Pythonなんだよね。やけに配布パッケージ大きいと思ったらライブラリが9割以上食ってた
526 名前:の mailto:sage [03/10/12 13:14] > 525 DLLだと全部入りになるからデカいよね。 C++でstatic linkすると随分小さいけど……Pythonじゃ無理か……
527 名前:514 mailto:sage [03/10/12 23:42] >>514-515 できましたー。 これが正しい方法なのかどうか分かりませんが、 クラス名以外の情報が見えない状態でインスタンスの生成に成功しました。 以下にTipsとして示します。ちょっと長いです。 環境はWindows2000、wxWindows2.4.1です。今週中にLinuxでもやってみます。 1.DLLを用意する。 ヘッダの中身はこんな感じです。キモはDECLARE_USER_EXPORTED_PLUGGABLE_CLASSです。 これによってwxPluginLibraryにwxClassInfoのハッシュマップが宣言されます。 #ifndef MYFRAME_H #define MYFRAME_H #include <wx/wx.h> class MyFrame : public wxFrame { DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, __declspec(dllexport)); }; #endif で、"__declspen(dllexport)"はWXDLLEXPORTのように、 DLL側では__declspen(dllexport)、アプリケーション側では__declspen(dllimport)とならなければなりません。 wx/defs.hを見て適宜プリプロセッサで場合分けしてください。 今回はアプリケーション側はMyFrame.hをincludeしないので、このようにしました。
528 名前:514 mailto:sage [03/10/12 23:49] (続き)MyFrameはexportしなくても良いみたいです。(ひょっとすると必要なのかもしれませんが) 1.DLLを用意する(2) 今度は実装部です。IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASSを使えばいいのですが、 wxWindows2.4.1のwx/object.hの_IMPLEMENT_DL_SENTINELにバグがあり、コンパイルが通りませんので以下のようにします。 ------------------------------- #include <wx/dynload.h> #include "MyFrame.h" #undef _IMPLEMENT_DL_SENTINEL #define _IMPLEMENT_DL_SENTINEL(name) \ const wxString name::name##PluginSentinel::sm_className(#name); \ name::name##PluginSentinel::name##PluginSentinel() { \ wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes->operator[](#name); \ if( e != 0 ) { e->RefObj(); } \ } \ name::name##PluginSentinel::~name##PluginSentinel() { \ wxPluginLibrary *e = (wxPluginLibrary*) wxPluginLibrary::ms_classes->operator[](#name); \ if( e != 0 ) { e->UnrefObj(); } \ } IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, wxFrame); ------------------------------- ms_classes.Get(#name) となっているところを ms_classes->operator[](#name) と直します。 で、これをDLLとしてコンパイルします。
529 名前:514 mailto:sage [03/10/12 23:57] (続き)ありゃ、ずれてしまった・・・スマン。 2.DLLを読み込んでインスタンスを生成する wxPluginManagerを使ってDLLを読み込み、wxClassInfoを全走査して目的のクラスを見つけます。 これは lists.wxwindows.org/cgi-bin/ezmlm-cgi/8/26949 とほとんど同じです。 --------------------------------- #include <wx/wx.h> #include <wx/dynload.h> class MyApp : public wxApp {virtual bool OnInit();}; IMPLEMENT_APP(MyApp) bool MyApp::OnInit() { wxPluginLibrary* lib = wxPluginManager::LoadLibrary("./lib/Debug/lib.dll"); wxNode *node; wxClassInfo* classInfo; wxClassInfo::sm_classTable->BeginFind(); node = wxClassInfo::sm_classTable->Next(); while (node) { classInfo = (wxClassInfo *)node->Data(); if (wxString(classInfo->GetClassName()) == wxT("MyFrame")) { wxLogTrace(classInfo->GetClassName()); wxLogTrace(classInfo->GetBaseClass1()->GetClassName()); wxFrame* frame = (wxFrame*)classInfo->CreateObject(); frame->Create(NULL, -1, wxT(wxString("class ") + classInfo->GetClassName() + wxString(" : public ") + classInfo->GetBaseClassName1())); frame->Show(TRUE); return TRUE; } node = wxClassInfo::sm_classTable->Next(); } return FALSE; } --------------------------------- 以上です。
530 名前:514 mailto:sage [03/10/13 03:21] あの・・・追記です。 DECLARE_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, __declspec(dllexport)); IMPLEMENT_USER_EXPORTED_PLUGGABLE_CLASS(MyFrame, wxFrame); の代わりに DECLARE_DYNAMIC_CLASS(MyFrame); IMPLEMENT_DYNAMIC_CLASS(MyFrame, wxFrame); でもできちゃいました。。。(じゃあPLUGGABLEは何のためにある??) >>514-515 の原因は分からずじまいです。>>527-528 の無駄レスごめん。
531 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/13 17:46] wxWindows Personal 英語版をインストールしてみました. 確かにwxWindowsの影も形もありません・・・ハァ. デモでは新規作成にwxWindowsのタブがあったのに,こっちにはありません. wxWindowsはどういう形で使えるようになるのかすら判りません.とりあえず 10月半ばのC++BuilderXではwxWindowsは使えなさそう.
532 名前:デフォルトの名無しさん mailto:sage [03/10/14 11:36] >>523 CBXのどこにRADだと書いてあるのかと小1時間・・・ >>531 某得意のPro版以上とか?
533 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/14 18:16] >>532 www.borland.com/cbuilderx/tour/C%2B%2BBuilderX%20Turbo%20Demo.htm このデモの最後の方ではwxWindowsアプリをRADっぽく作る様子があるんだけど・・・ 少なくともPersonal版には無いな.ラインナップ間の機能を比較する表にwxWindowsの 項目が無いから,wxWindowsサポートの有無が差別機能だとも思えない. ソッコーでアンインスコして,MinGW Developer Studioをインストールしてみた. こっちはなかなか良い.何よりめんどくさいwxWindowsのインストールが簡単にできる ことだけでも十分うれしい.IDE自体もwxWindows製なので動作が軽い. 他のIDEが使いたいなら,インストールした後wxWindows関連のファイルだけ取り 出してアンインストールするという使い方もアリかも.
534 名前:532 mailto:sage [03/10/14 21:49] >>533 そのデモ見てなかった。すまん。 ただDelphiでも比較表にVCLソースの有無とか書いてないし。
535 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/15 00:18] プロコンも終わったし,ドキュメント書いてからソースを某雑誌の人に 提出したら翻訳に再参戦しようかと思います. で,結局C++BuilderXのwxWindows採用の噂以降も翻訳作業は続いて いるんでしょうか? メインの開発環境をノートPCに移行してから,まだCVS入れてないんです.
536 名前:デフォルトの名無しさん mailto:sage [03/10/16 11:02] >>514-515 と >>527->>530 は全て誤りでした。 間違った情報のまま残しておくとTipsに載った場合にまずいので修正しておきます。 wxPluginLibraryが何をするのかというと、通常の::LoadLibrary,dlopenの動作に加えて、 「wxModuleから派生しているクラスをwxWindowsの型システムにインポートする」 という機能が付加されているという、この一点だけです。 wxPluginManager::LoadLibrary("ライブラリ");を実行するだけでpublic wxModuleなクラスはちゃんと使えます。 public wxModule"以外の"クラスは型システムにインポートされませんので工夫して書く必要があります。 ところでWindowsでなかなかうまくいかなったのですが、その原因は wxClassInfo::sm_first でした。 こいつはプロセス中で唯一であることを保証しなければいけません。 つまりDLLを使うことが必須となります。(スタティックリンクでうまくいくようなアイデアがあれば教えてください) Linuxでうまくいっていたのは、wxGTK.rpmで入れているため元々共有ライブラリになっていたからでした。 これについては lists.wxwindows.org/cgi-bin/ezmlm-cgi/8/26949 の P.S.の部分に >you need to build your app and dll using WXUSINGDLL=1, otherwise you'll have no end of trouble. とちゃんと書いてありました。(でもこれP.S.なんてもんじゃじゃないだろーと思った)
537 名前:デフォルトの名無しさん mailto:sage [03/10/17 00:15] >>536 訂正が間違ってるというとんでもないことをしてしまいました。(;´Д`) > wxPluginManager::LoadLibrary("ライブラリ");を実行するだけでpublic wxModuleなクラスはちゃんと使えます。 > public wxModule"以外の"クラスは型システムにインポートされませんので工夫して書く必要があります。 そんなことないです。wxClassInfoを生成(IMPLEMENT_DYNAMIC_CLASS)すると自動的にインポートされます。 wxModuleを継承したクラスは、メモリにマップ・アンマップされる度にOnInit,OnExitが呼ばれ、 そうじゃないクラスは特に何も起こらない、です。モウカキマセンヽ(`Д´)ノゴメンナサイ
538 名前:デフォルトの名無しさん mailto:age [03/10/17 14:13] 昨日、2.4.2落としたら src/makefile.b32 が付いていないみたいなんですけど、 どうやってlib作ったらいいですか?
539 名前:の mailto:sage [03/10/18 11:53] > 537 お疲れです。 >モウカキマセンヽ(`Д´)ノゴメンナサイ そんなこと言わずに書き込んでくだされ。 Hackについてけないことが多いですが…… > 538 $(WXWIN)/docs/(システムごとのフォルダ)/install.txt を見るヨロシ。 コンパイラごとのmakefileを使うか、configureを使うみたいですな。
540 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/18 11:59] bcc使ってないから知らないけど,configureは使えないんだよね.bccでは makefileがないとビルドできないということになると思うけど,使用するmakefileが 変わったのかな? MinGW Developer StudioのwxWindows入りバージョンを使ってるから,マトモな アドバイスが出来なくてスマソ.
541 名前:デフォルトの名無しさん mailto:sage [03/10/18 12:15] >>539 結局はスタティックリンクするとwxClassInfoのメンバ変数が複数生成されてしまうという こちら側のしょうもないミスだったのですが、ろくに確認せずに書いてしまって申し訳なく思っとります。 >そんなこと言わずに書き込んでくだされ。 お言葉に甘えて、これからは確実に確認してから書き込みさせていただきます。 >>BCCの話題 いやいや、src/makefile.vcの中身見れば分かるけど、 src/msw/makefile.*を読んでるだけなので、 BCCだとsrc/msw/makefile.b32を使えばいいわけです。 src/makefile.vcをコピってちょっと修正すればOKだと思う。
542 名前:デフォルトの名無しさん mailto:sage [03/10/18 12:21] ×src/makefile.vcをコピってちょっと修正すればOKだと思う。 ○src/makefile.vcをコピってちょっと修正してもいいと思う。
543 名前:デフォルトの名無しさん mailto:sage [03/10/18 14:48] 一応今回の件(wxClassInfo,wxDynamicLibrary)についてまとめてみました。 www004.upp.so-net.ne.jp/rcl/program/wxwindows/ 転載等は自由にして下さって構いません。
544 名前:538 mailto:sage [03/10/19 02:08] >>539-542 レスサンクス、とりあえず来週 >src/makefile.vcをコピってちょっと修正 ためしてみます。
545 名前:デフォルトの名無しさん mailto:sage [03/10/19 07:14] Cygwin環境でいじってみようと、ドキュメントに書いてあるとおりに ../configure --with-msw --enable-debug --enable-debug_gdb --disable-shared make でコンパイルしました。 これだと、cygwin1.dllが必要になっていると思うんですが、 cygwin1.dllが必要ないようにするにはどうしたらいいのでしょうか。 -mno-cygwinをどこかで指定するのでしょうか。
546 名前:思兼 ◆l3iwkTImVo mailto:sage [03/10/19 08:23] >>545 specあたりを弄ればいいんじゃない? でもいろいろ問題があるかもしれないから,↓を読んでから挑戦してね. www.sixnine.net/cygwin/cygwin-doc/devel/mno-cygwin-howto.html
547 名前:538 mailto:sage [03/10/20 13:32] >src/makefile.vcをコピってちょっと修正 やってみたら簡単にできました。書き込むほどのことでもないですがとりあえず !include <makeb32.env> THISDIR=$(WXWIN)\src all: cd msw make -f makefile.b32 cd $(THISDIR) clean: cd msw make -f makefile.b32 clean cd $(THISDIR) cleanall: cd msw make -f makefile.b32 cleanall cd $(THISDIR)
548 名前:538 mailto:sage [03/10/20 13:36] ためしてみたのは make -f makefile.b32 FINAL=1 でライブラリを作成して samples\dialogs をメイク、実行ができました。
549 名前:538 mailto:sage [03/10/20 13:52] というか、 >BCCだとsrc/msw/makefile.b32を使えばいいわけです。 が、正解だったのですね。おさわがせスンマソ