【GUI】wxWidgets(旧wxWindows) その3【サイザー】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2006/09/09(土) 00:06:30本家
http://www.wxwidgets.org/
wxWindows日本語プロジェクト
http://wxwindowsjp.sourceforge.jp/
Let's wxWidgets
http://dot-gray.s33.xrea.com/
(*)準備中(*)
http://www.geocities.co.jp/SiliconValley-Cupertino/8526/
wxWindowsで始めるC++ GUIプログラミング
http://www.h3.dion.ne.jp/~k5_n/wxwin/
wxWidgets でクロスプラットフォーム GUIアプリを作ろう
http://namazu.org/~satoru/pub/uu-2004-08/
dW : Linux : wxWindowsの概要
http://www-6.ibm.com/jp/developerworks/linux/010413/j_l-wxwin.html
SunWorld Online:wxWindows――無名だが成熟したGUIツールキット
http://www.idg.co.jp/sw/back/200102/20010219_01_report.html
0872デフォルトの名無しさん
2008/04/26(土) 09:32:15Vista WDDM以降、DDBはDIBみたいに振る舞うので注意。
0874867
2008/04/26(土) 19:59:52ありがとうございます。wxFileInputStreamなんてクラスがあるんですね。
ただ、また疑問点が出てきてしまいました。
http://www.h3.dion.ne.jp/~k5_n/wxwin/memo/ver0_2.html
ここを見て設定ファイル周りのコードを書いていたのですが、
そもそもwxFileConfigのコンストラクタの引数型が
http://docs.wxwidgets.org/2.8.6/wx_wxfileconfig.html#wxfileconfigctor
ここに書いてあるものと全然違うことに気付きました。
そもそもアプリケーションの設定ファイル周りの機能を作るにはwxFileConfigクラスを使うので正しいのでしょうか?
http://www.h3.dion.ne.jp/~k5_n/wxwin/memo/ver0_2.html
この資料は大分古いようなので・・(自分はwxwidgets2.8.7を使ってます)
ちなみにこの資料に書いてある通りに書くと、
wxFileConfigクラスのインスタンスのRead関数は正常に動くのですが、Write関数が正常に動きません・・
コンパイルは成功しているのですが、Write関数で設定ファイルを更新しようとしても何も更新されません。。
どなたかアドバイス頂けると幸いです。
0875デフォルトの名無しさん
2008/04/27(日) 08:11:310876デフォルトの名無しさん
2008/04/27(日) 10:02:270877874
2008/04/28(月) 12:19:09wxFileConfig::Write(); が、コンパイルには成功するのに正常に動作しない問題が解決しました。
正常に動かないときは
wxFileConfig* m_pConfig
..略..
m_pConfig->Write(wxT("sample"), 10);
のように、wxFileConfigのポインタからアロー演算子でWriteメソッドにアクセスしていたのですが、
wxFileConfig m_Config(コンストラクタの引数);
m_Config.Write(wxT("sample"), 10);
のように、ポインタにせずドット演算子でWriteメソッドにアクセスすると、書き込みに成功しました。
これはwxWidgetsのバグなんでしょうか??
どなたか同じ症状の方はいらっしゃるでしょうか?
0878デフォルトの名無しさん
2008/04/28(月) 13:15:540879デフォルトの名無しさん
2008/04/28(月) 13:16:20そんなバグは聞いたことがない。
m_pConfigの実体を確保し忘れてるとか、多分そんなのが原因だと思う。
0880874
2008/04/28(月) 15:38:11#include "wx/wx.h"
#include "wx/config.h"
#include "wx/fileconf.h"
wxString config_file = wxGetCwd();
#if defined(__WXMSW__)
config_file += "\\";
#else
config_file += '/';
#endif
config_file += APP_CONFIG_FILE; // APP_CONFIG_FILEはdefineマクロ
wxFileConfig* m_pConfig = new wxFileConfig(
wxEmptyString,
wxEmptyString,
config_file,
wxEmptyString,
wxCONFIG_USE_LOCAL_FILE);
int dt = 10;
m_pConfig->Write(wxT("sample"), long(dt));
newで実体確保できてますよね??(おそるおそる)
これをビルドしようとするとコンパイルもリンクもできるんですが、
m_pConfig->Write(wxT("sample"), long(dt));
の部分を実行しても何も起きないんです。
Read();は普通に動くんですが・・
0881デフォルトの名無しさん
2008/04/28(月) 15:57:160882デフォルトの名無しさん
2008/04/28(月) 16:20:22両方やってないから書き込まれない。
0883874
2008/04/28(月) 16:39:36>>882さん
レスありがとうございます。
Write(); のあと Flush(); でいけました!まじありがとうございます!
Flushが必要、という情報が見つけられないのですが、よろしかったらソースを教えて頂けないでしょうか??
あと、「両方やってないから書き込まれない」の「両方」とは、Flush(); と、あともう1つは何でしょうか??
0884デフォルトの名無しさん
2008/04/28(月) 16:45:51>>882 を読んでそれが何かわからないようならC++を勉強しなおした方がいい
0885デフォルトの名無しさん
2008/04/28(月) 16:48:43「両方」じゃなくて「どちらも」の間違いだった。どちらかでも行えば書き込まれる。
あと、人に聞くまえにリファレンスを読め。
0886874
2008/04/28(月) 17:18:22の
permanently writes all changes (otherwise, they're only written from object's destructor)
部分だったんですね。。
http://docs.wxwidgets.org/stable/wx_wxconfigbase.html#wxconfigbasewrite
こっちのWrite();のリファレンスの方には
write the specified value to the config file
ってあるので、Write();だけでファイルに書き込めるのだと思っていました。全く分かりませんでした。。
ありがとうございましたm(_ _)m
0887851
2008/05/02(金) 23:40:36>>853 さん
めちゃくちゃ遅くなってすいません・・
レスありがとうございましたm(_ _)m
なんか書き込んだと思ったら書き込んでなかった?ようです><
すいませんm(_ _)m
0888デフォルトの名無しさん
2008/05/06(火) 01:24:28勉強し始めたばかりなんですが、トップフレームにボタンを作って、
このボタンを押すと、別スレッドで重い処理を実行させて、終わったら
「終わりました。」てメッセージボックスを表示させるプログラムを書いてます。
別スレッドのなかでwx.MessageBox("終わりました。","")を実行すると、
Windowsでは普通に表示されてOKボタンでメッセージボックスが閉じますが、
Linux(GTK)だとメッセージボックスが表示されますが、固まってしまいます。
WindowsとLinuxどちらの動作が正常なんでしょうか?
(wx.Frameなどを継承していない)別スレッドのクラスからwxを使っていいのでしょうか?
0889デフォルトの名無しさん
2008/05/06(火) 19:56:05http://docs.wxwidgets.org/stable/wx_threadfunctions.html#wxmutexguienter
0890デフォルトの名無しさん
2008/05/09(金) 20:18:36ありがとうございます。
やっぱり何も対策を取らないと固まるんですね^^;
wx.MessageBox("終わりました。","")の手前にwxMutexGuiEnter()を書いて、
直後にwxMutexGuiLeave()を書いて試しましたが、wxMutexGuiEnter()で
固まってしまいました。たぶんMutexの初期化?が足りないのかもしれません。
http://wiki.wxpython.org/LongRunningTasks
ここを参考にwx.PostEventを使って、Windows&Linuxで思い通りの動作になりました。
0891デフォルトの名無しさん
2008/05/11(日) 07:22:33config.gccのopenglのオプションを有効にしてgccでコンパイルしました。
openGL用のライブラリがリリース版とデバッグ版の2つできたのですが、
2つともファイルサイズが40kb程度しかありません。
これで正しくライブラリができているのでしょうか?
0892デフォルトの名無しさん
2008/05/26(月) 12:11:450893デフォルトの名無しさん
2008/05/26(月) 12:24:10GLCanvasってレンダリングコンテキストのハンドリングぐらいしかやってないんじゃないかな。それだけならそんなもんじゃないかなぁ。
0894デフォルトの名無しさん
2008/05/26(月) 23:56:39>それ用の関数ってないですよね??
質問の仕方、心構えが間違ってる。ありませんか?と自然に聞けば良い。
自分が既に調べてみつからなかったんだけど ... ということをアピールして、
しかも、自分って正しいですよね、という雰囲気である。
これでは自分で心を閉ざしているようなものであって、
API レファレンスを読めばみつかる API もみつからない。
というのは別にして、wxString::find(const wxString&,size_t) ではだめなの?
0895デフォルトの名無しさん
2008/05/26(月) 23:59:560896デフォルトの名無しさん
2008/05/27(火) 00:04:290897デフォルトの名無しさん
2008/05/27(火) 00:28:370898892
2008/05/27(火) 02:09:22>>質問の仕方、心構えが間違ってる。ありませんか?と自然に聞けば良い。
>>自分が既に調べてみつからなかったんだけど ... ということをアピールして、
う、こういう聞き方、あまりよろしくないのですかね??
単純に「ありませんか??」だとググれと言われてしまうし、かと言って毎回なんか質問書き込む度に既に調べて分からなかったので質問しましたってのは正直億劫だったのでこんな感じの聞き方になっていましたが・・
wxString::Findだと、最初にマッチした部分のインデックスが返ってくるだけですよね??
でもwxString::Cmpとforとif使ってなんとかなったので、質問したこと自体は解決しました。
>API レファレンスを読めばみつかる API もみつからない。
これはなんでですか??
この質問の仕方だとなんでAPIリファレンスに書いてあるAPIも見つからなくなる、のでしょう?
突っ込まれて反論してるのではなく、どういう意味か分からなかったので単純に教えて頂きたいな、ということです。
0899デフォルトの名無しさん
2008/05/27(火) 02:25:57>毎回なんか質問書き込む度に既に調べて分からなかったので質問しました
答える側になった事を考えれば分かると思うが、これが正解
事前に何を調べて自分としてはどう思っていて何が疑問なのかを丁寧に書く
これしか無いよ
0900デフォルトの名無しさん
2008/05/27(火) 02:32:59解決したならいいけどCmp()でどんなコードを書いたの?
0901デフォルトの名無しさん
2008/05/27(火) 03:13:25>wxString::Findだと、最初にマッチした部分のインデックスが返ってくるだけですよね??
この「ですよね??」という聞きかたが良くないです。
自分はこの API は既に知っているけど ... ということをアピールして、
しかも、自分って正しいですよね、という雰囲気である。
これでは自分で心を閉ざしているようなものであって、
この API が使える API であるということを認識出来ない。
自分はこれまで最初にマッチした部分のインデックスが返ってくるだけだと思っていたんだけれど、
相手が wxString::find を言ったということは、実は二つ目以降も返ってくるんではないか?
と謙虚に考えられなくなるわけです。相手に言われたら、
自分を疑って、もういちど自分で API レファレンスを読んでみればわかるはずで、
こうやって小言を言われる必要もなくなるわけです。というのが、
> この質問の仕方だとなんでAPIリファレンスに書いてあるAPIも見つからなくなる、のでしょう?
>突っ込まれて反論してるのではなく、どういう意味か分からなかったので単純に教えて頂きたいな、ということです。
への返答です。
僕は自分自身が、「ですよね?」「じゃないんですか?」と言いたくなったら、
まず自分を疑うことにしています。
その言葉を発した時点で、考えるのを放棄しているからです。
というのはいいとして、wxString::find(const wxString&,size_t) とわざわざ
オーバーロードしてある引数までかいてあるのは何故だとおもいますか?
それはそのバージョンをつかうと、第二変数でどこから調べるかが指定出来るからです。
そうするとそれを繰り返し呼べばいいわけです。
ちなみに find が大文字か小文字かも違います。
http://docs.wxwidgets.org/2.8.6/wx_wxstring.html#wxstringat
をみてください。
0902デフォルトの名無しさん
2008/05/27(火) 03:24:20あとでゆっくり読むぜ
0903デフォルトの名無しさん
2008/05/27(火) 03:45:34_,,....,,_ _人人人人人人人人人人人人人人人_
-''":::::::::::::`''> ゆっくりしていってね!!! <
ヽ::::::::::::::::::::: ̄^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
|::::::;ノ´ ̄\:::::::::::\_,. -‐ァ __ _____ ______
|::::ノ ヽ、ヽr-r'"´ (.__ ,´ _,, '-´ ̄ ̄`-ゝ 、_ イ、
_,.!イ_ _,.ヘーァ'二ハ二ヽ、へ,_7 'r ´ ヽ、ン、
::::::rー''7コ-‐'"´ ; ', `ヽ/`7 ,'==─- -─==', i
r-'ァ'"´/ /! ハ ハ ! iヾ_ノ i イ iゝ、イ人レ/_ルヽイ i |
!イ´ ,' | /__,.!/ V 、!__ハ ,' ,ゝ レリイi (ヒ_] ヒ_ン ).| .|、i .||
`! !/レi' (ヒ_] ヒ_ン レ'i ノ !Y!"" ,___, "" 「 !ノ i |
,' ノ !'" ,___, "' i .レ' L.',. ヽ _ン L」 ノ| .|
( ,ハ ヽ _ン 人! | ||ヽ、 ,イ| ||イ| /
,.ヘ,)、 )>,、 _____, ,.イ ハ レ ル` ー--─ ´ルレ レ´
0904デフォルトの名無しさん
2008/05/27(火) 10:02:580905デフォルトの名無しさん
2008/05/27(火) 13:52:470906デフォルトの名無しさん
2008/05/27(火) 17:45:130907デフォルトの名無しさん
2008/05/27(火) 19:56:550908892
2008/05/27(火) 22:50:50>ちなみに find が大文字か小文字かも違います。
これに気づいてませんでした。C++互換というやつがあったんですね・・。
>相手が wxString::find を言ったということは、実は二つ目以降も返ってくるんではないか?
これはもちろん考えてます。が、それでも完全に見逃していました。。
wxString::find(const wxString&,size_t) でいけそうです。ありがとうございます。
が・・
>>それ用の関数ってないですよね??
>質問の仕方、心構えが間違ってる。ありませんか?と自然に聞けば良い。
これは分かるんですが・・
>>wxString::Findだと、最初にマッチした部分のインデックスが返ってくるだけですよね??
>この「ですよね??」という聞きかたが良くないです。
これはではどう聞けばよかったんでしょう?
これ以外に聞きようが無い気がするんですが・・
0909892
2008/05/27(火) 22:55:44こんなの書いてました汗
wxString str_wk;
int count;
wxString source = "なんか色々";
int length = sourceのデータ長
for (int i = 0; i < length; i++){
str_wk = source.Mid(i, 6);
if (0 == str_wk.Cmp(wxT("sample"))){
count++;
}
}
0910デフォルトの名無しさん
2008/05/27(火) 23:10:59ですよね?と聞く前に、wxString のメンバ関数一覧を再確認すればよかったんじゃないかな。たぶん。
0911デフォルトの名無しさん
2008/05/27(火) 23:47:43○(調べたけどわかんなかったので)ありませんか?
△(調べずに)ありませんか? … (ググれと言われる)
×ないですよね? … (ないんですよ。そうでしょう?(同意求む)的な感じ)
って感じなのかな。
0912892
2008/05/27(火) 23:55:56再確認して、その上で分からなかった(見逃してた)んです。
なので、言ってしまえば回答に直結するレス頂いてそれでも気づかなかった自分がバカだったってだけの話なのですが汗
0913デフォルトの名無しさん
2008/05/28(水) 00:03:07まあふと疑問がでてドキュメント見たときに、
そのクラスのあんま関係なさそうだけど他のメソッドもついでに
全部勉強しておいてやろうとかいう感じでやってればスキルもあがるんじゃないでしょうか。
0914デフォルトの名無しさん
2008/05/30(金) 10:19:55コンパイラが64bitなら無問題?
0915デフォルトの名無しさん
2008/05/30(金) 11:55:450916デフォルトの名無しさん
2008/05/30(金) 12:15:03wxCocoaの完成を待つしか無い???
0917デフォルトの名無しさん
2008/05/30(金) 12:53:48いまんところの Apple の発表は、 Carbon の GUI 部分は 64 bit にしない、Carbon の非 GUi 部分は 64 bit にする、とのことだけど、まあすぐ気の変わる会社だから誰にも分かりません
Qt はもう方針転換して、Cocoa で組みなおしてます。もう Cocoa 64 bit のβ版がでてるはず。
wxMac はメンテナンスはされてるけど、ドキュメントから何から激烈に古いのでこれを機会に wxCocoa を誰か頑張ってくれ。
0918デフォルトの名無しさん
2008/05/30(金) 13:03:150919デフォルトの名無しさん
2008/05/30(金) 13:10:59Windows でも cygwin とかでX11 サーバをいれとけば wxGTK も動くというのと同じ状況です
OS X の WindowServer は X11 ではないので。
まあ X11 は標準でついてくるけど。
0920デフォルトの名無しさん
2008/05/30(金) 13:49:290921デフォルトの名無しさん
2008/05/30(金) 15:31:32クリップボードさえX専用クリップボードだったり、
Windowsの16ビットアプリケーションより連携悪い。
0922デフォルトの名無しさん
2008/05/30(金) 16:00:05cout << で、マルチバイト文字が化けて表示されてしまいます。
同じような症状の方、また解決方法を分かる方いらっしゃいましたらご教示いただけると嬉しいです。
ちなみにwxMSWをunicodeモードでインストールして使っています。
0923デフォルトの名無しさん
2008/05/30(金) 16:03:510924デフォルトの名無しさん
2008/05/31(土) 16:12:39Code::Blocksのバグなんだ。興味ない人は無視してくれ。
詳細はチラ裏に書いたので、もし偉い人がいたら、本家にバグ報告してほしい。
ここからチラ裏
日本語のMac OS X上のCode::Blocksで、新規プロジェクトをウィザードで作ろうとすると、「Script compile error」というのが出る。
これは、Code::Blockが、ウィザードを記述してるスクリプト(Squirrel)を読み込むときに、U+005CがU+00A5に変換される(ファイルがShift-JISとして読み込まれる)のが原因。
src/sdk/scriptingmanager.cppの中にある、ScriptingManager::LoadScriptがスクリプトをファイルから読み込む関数っぽいので、その中の、cbReadFileContents(f)をcbReadFileContents(f, wxFONTENCODING_UTF8)に置き換えればいい。
だが、俺は英語ができないし、バグ報告のためのユーザアカウントも持っていないので、せめてここに書くぐらいしかできないorz
ここまでチラ裏
0925デフォルトの名無しさん
2008/06/01(日) 10:58:290926デフォルトの名無しさん
2008/06/02(月) 23:48:04了解
0927デフォルトの名無しさん
2008/06/03(火) 00:10:51自分でビルドしようと思ってもコンパイルエラー。swigのバージョンかな?
動かぬなら 動くまで待とう wxPython
0928デフォルトの名無しさん
2008/06/03(火) 19:47:070929デフォルトの名無しさん
2008/06/04(水) 00:20:540930デフォルトの名無しさん
2008/06/04(水) 00:55:38いや、本家フォーラムではもう話題になってる。日本で話題になって無いからチラ裏してみただけ。
0931デフォルトの名無しさん
2008/06/04(水) 00:57:500932デフォルトの名無しさん
2008/06/04(水) 02:16:47ん?採用してるプロダクトも多いし
コミュニティも活発じゃん。
なんでそんな事を思うのかい?
0933デフォルトの名無しさん
2008/06/04(水) 09:00:21コミュニティも活発じゃないからだろうきっと。
0934デフォルトの名無しさん
2008/06/04(水) 10:01:180935デフォルトの名無しさん
2008/06/04(水) 12:26:07Photoshop Elements、Opera、Google Earth、SkypeなんかがQtだね。
確かにちょっとよさそうだし、有料なんでサポートもしっかりしてそうだけど
wxWidgetsをすでに使ってるんだったら乗り換えるほどではないかな・・
0936デフォルトの名無しさん
2008/06/04(水) 12:27:18じゃあ乗り換えるのやめる。
0937デフォルトの名無しさん
2008/06/04(水) 18:08:03if(string::npos != mml.find(wxT("\n"), i ,len)){
line_count++;
}
のように書いてみたのですが、改行文字じゃないところまでマッチしてしまいます。
正しい書き方分かる方いらっしゃいましたら教えて頂けると嬉しいです。
環境はWindows wxMSW2.8.7
文字コードはunicodeです。
0938デフォルトの名無しさん
2008/06/04(水) 20:03:39いまいちこの辺の理解ができない。
0939デフォルトの名無しさん
2008/06/04(水) 22:02:11i はどうやって更新してるの ???
0940937
2008/06/04(水) 22:27:08分かりにくくてすいません。
lenはずっと固定1で、
iは1ループで1ずつ加算していく感じです。
単純に一文字ずつ調べていくように書きました。
あとmmlってのがwxStringオブジェクトです。。
0941デフォルトの名無しさん
2008/06/04(水) 23:39:29http://www.cplusplus.com/reference/string/string/find.html
そもそも、findメソッド使いながら一文字ずつ調べようという発想が阿呆過ぎる。
0942デフォルトの名無しさん
2008/06/05(木) 00:08:18find は、i 文字目から探しはじめて、はじめにみつかった文字列を返す、ので、
i を1 ずつ加算していくとそりゃおかしくなるでしょうよ
0943デフォルトの名無しさん
2008/06/05(木) 02:45:11#include <string>
using namespace std;
int main(void)
{
string src = "aaaa\nbbb\nc\n\nddddd\n";
string::size_type pos = 0;
size_t count = 0;
while ((pos = src.find("\n", pos)) != string::npos) {
pos++;
count++;
}
cout << count << endl;
return 0;
}
0944937
2008/06/06(金) 14:26:46レスありがとうございました。解決しましたm(_ _)m
0945デフォルトの名無しさん
2008/06/06(金) 15:05:22を使ってみたんですが、マルチバイト文字をテキストコントロールのインターフェースに入力すると、なんか補完ウィンドウ?みたいのが出ます。
これを出ないようにしたいのですが、どうすればいいでしょうか。
リファレンス見ても分かりませんでした。
0946デフォルトの名無しさん
2008/06/06(金) 15:30:060947デフォルトの名無しさん
2008/06/06(金) 23:39:26そのうちなくなるかもしれないが、俺達にはwxCocoaがある!
未だまともに動かないwxCococaがっ
0948デフォルトの名無しさん
2008/06/07(土) 00:19:470949デフォルトの名無しさん
2008/06/07(土) 00:25:23全部 Cocoa ベースに置き換えられるとは到底思えないんだよなぁ…
0950デフォルトの名無しさん
2008/06/08(日) 18:42:06補完ウィンドウが出る、というか、日本語を打つと、書いた文字がスペースキーを押すと漢字変換が出来る状態になりますが、
その状態の文字が、文字を打った場所ではなく、なぜかテキストコントロールのインターフェースの一番上の行に毎回表示されてしまう、という現象のようです。(それを補完をウィンドウ?と455で言っていました。)
wxTextCtrlだと普通に打ったマルチバイト文字がその行に表示されるのですが・・wxRichTextCtrlだとなぜかこうなってしまいます。
解決方法見つからず困っています。どなたかアドバイスいただけると幸いです。
0951デフォルトの名無しさん
2008/06/08(日) 23:19:46wx のソースコードのバグを取って開発に貢献してください。
0952デフォルトの名無しさん
2008/06/08(日) 23:52:47半年ぐらいしてパッチ当てるよーってメール着たんだが、さらに半年経っても当たる様子無い。
仕方ないんで、ソース取り出してクラス名変えて使ってるよ。
0953デフォルトの名無しさん
2008/06/08(日) 23:52:540954デフォルトの名無しさん
2008/06/09(月) 00:08:10あとで同じことにはまる人もいると思うので。
0955デフォルトの名無しさん
2008/06/09(月) 00:34:260956デフォルトの名無しさん
2008/06/09(月) 03:26:300957945
2008/06/09(月) 11:31:24やはり自分もwxWidgets自体のバグなのかなと思うのでソースをいじってみることを考えているのですが、
スペースキーで漢字変換できる状態(うまい表現の仕方あったら教えてください・・)の文章の表示位置がおかしい、というのは、wxWidgetsとIMEの連携部分で何かおかしくなっている、ということなのでしょうか。
wxTextCtrlなら正常に動く感じなので、textctrl.hとrichtextctrl.hを比べてみたりしているのですが、どの辺りを見ればいいのか・・
0958デフォルトの名無しさん
2008/06/09(月) 18:00:33気になったので調べてみた。
どうやら wxRichTextCtrl は独自の処理を行っていて
riched32.dll などを使っていないようだ。
wxTextCtrl に wxTE_RICH(2) などを付加して作成すると
riched32(20).dll を使う仕組みになっているっぽい。
0959957
2008/06/09(月) 19:22:43ドキュメントを色々読み直していたのですが、もしかしたら自分のやりたいことがwxTextCtrlでもできるかもしれないような記述を見つけたので、
wxTextCtrlをもうちょっといじってみようかと丁度思っていたところでした。
自分のやりたいことというのが、プログラマ向けのエディタによくある予約語の強調表示なのですが、
http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx381.htm
ここに、
「例えば、1つ1つの文字に色やフォントを指定することも可能である
(ただし、Windows下では、スタイルをサポートするためにwxTE_RICHスタイルが要求されることに注意すること)。」
のように書いてあります。
さらにその下に
text->SetDefaultStyle(wxTextAttr(*wxRED));
text->AppendText("Red text\n");
text->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
text->AppendText("Red on grey text\n");
のようなソースが示されていて、なんとなく感じは分かるのですが、
これだとインタフェースに文字を打ち込む際、特定の文字を打ち込んだ時リアルタイムに強調表示するようにできるのかどうか
(もちろんその文字を一部消したら、強調表示をリアルタイムで解除するようにもできるかどうか)分かりません。wxTextCtrlでこのようなことは出来るのでしょうか??質問ばかりですいません。
0960デフォルトの名無しさん
2008/06/09(月) 22:20:000961957
2008/06/09(月) 23:15:37wxTextCtrlで強調表示機能実現できるかどうかってプラットフォームに依るのでしょうか??
wxTE_RICHはMSWでしか使えなくて、それ使わないと無理なので他のプラットフォームでは自動的にwxTextCtrlでは実現不可、ってことでしょうか。
0962デフォルトの名無しさん
2008/06/10(火) 11:19:56wxTE_RICH は wxMSW 専用。ほかの環境では意味をなさない。
(リッチエディットコントロールを使う指定だから)
>>959
入力した文字列をリアルタイムに強調表示したいのであれば、
OnChar(wxKeyEvent &)
あたりを使えばいいんじゃないかな。やってみないとわからないけど。
0963デフォルトの名無しさん
2008/06/10(火) 11:25:22ちょっと説明不足だったけど、強調表示などは
wxTE_RICH を指定しなくても wxTextCtrl::SetStyle() と
wxTextAttr を使えば、実現できるんじゃないかな。
0964957
2008/06/11(水) 00:01:42http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx381.htm#wxtextctrlsetstyle
「選択された部分の」スタイルを変更する。
この部分見逃していました。。
OnChar()ってのはMSW専用なんでしょうか。
msw/textctrl.h には書かれていますが普通のtextctrl.hには無いみたいです。
univ/textctrl.hってのにもありますが、univってのは何用なのか・・
でもとりあえずEVT_KEY_DOWNキーイベント用のハンドラをSetStyle()使って書けば実現できる気がしてきました。
ご丁寧に何度もありがとうございましたm(_ _)m
0965デフォルトの名無しさん
2008/06/11(水) 10:46:47univ ってのは、たぶん Universal Version のこと。
Windows の例で言えば、Windows のコントロールを使わず、
全部自前で処理するようにすること。
いろいろなプラットフォームで共通した動作をするようになる。
0966957
2008/06/18(水) 18:21:31返信遅れてすいません。
EVT_KEY_DOWN とか EVT_CHARとか使って強調表示機能っぽいものが出来始めたのですが、一つ分からないことが出てきました。
EVT_CHARは、ASCII文字の入力のタイミングは拾えるようなのですが、どうも全角文字の入力タイミングは拾えないみたいなんです。
全角文字でも強調表示したい単語があるので、全角文字が一字書き込まれる毎にそのタイミングを拾って、そのイベントが終了したらwxProcessEventでキャレット周辺の文字列を取得して、所定の文字列が含まれていたら強調表示〜みたいなことがしたいのですが、
そもそも全角文字入力の際に発生しているイベントはなんなのでしょう??
0967デフォルトの名無しさん
2008/06/18(水) 21:37:042度EVT_KEY_DOWNが飛んできませんか?
内部で捨てていない限り2度飛んでくるので、
それを漢字1文字分にすればいいと思います。
0968デフォルトの名無しさん
2008/06/18(水) 23:14:50キー毎に強調表示するんでなくて、タイマーで1秒ごとに処理するとか ...
0969デフォルトの名無しさん
2008/06/23(月) 01:12:54#include <wx/memory.h> して wxDebugContext::PrintStatistics(); すると
error: ‘wxDebugContext’ has not been declared
というエラーになるんですが、なぜなんでしょうか。
プリプロセッサかなにか定義しないといけないんでしょうか。
ちなみに関係ないと思いますがwx-configには--debugを渡しています。
バージョンは2.8.7.1です。
0970デフォルトの名無しさん
2008/06/23(月) 17:28:25noob ってなんだろ…
sample の memcheck.cpp をみてみたけど、 wx/setup.h の下に書いてある
wxUSE_MEMORY_TRACING か wxUSE_DEBUG_CONTEXT を 1 に
しないと使えないみたいだよ。
0971969
2008/06/23(月) 21:52:45どうもありがとうございます、コンパイルはできました。
…ですがリンク時に大量のエラーが。
undefined reference to `wxObject::operator new(unsigned int, wchar_t const*, int)'
とか
undefined reference to `wxObject::operator delete(void*)'
とか
/usr/include/wx-2.8/wx/memory.h:329: undefined reference to `wxDebugContextDumpDelayCounter::sm_count'
とか。
うーん。
g++ `wx-config --libs --debug` *.o
リンクコマンドはこんな感じなんですが。
レス数が950を超えています。1000を超えると書き込みができなくなります。