【GUI】wxWidgets(旧wxWindows) その5【サイザー】
クロスプラットフォーム 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/ >>86-87 普通にWriteTextで キャレット位置に挿入(選択状態なら置換)出来るのでは? >>88 ……その通りでした。 ちゃんと隅々までドキュメント読むべきでした。 遅くなったけどどうもありがとう。 >>83 その後、同一マシン上のVMwareでWindows2000とWindows7を実行して試してみたら、 Windows7上では同じ遅さだったけど、Windows2000ではめっちゃ速かったから 少なくともサイザーが遅いって事はなさそう。 ただ、VS2010上でビルド出来ないし、新しいプラットフォームの追従はあまり 早くないね。3.0が出てくれれば解決するのかな。 >>90 単にスワップ起こしてるだけじゃねーの? 2GB程割り振って検証してみたら? >>90 VS2010のx64でビルドして使ってるけど、特においらの範囲では問題ないな。 VC6プロジェクトがVS2010で変換できないってことなら、VC2005か、VC2008で変換してからVS10で開けば通るよ。 2.9.xならVC8,VC9用のプロジェクトもある。 >>92 > VS2010のx64でビルドして使ってるけど、特においらの範囲では問題ないな。 再描画の時に「パッ」じゃなくて「パラ」って感じなんで、まぁ問題っていうほど じゃないんだけどね。 > VC6プロジェクトがVS2010で変換できないってことなら、VC2005か、VC2008で変換してからVS10で開けば通るよ。 なるほど、その手があるのか。ありがとう。 wxURLのProxy処理にバグがある・・・? GETしたいURL: http://www.google.com/ 使うProxy: localhost:8080 このとき、Proxyへリクエストヘッダを見てみると GET http://www.google.com/ HTTP/1.0 Host: localhost になってて、Proxyがlocalhostの/を取りに行こうとする。 RFCをちゃんと読んでないのでこれも正しいのかもしれないけど、 一般的なブラウザだと GET http://www.google.com/ HTTP/1.0 Host: www.google.com になってる。 送信先がhttpならHostをwww.google.comに書き換えないといけない (実際そうしてみたら手元の環境では動く)と思うんだが、俺間違ってる? 一応最新のソースをTrunkから落としてきてるけど、こんな単純なところでミス してたらテスト通らないだろうし… 俺が何かくだらないミスしてる気がしてならないので、誰かツッコミ入れて下さい。 >送信先がhttpならHostをwww.google.comに書き換えないといけないと思うんだが、俺間違ってる? あってる wxRIchTextCtrlの日本語インライン入力パッチありませんか? おや規制明けてる。 >>98 もう解決してる気がするけど、OS毎で処理系が全く異なる上、 日本と中国と韓国くらいしか影響がないのでそんな便利なパッチはたぶん無い。 RichTextはわからんが、Win上のwxStyledTextCtrlと同じなら、 MSWWindowProcをオーバーライドして、 WM_IME_STARTCOMPOSITION、WM_IME_COMPOSITIONあたりを捕捉、 Caretの位置から自分で逐次IMEの位置情報を変更してやればいいと思う。 しかし上でwxURLの話もされてるけど、HTTP通信周りの処理、 結構ボロボロだなコレ。 そういう用途で使ってるユーザがほとんどいないんだろうが・・・。 UI以外の部分でwx使う意味ってあんまりないからじゃない? もう誰か作ってるだろと探したけど wxOnigurumaとか無かった。残念。 詳しい方ちょっと教えて下さい…。 ちょっと前からxchmというヘルプビューアを日本語表示できるようにしているのですが、 ShiftJIS->Unicodeの変換がうまくいきません。 一応wxString、wxMBConv、wxCSConv、wxEncodingConverterのリファレンスと ヘッダにある関数の組み合わせは一通り試したつもりですが、変換されるはずが 変換されなかったり、Initに失敗したりと散々です。 結局g_convert関数(GLibのiconvラッパー)で逃げましたが、wxWidgetで 書かれているソースに突如異物混入みたいで非常に美しくありません。 動作はしたので後は趣味の問題ですが、なんとかならないでしょうか? 環境はDebian、wxWidgets 2.6.7.1です。 2.9のドザーな俺にはアドバイスはできんが、 この辺で問題視されてる「wxMBConv はいくつかのサブクラスを持っていて、 こいつらはことごとく wchar_t の内部表現が UCS であることを仮定してる。」 あたりが原因じゃないのか? ttp://diary.imou.to/~AoiMoe/2004.09/middle.html#2004.09.13 >>104 早速感謝。 あー、そのページ、自分も見ました。 今ネット上にある日本語ページの中では一番内容が濃そうでしたね。 wxWidgetsが文字コード回りで大分無茶をしてるらしいことだけは判りました。 実際、文字コード変換には一旦wchar_t型を経由しないとならんのですけど、 charのSJIS->MB2WC->WC2MB とかやると、SJISでもUTF8でもない謎コードになっちゃうんですよね。 ちなみに、前スレでもWin使いの方が全く同じ趣旨の質問されてましたけど、 結局やはりWinAPIでなんとかしたらしいですね。 やっぱり無理ですかねぇ…。 wchar_t の中身がUCS前提なのはこの場合問題じゃないだろ… >>104 の言っているUnicodeって、具体的に何?wxはUnicodeビルドで、wxStringにしたいの? SJISからwxStringにしたいのなら、 wxString s(sjis_string, wxCSConv('cp932')); を試した? コード出さないで質問しても、エスパーじゃない限り回答できないよ。 >>106 あ、書き忘れてましたね、すいません。 入力はマルチバイト(char)のShiftJIS、欲しい出力はマルチバイト(char)のUTF-8で、 wxはDebian etchのものなのでUnicodeビルドです。 上のコードはもちろん試しました。 で、そこからどうすればchar型のUTF-8が得られるのか、もしくは別の方法を使うべき なのかで悩んでいるのが現状です。 ちなみに、成功例はこちら #include <glib.h> char *utf8_str = g_convert(sjis_str, -1, "utf-8", "cp932", NULL, NULL, NULL); で、これと同等のことをwxで行うにはどう書けばいいか?という質問です。 (この前後にwxベースのコードとやりとりするための処理が入るのですが、それが また汚いので、できれば回避したいです…) >>108 えー、失敗コードはもう全部消しちゃったんですよね…。 てか、ここまでの説明で判る方は判るし、判らん方はそこまででしょう。 この場合、頑張って失敗コード再現しても結果は後者だと思うので、No thank you. 便乗して質問してもいいかな? wxMBConvとwxCSConvの違いって何? ヘルプ見てもよくわからん… >>111 wxMBConv は、変換系の抽象クラス。 wxCSConv は wxMBConv を継承した具象クラスで、 >>106 みたいに任意のエンコーディングとの変換を行う。 wxMBConvUTF8 も wxMBConv を継承した具象クラスで、 UTF-8との変換を行う。 http://ja.pastebin.ca/2003497 少なくともUbuntu 10.10では、wxCSConvでちゃんとcp932からUTF-8への変換ができたよ。 Debian etch とか古すぎて使う気にならないけど。 >>114 多謝!! こっちでも試してみましたけど、できた!?ばかな!? 記憶を頼りに前回のコードと比較してみたら、違いが判りました。 OK: wxCSConv(wxT("cp932")) NG: wxCSConv(wxFONTENCODING_CP932) …こいつら違う意味なのかよ!? ちなみに、後者だとSJISでもUTF-8でもないデータになりました。 で、wxWidgetsのソースを読んでみました。 wxCSConv::wxCSConv(const wxChar *charset) { ... m_encoding = wxFontMapperBase::GetEncodingFromName(charset); } wxCSConv::wxCSConv(wxFontEncoding encoding) { ... m_encoding = encoding; } で、wxFontMapperBase::GetEncodingFromName(wxT("cp932"))は87でした。 wxFontEncodingはenumなので、じゃあ87はなにかというと、 wx/fontenc.h: wxFONTENCODING_MAX, // highest enumerated encoding value うん、意味が判らないんですが、これってwx使ってる方からしたら常識だったりしますか? それと間違えてました、使ってるのはetchでなくlennyでした、スイマセン。 xchmのコード変更完了! おかげさまで変更箇所が50行が4行になり、かなりすっきりしました。 相談に乗って頂いた方、大変有難うございました。 fmapbaseの中にwxFONTMAP_CP932のエンコーディング名として最初にWINDOWS-932という 文字列が登録されていて、iconv にはこの名前のエイリアスが登録されていないから iconv に 失敗する、、、んだけど、iconv_open に失敗したらWINDOWS-932の次のCP932が利用されるように 見える。なのに失敗してる。 深追いはしてないからどこでコケてるのか判らないけど、とりあえず wxCSConv にはエンコーディング名を 直接渡したほうが、その名前が直接 iconv に渡るから落とし穴が少なそう。 >>118 あー、そういうことでしたか、なるほど。 感謝! 名前を間違えて107にしてしまった。 >>117 xchm の修正って、本家にフィードバックする予定ありますか? Linuxでもchmファイル読めたら便利そう。 >>121 フィードバックの予定は特に無いです。 というか本家、まだ生きてるんだろうか? Ad-hocだけど、ここにパッチ貼っときます。 これでコンテンツと索引がちゃんと日本語で表示されるようになります。 検索の日本語対応は、ぱっと見かなり難しそうだったので保留中です。 むしろ誰かやって下さい…。 ちなみに、Linuxでchm読むだけでしたら他にもいくつかビューアがあるようですよ。 ご参考まで。 +diff -urN xchm-1.17.orig/src/bitfiddle.inl xchm-1.17/src/bitfiddle.inl +--- xchm-1.17.orig/src/bitfiddle.inl 2010-11-27 17:21:37.000000000 +0900 ++++ xchm-1.17/src/bitfiddle.inl 2010-11-27 18:00:13.000000000 +0900 +@@ -194,10 +194,10 @@ + return wxEmptyString; + + if(enc != wxFONTENCODING_SYSTEM) { +- wxCSConv convFrom(wxFONTENCODING_ISO8859_1); +- wxCSConv convTo(enc); +- +- return wxString(input.mb_str(convFrom), convTo); ++ if (enc == wxFONTENCODING_CP932) ++ return wxString(input.To8BitData(), wxCSConv(wxT("cp932"))); ++ else ++ return wxString(input.To8BitData(), wxCSConv(enc)); + } + + return input; +diff -urN xchm-1.17.orig/src/chmfile.cpp xchm-1.17/src/chmfile.cpp +--- xchm-1.17.orig/src/chmfile.cpp 2010-11-27 17:21:37.000000000 +0900 ++++ xchm-1.17/src/chmfile.cpp 2010-11-27 19:35:02.000000000 +0900 +@@ -1056,10 +1056,8 @@ + #endif + topic = CURRENT_CHAR_STRING(combuf); + #if wxUSE_UNICODE +- else { +- wxCSConv cv(_enc); +- topic = wxString((const char *)combuf, cv); +- } ++ else ++ topic = translateEncoding(CURRENT_CHAR_STRING(combuf), _enc); + #endif + } + wxPythonでとあるチャットのクライアントを作っているのですが wx.(Rich)TextCtrlでは打ち消し線は使えないのでしょうか? >>125 wxFONTFLAG_STRIKETHROUGHを指定したフォントを適用してやるとかで できるんじゃない? ありがとうございます。 font = wx.FFont(8, wx.DEFAULT, wx.FONTFLAG_STRIKETHROUGH) self.target.SetFont(font) FONTFLAG_STRIKETHROUGHを指定してみたのですが、打ち消し線が表示されません。 wxWidgets2.8.xに実装されているウィジェットの表示サンプル一覧とかないですかね? サンプルを実行してみないとどのように表示されるのか判らないのはかなり不便・・・('A`) >>127 ttp://trac.wxwidgets.org/ticket/9907 打ち消し線が有効化されるパッチ。 ただし2.9。 >>130 遅れましたが、ありがとうございます。 wxWidgets用のパッチのようなのですが、 wxPythonに適用させる方法がわかりません・・・ AndroidやiPhoneもそうだけど、Mac対応(wxCocoa)もしっかりして欲しい。 このままじゃ何時まで経っても64bit化出来ない。 やっぱり企業の後ろ盾がないプロジェクトはきついかもね。 ほとんど同じ時期じゃね? wx Initial release 1992 Qt Initial release 1992; 19 years ago wxの敗因は、やっぱ製品として売り出してないからじゃね? Android => Java, Google gtk,Mono => Suse, Microsoft Qt => Nokia, Google, Intel wxwidget => ??? wxRubyノート - ListCtrl を使ってサムネイル一覧を表示してみる - Alone Like a Rhinoceros Horn ttp://d.hatena.ne.jp/h1mesuke/20100427/p1 のコードを動かしたいのですが日本語パスが使える状態で動かせません Ruby 1.8.7+wxRuby 2.0.1 動作するけど日本語を含むパスが認識しない (Ruby 1.8.xがUTF-8のパスを処理出来ないためっぽい S-JISだと今度はwxRubyがパスを認識出来ない) Ruby 1.9.2+wxRuby 2.0.1 Ruby 1.9.1+wxRuby 2.0.1(mingw32-ruby-1.9.1-wxruby-2.0.1-setup.exe) Ruby 1.9.1+wxRuby 2.0.0(mingw32-ruby-1.9.1-wxruby-2.0.0-setup.exe) RubyはUTF-8のパスを処理出来るけど >@thumb_list.clear_all のところで固まる 日本語パスが使える状態で動作させる方法があったら教えてください よろしくお願いします つ ttp://codepad.org/SaG84FKe レスありがとう。ってPython!?Σ(゚Д゚) わざわざ書き直してくれたのに申し訳ないけどRubyでコーディングしたいので・・・ とりあえずいじり回していたら思いついた案 1.Ruby 1.8系を使用。wxImage::load_streamを使う ファイルの自動判別が出来ない 2.Ruby 1.8系を使用。Rubyのファイルパスを扱うメソッドをUTF-8に対応するように再定義 数が多くコーディング量が多い。デバッグも大変 3.RubyでwxPythonを使う まだ実験していない。動いたとしても関連ライブラリのサイズがでかくなりそう? どれもイマイチだ(´・ω・`) Ruby知らんけど、単に文字コード変換するんじゃダメなの? コントロールに画像使うとリソース食うから サムネにはお勧めできない GUIやるならPythonの方が良いと思うけどなぁ。 Windowsと日本語はもちろんだけど、>>140 のBlog見てるとスレッド周りにも 問題あるみたいだし。 >サムネイルを作成する間ウィンドウがブロックしないよう、サムネイルの作成は別スレッドで行っている。 >(ただし、サンプルということで、排他制御は一切やっていない) > >イベントループのあるメインスレッドからのスレッド切り替えが円滑に行われるよう、 >メインスレッドではタイマーを使って定期的に Thread.pass している。 > > Wx::Timer.every(100) do > Thread.pass > end > >これが必要になる理由については次のエントリでやる予定。 謎のコード >>142 べつに謝らんでもええよ 漏れは困ってへんから >>146 ttp://d.hatena.ne.jp/h1mesuke/20100508/p1 ここのコメ欄の方が怖いぞ。 wxWidgetsでアニメ(not 動画ファイル。MNG or 連番PNGを想定)を表示したいのですが 単に表示されている画像をインターバルで書き換えていく方法だとフリッカーが出てしまいます 再描画と画像の書き換えの同期が取れていないためだと思いますが同期させる方法が判りません 何か良い方法があったら教えてください。よろしくお願いします >>150 wxBufferedPaintDC使え。 レスthx >>152 なるほどそう言うのがあるのか。試してみます >>152 フリッカーを無くせました。ありがとうございました >>154 ttp://wx.ibaku.net/changelog/ 連日どんどん更新されてるけど音沙汰ない? EVT_LEFT_DCLICK で bind して処理しようとすると EVT_LEFT_UP EVT_LEFT_DCLICK が同時に来るみたいなのですが EVT_LEFT_DCLICK だけ受け取るにはどうすれば良いでしょうか? >>160 wxMouseEventのLeftDClickで判別すればいいんじゃないの? GoogleIME使ってるんだが、TextCtrlで未変換文字列とか変換候補とかが表示されないのは仕様か? MSIMEならちゃんと表示された >>162 ありがとうございます 試してみましたが 結局 EVT_LEFT_DCLICK に bind された handler 内では LeftDClick なのですが 同時に EVT_LEFT_UP に bind された handler も呼ばれてしまっていて そっちでは LeftDClick じゃないとみなされるので区別出来ないんです >< wxApp の OnInit で wxFrame *frame = new wxFrame(hogehoge); としたとき wxFrame を delete しないようですが 勝手に GC してくれるんでしょうか? SetTopWindow(frame); を実行したときとしないときでは違いますか? >>164 wxWidgetsでは自分で解放すると返って二重解放になる。 ttp://www.wxwidgets.org/docs/faqcmn.htm FAQに書いてあるから今後はよく読もうな。 主にwindowsで使っていますがlinuxでも同じソースで動くようにしたいです wxStringで与えられたあるパス名がフルパスか相対パスかをwxWidgetsのクラス (例えばwxFileName等)を使って判断出来ますか? >>167 wxFileNameにIsAbsoluteというのがあるけども。 それすら調べられないようだとwxに限らずプログラミングは厳しいと思う。 ポインタ置いときますね。皆さん先刻ご存知かもしれませんが。 wxWidgets(wxstd.moの日本語版, ja.po)をお使いの皆様へ ttp://suzumizaki.blog6.fc2.com/blog-entry-207.html >>164 こっちも読んでおくといいよ。 二重開放以外にもdeleteがまずい理由があるようだから。 ttp://docs.wxwidgets.org/trunk/overview_windowdeletion.html >>168 出来ました!! ありがとうございました!!! wxListCtrl の SetItem - GetItemText とか SetItemText - GetItem とか なんか変な対応してるみたいなんですけど こんなもんなんですか? 他にも IsIconized とか IsShown とか ドキュメント通りじゃなくて めちゃくちゃな感じがするんですが 設計者ってパラノイア? 馬鹿には無理 つ ttp://wiki.wxwidgets.org/WxListCtrl Get the String Contents of a "cell" in a LC_REPORT wxListCtrl >>173 出来ました!! ありがとうございました!!! 質問です wxWidgetsにはMD5やSHAを計算してくれる関数はありますか? つttp://wxwidgets-hash-md5.fyxm.net/ >>175 176じゃないけど、MD5単品ならこういうのとか。 ttp://www.koders.com/cpp/fid80078010DEFC2265E917FE6436718F0AE038CBE6.aspx >>178 ありがとうございます とりあえず別のMD5ライブラリが見つかったのでそちらで間に合わせたのですが ライセンスの問題とか考えると教えて頂いたもので置き換えた方が良いかも知れません 余力があったら後でご報告します wxHTTP::GetResponse が 200 とか 403 とかじゃなくて 0 を返すんですけどバグですか? つ ttp://wiki.wxwidgets.org/WxHTTP >>180 出来ました!! ありがとうございました!!! 文字コードの変換というか 変換出来ない文字が含まれているかどうかのチェック方法について質問です。 UTF8 の文字列を SJIS に変換しようとしています。 static wxString wxString::FromUTF8(const char *s); の注意書きに、 Note that this method assumes that s is a valid UTF-8 sequence and doesn't do any validation in release builds, it's validity is only checked in debug builds. というのがありまして、 実際に HTTP 経由で取得したデータ (UTF8 であることは確認済み) に 「〜」の上下反対の文字 (SJIS に変換出来ないコード) などが入っていると、 wxString utf8_data; wxStringOutputStream ostream(&utf8_data); httpStream->Read(ostream); wxString sjis_data = wxString::FromUTF8(utf8_data.c_str()); なコードで変換しようとすると sjis_data の中身が空っぽになってしまいます。 リリースビルドなので無視された結果だと思いますが、 wxWidgets 自身に事前にチェックするための関数などはありますか? utf8_data には確かに UTF8 のデータが入っています。 問題を起こす文字が含まれていないときは正常に動作するようです。 OS は Windows で wxWidgets は ANSI 版のを使っています。 むしろUTF-8のまま扱うかUNICODEにしてしまった方が良いのでは? >>182 wxStringOperations::IsValidUtf8String >>184 ありがとうございます。 今レス見たばかりなのでまだ試していませんが、 http://docs.wxwidgets.org/trunk/annotated.html を見ても wxStringOperations は見当たらず ネームスペースかとも思うのですが、 こういったものはどうやって見つければ良いものですか? >>182 wxString::FromUTF8Unchecked >>186 ありがとうございます。 しかしそれは Valid じゃない UTF8 データが渡されたときの 動作は undefined だと書かれていますね。 結局事前に調べないといけないことにかわりないようです。 >>187 ありがとうございます。 中身を読んでも良く判りませんでした。 どういう意味でしょうか? read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる