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/

ここまで見た
  • 72
  •  
  • 2010/09/06(月) 23:53:29
なんかサイザーの処理が最適化されていないのか、複雑なレイアウトを組むと
再描画に凄く時間が掛かる。
何か回避策や対策などがあるようならば教えてください。

ここまで見た
  • 73
  •  
  • 2010/09/07(火) 17:43:04
wxを窓から捨てる

ここまで見た
  • 74
  •  
  • 2010/09/07(火) 17:55:13
RADツール使ってサイザーやスペーサーを極力使わない構造を見つける

ここまで見た
  • 75
  • 72
  • 2010/09/07(火) 22:55:14
リサイズしないウィンドウにしても、再描画時にサイザーの計算を
しているっぽいので、そこをもう計算させないっていう様な設定が
出来たらしたいのです。

結局、複雑にサイザー使ってボタンとかびっちり詰め込むと
サイザーの計算が重くなるのは仕方ないなとも思うので、
固定さえ出来れば問題なくなるはずです。

ここまで見た
  • 76
  •  
  • 2010/09/07(火) 23:10:11
各コントロールごとに座標を想定してたりしないか?そういう使い方するもんじゃない
ボックス系のサイザーとグリッド系のサイザーを適切に使えば綺麗にまとまるし
さほど重くもならないと思うんだけど

ここまで見た
  • 77
  •  
  • 2010/09/07(火) 23:22:25
あとコントロール、サイザー共にExpandとStretch(proportion)はちゃんと個別に見直すべき
そのあとでBorder、埋めきれないとこはSpacer

ここまで見た
  • 78
  •  
  • 2010/09/09(木) 09:58:14
wxFormBuilder 3.1
Python対応
C++で日本語でもANSIで吐けるようになってるのを確認

ここまで見た
  • 79
  •  
  • 2010/09/11(土) 02:13:45
>>76
ちょっと見直してみたら、ボックスサイザーを入れ子にしてる所があるな。
そういうのは、グリッド系にすべきって事かな。

ここまで見た
  • 80
  •  
  • 2010/09/11(土) 04:07:42
サイザーごときで重くなるって
100個とか1000個単位で
びっしり詰めてるのか?

ここまで見た
  • 81
  •  
  • 2010/09/11(土) 11:58:53
とりあえず、コントロールは100個近く詰まってはいる。
動作が重いというか、ウィンドウを(最小化などから)表示した時に
普通はパッというぐらいの速度で表示されるけど、それがパラパラっと
コントロールが配置されるのが見えるって感じ。

ここまで見た
  • 82
  •  
  • 2010/09/11(土) 12:03:53
>>78
wxFormBuilderって物凄く安定しているのがスゲーと思った。
こういうのって不安定なものが多いから感心した。
ちなみに、Windows版。

ここまで見た
  • 83
  •  
  • 2010/09/11(土) 14:23:13
以前に作ったコントロール90くらいのダイアログ見つけたからwxFormBuilder通して見てみたけど
C2D E6600でもこの程度では特に重いとは感じない、というか変化がない
SS見せてくれたら試しに組んでみてもいいよ

ここまで見た
  • 84
  •  
  • 2010/09/13(月) 07:11:45
透過GIFを背景画像の上にぺたぺた貼り付けたいんだけど、透過GIFを入れたwxStaticBitmap
を配置するだけだと背景色で透過部分がfillされます。styleをTRANSPARENTにしても効かない。

ウィンドウのDCを取得して、wxDC::DrawBitmapで地道に描かないとだめですかね?

ここまで見た
  • 85
  •  
  • 2010/09/13(月) 11:28:09
styleをTRANSPARENT
SetMaskColour

ここまで見た
  • 86
  •  
  • 2010/10/18(月) 01:51:53
wxTextCtrlでカーソル位置にテキストを挿入するのってどうやるのが楽?
GetInsertionPointの前後で分割して、入れたい値を合成して
再挿入、ってやったけど
どうも改行があると値がずれるようなんで困ってて。


ここまで見た
  • 87
  • 86
  • 2010/10/18(月) 02:20:13
自己解決。Replace使えば良かったのか。
スレ汚しすまんかった。

ここまで見た
  • 88
  •  
  • 2010/10/18(月) 02:32:29
>>86-87
普通にWriteTextで
キャレット位置に挿入(選択状態なら置換)出来るのでは?

ここまで見た
  • 89
  • 86
  • 2010/10/20(水) 23:19:42
>>88
……その通りでした。
ちゃんと隅々までドキュメント読むべきでした。
遅くなったけどどうもありがとう。



ここまで見た
  • 90
  • 81
  • 2010/10/31(日) 01:33:07
>>83
その後、同一マシン上のVMwareでWindows2000とWindows7を実行して試してみたら、
Windows7上では同じ遅さだったけど、Windows2000ではめっちゃ速かったから
少なくともサイザーが遅いって事はなさそう。

ただ、VS2010上でビルド出来ないし、新しいプラットフォームの追従はあまり
早くないね。3.0が出てくれれば解決するのかな。


ここまで見た
  • 91
  •  
  • 2010/10/31(日) 01:53:11
>>90
単にスワップ起こしてるだけじゃねーの?
2GB程割り振って検証してみたら?


ここまで見た
  • 92
  •  
  • 2010/10/31(日) 17:17:26
>>90
VS2010のx64でビルドして使ってるけど、特においらの範囲では問題ないな。

VC6プロジェクトがVS2010で変換できないってことなら、VC2005か、VC2008で変換してからVS10で開けば通るよ。
2.9.xならVC8,VC9用のプロジェクトもある。

ここまで見た
  • 93
  • 90
  • 2010/11/03(水) 00:56:36
>>92
> VS2010のx64でビルドして使ってるけど、特においらの範囲では問題ないな。
再描画の時に「パッ」じゃなくて「パラ」って感じなんで、まぁ問題っていうほど
じゃないんだけどね。

> VC6プロジェクトがVS2010で変換できないってことなら、VC2005か、VC2008で変換してからVS10で開けば通るよ。
なるほど、その手があるのか。ありがとう。

ここまで見た
  • 94
  •  
  • 2010/11/13(土) 05:11:47
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から落としてきてるけど、こんな単純なところでミス
してたらテスト通らないだろうし…
俺が何かくだらないミスしてる気がしてならないので、誰かツッコミ入れて下さい。


ここまで見た
  • 95
  •  
  • 2010/11/13(土) 11:25:39
>送信先がhttpならHostをwww.google.comに書き換えないといけないと思うんだが、俺間違ってる?

あってる

ここまで見た
  • 96
  •  
  • 2010/11/13(土) 11:31:27
wxURL_NOHOST

ここまで見た
  • 97
  •  
  • 2010/11/13(土) 11:34:21
これかな
http://yomi.mobi/read.cgi/pc8/pc8_tech_1097524712/515-


ここまで見た
  • 98
  •  
  • 2010/11/13(土) 11:54:08
wxRIchTextCtrlの日本語インライン入力パッチありませんか?


ここまで見た
  • 99
  •  
  • 2010/11/23(火) 18:39:00
おや規制明けてる。
>>98
もう解決してる気がするけど、OS毎で処理系が全く異なる上、
日本と中国と韓国くらいしか影響がないのでそんな便利なパッチはたぶん無い。
RichTextはわからんが、Win上のwxStyledTextCtrlと同じなら、
MSWWindowProcをオーバーライドして、
WM_IME_STARTCOMPOSITION、WM_IME_COMPOSITIONあたりを捕捉、
Caretの位置から自分で逐次IMEの位置情報を変更してやればいいと思う。

しかし上でwxURLの話もされてるけど、HTTP通信周りの処理、
結構ボロボロだなコレ。
そういう用途で使ってるユーザがほとんどいないんだろうが・・・。


ここまで見た
  • 100
  •  
  • 2010/11/23(火) 19:22:29
UI以外の部分でwx使う意味ってあんまりないからじゃない?

ここまで見た
  • 101
  •  
  • 2010/11/24(水) 19:51:50
そうか

ここまで見た
  • 102
  •  
  • 2010/11/25(木) 23:22:37
もう誰か作ってるだろと探したけど
wxOnigurumaとか無かった。残念。


ここまで見た
  • 103
  •  
  • 2010/11/26(金) 07:32:10
詳しい方ちょっと教えて下さい…。

ちょっと前からxchmというヘルプビューアを日本語表示できるようにしているのですが、
ShiftJIS->Unicodeの変換がうまくいきません。

一応wxString、wxMBConv、wxCSConv、wxEncodingConverterのリファレンスと
ヘッダにある関数の組み合わせは一通り試したつもりですが、変換されるはずが
変換されなかったり、Initに失敗したりと散々です。

結局g_convert関数(GLibのiconvラッパー)で逃げましたが、wxWidgetで
書かれているソースに突如異物混入みたいで非常に美しくありません。
動作はしたので後は趣味の問題ですが、なんとかならないでしょうか?

環境はDebian、wxWidgets 2.6.7.1です。

ここまで見た
  • 104
  •  
  • 2010/11/26(金) 21:51:03
2.9のドザーな俺にはアドバイスはできんが、
この辺で問題視されてる「wxMBConv はいくつかのサブクラスを持っていて、
こいつらはことごとく wchar_t の内部表現が UCS であることを仮定してる。」
あたりが原因じゃないのか?
ttp://diary.imou.to/~AoiMoe/2004.09/middle.html#2004.09.13


ここまで見た
  • 105
  •  
  • 2010/11/26(金) 23:29:00
>>104
早速感謝。

あー、そのページ、自分も見ました。
今ネット上にある日本語ページの中では一番内容が濃そうでしたね。

wxWidgetsが文字コード回りで大分無茶をしてるらしいことだけは判りました。
実際、文字コード変換には一旦wchar_t型を経由しないとならんのですけど、
 charのSJIS->MB2WC->WC2MB
とかやると、SJISでもUTF8でもない謎コードになっちゃうんですよね。

ちなみに、前スレでもWin使いの方が全く同じ趣旨の質問されてましたけど、
結局やはりWinAPIでなんとかしたらしいですね。
やっぱり無理ですかねぇ…。

ここまで見た
  • 106
  •  
  • 2010/11/27(土) 00:43:27
wchar_t の中身がUCS前提なのはこの場合問題じゃないだろ…
>>104 の言っているUnicodeって、具体的に何?wxはUnicodeビルドで、wxStringにしたいの?

SJISからwxStringにしたいのなら、 wxString s(sjis_string, wxCSConv('cp932')); を試した?
コード出さないで質問しても、エスパーじゃない限り回答できないよ。

ここまで見た
  • 107
  •  
  • 2010/11/27(土) 02:06:26
>>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
  •  
  • 2010/11/27(土) 08:39:35
言い訳はいいから問題起こしてる例のコードだせよ

ここまで見た
  • 109
  •  
  • 2010/11/27(土) 11:28:57
>>108
えー、失敗コードはもう全部消しちゃったんですよね…。
てか、ここまでの説明で判る方は判るし、判らん方はそこまででしょう。
この場合、頑張って失敗コード再現しても結果は後者だと思うので、No thank you.

ここまで見た
  • 110
  •  
  • 2010/11/27(土) 11:41:57
エスパーのかたのみお答えください

ここまで見た
  • 111
  •  
  • 2010/11/27(土) 13:14:50
便乗して質問してもいいかな?

wxMBConvとwxCSConvの違いって何?
ヘルプ見てもよくわからん…

ここまで見た
  • 112
  •  
  • 2010/11/27(土) 13:26:57
>>111
wxMBConv は、変換系の抽象クラス。
wxCSConv は wxMBConv を継承した具象クラスで、 >>106 みたいに任意のエンコーディングとの変換を行う。
wxMBConvUTF8 も wxMBConv を継承した具象クラスで、 UTF-8との変換を行う。

ここまで見た
  • 113
  • 111
  • 2010/11/27(土) 13:34:03
>>112
なるほど。ありがとう。

ここまで見た
  • 114
  • 107
  • 2010/11/27(土) 15:03:23
http://ja.pastebin.ca/2003497
少なくともUbuntu 10.10では、wxCSConvでちゃんとcp932からUTF-8への変換ができたよ。
Debian etch とか古すぎて使う気にならないけど。

ここまで見た
  • 115
  •  
  • 2010/11/27(土) 17:00:22
>>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でした、スイマセン。

ここまで見た
  • 116
  •  
  • 2010/11/27(土) 17:17:40
C++ の勉強からやり直せ

ここまで見た
  • 117
  •  
  • 2010/11/27(土) 17:40:21
xchmのコード変更完了!
おかげさまで変更箇所が50行が4行になり、かなりすっきりしました。

相談に乗って頂いた方、大変有難うございました。

ここまで見た
  • 118
  • 107
  • 2010/11/27(土) 18:21:41
fmapbaseの中にwxFONTMAP_CP932のエンコーディング名として最初にWINDOWS-932という
文字列が登録されていて、iconv にはこの名前のエイリアスが登録されていないから iconv に
失敗する、、、んだけど、iconv_open に失敗したらWINDOWS-932の次のCP932が利用されるように
見える。なのに失敗してる。

深追いはしてないからどこでコケてるのか判らないけど、とりあえず wxCSConv にはエンコーディング名を
直接渡したほうが、その名前が直接 iconv に渡るから落とし穴が少なそう。

ここまで見た
  • 119
  •  
  • 2010/11/27(土) 18:27:01
なるほど。ありがとう。

ここまで見た
  • 120
  •  
  • 2010/11/27(土) 18:41:10
>>118
あー、そういうことでしたか、なるほど。
感謝!

ここまで見た
名前を間違えて107にしてしまった。
>>117 xchm の修正って、本家にフィードバックする予定ありますか?
Linuxでもchmファイル読めたら便利そう。

ここまで見た
  • 122
  •  
  • 2010/11/27(土) 22:36:15
>>121
フィードバックの予定は特に無いです。
というか本家、まだ生きてるんだろうか?

Ad-hocだけど、ここにパッチ貼っときます。
これでコンテンツと索引がちゃんと日本語で表示されるようになります。
検索の日本語対応は、ぱっと見かなり難しそうだったので保留中です。
むしろ誰かやって下さい…。

ちなみに、Linuxでchm読むだけでしたら他にもいくつかビューアがあるようですよ。
ご参考まで。

ここまで見た
  • 123
  •  
  • 2010/11/27(土) 22:37:06
+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;


砂時計アラームタイマー
フリックラーニング
ここまで見た

★お気に入り追加

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