[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/08 22:45 / Filesize : 338 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【GUIライブラリ】wxWindowsでのひょーん



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を使えばいいわけです。
が、正解だったのですね。おさわがせスンマソ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<338KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef