トップページtech
981コメント348KB

【GUI】wxWidgets(旧wxWindows) その3【サイザー】

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2006/09/09(土) 00:06:30
クロスプラットフォーム GUI ライブラリの wxWidgets (旧 wxWindows)について語りましょう。

本家
 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
0941デフォルトの名無しさん2008/06/04(水) 23:39:29
阿呆か。第三引数は、この場合第一引数の長さの指定だろう。
http://www.cplusplus.com/reference/string/string/find.html
そもそも、findメソッド使いながら一文字ずつ調べようという発想が阿呆過ぎる。
0942デフォルトの名無しさん2008/06/05(木) 00:08:18
>>940
find は、i 文字目から探しはじめて、はじめにみつかった文字列を返す、ので、
i を1 ずつ加算していくとそりゃおかしくなるでしょうよ
0943デフォルトの名無しさん2008/06/05(木) 02:45:11
#include <iostream>
#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;
}

09449372008/06/06(金) 14:26:46
iを1ずつ加算していくのは他にちょっと事情があったからなのですが・・説明不足でした。
レスありがとうございました。解決しましたm(_ _)m
0945デフォルトの名無しさん2008/06/06(金) 15:05:22
wxRichTextCtrl
を使ってみたんですが、マルチバイト文字をテキストコントロールのインターフェースに入力すると、なんか補完ウィンドウ?みたいのが出ます。

これを出ないようにしたいのですが、どうすればいいでしょうか。
リファレンス見ても分かりませんでした。
0946デフォルトの名無しさん2008/06/06(金) 15:30:06
MacOSX 10.6でCarbon廃止されたら、wxMacもなくなるのかなあ。
0947デフォルトの名無しさん2008/06/06(金) 23:39:26
10.6で廃止は早すぎるだろう?
そのうちなくなるかもしれないが、俺達にはwxCocoaがある!
未だまともに動かないwxCococaがっ
0948デフォルトの名無しさん2008/06/07(土) 00:19:47
誰も 32bit Carbon を廃止はしないだろう、そんなことしたら MS Office が動かなくなる
0949デフォルトの名無しさん2008/06/07(土) 00:25:23
MS Office以前にAppleがSnow LepardまでにOS Xの付属アプリを
全部 Cocoa ベースに置き換えられるとは到底思えないんだよなぁ…
0950デフォルトの名無しさん2008/06/08(日) 18:42:06
>>945 です。
補完ウィンドウが出る、というか、日本語を打つと、書いた文字がスペースキーを押すと漢字変換が出来る状態になりますが、
その状態の文字が、文字を打った場所ではなく、なぜかテキストコントロールのインターフェースの一番上の行に毎回表示されてしまう、という現象のようです。(それを補完をウィンドウ?と455で言っていました。)
wxTextCtrlだと普通に打ったマルチバイト文字がその行に表示されるのですが・・wxRichTextCtrlだとなぜかこうなってしまいます。

解決方法見つからず困っています。どなたかアドバイスいただけると幸いです。
0951デフォルトの名無しさん2008/06/08(日) 23:19:46
>>950
wx のソースコードのバグを取って開発に貢献してください。
0952デフォルトの名無しさん2008/06/08(日) 23:52:47
バグというか実装されていない機能の中身おくったけどさ、
半年ぐらいしてパッチ当てるよーってメール着たんだが、さらに半年経っても当たる様子無い。
仕方ないんで、ソース取り出してクラス名変えて使ってるよ。
0953デフォルトの名無しさん2008/06/08(日) 23:52:54
自己解決しました
0954デフォルトの名無しさん2008/06/09(月) 00:08:10
自己解決したときはどう解決したかかいておいてください
あとで同じことにはまる人もいると思うので。
0955デフォルトの名無しさん2008/06/09(月) 00:34:26
自分のした質問じゃないのに「自己解決しました」とだけ書いて去っていく荒らしもいるから注意な。
0956デフォルトの名無しさん2008/06/09(月) 03:26:30
自己完結しました
09579452008/06/09(月) 11:31:24
解決してません。

やはり自分もwxWidgets自体のバグなのかなと思うのでソースをいじってみることを考えているのですが、
スペースキーで漢字変換できる状態(うまい表現の仕方あったら教えてください・・)の文章の表示位置がおかしい、というのは、wxWidgetsとIMEの連携部分で何かおかしくなっている、ということなのでしょうか。
wxTextCtrlなら正常に動く感じなので、textctrl.hとrichtextctrl.hを比べてみたりしているのですが、どの辺りを見ればいいのか・・
0958デフォルトの名無しさん2008/06/09(月) 18:00:33
>>957
気になったので調べてみた。
どうやら wxRichTextCtrl は独自の処理を行っていて
riched32.dll などを使っていないようだ。
wxTextCtrl に wxTE_RICH(2) などを付加して作成すると
riched32(20).dll を使う仕組みになっているっぽい。
09599572008/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:00
wxWidgets 一般の話をしているのか、wxMSW の話をしているのか区別をしてくれ ...
09619572008/06/09(月) 23:15:37
今はWindowsで開発しているのでwxMSWですが、
wxTextCtrlで強調表示機能実現できるかどうかってプラットフォームに依るのでしょうか??
wxTE_RICHはMSWでしか使えなくて、それ使わないと無理なので他のプラットフォームでは自動的にwxTextCtrlでは実現不可、ってことでしょうか。
0962デフォルトの名無しさん2008/06/10(火) 11:19:56
>>961
wxTE_RICH は wxMSW 専用。ほかの環境では意味をなさない。
(リッチエディットコントロールを使う指定だから)

>>959
入力した文字列をリアルタイムに強調表示したいのであれば、
OnChar(wxKeyEvent &)
あたりを使えばいいんじゃないかな。やってみないとわからないけど。
0963デフォルトの名無しさん2008/06/10(火) 11:25:22
>>961
ちょっと説明不足だったけど、強調表示などは
wxTE_RICH を指定しなくても wxTextCtrl::SetStyle() と
wxTextAttr を使えば、実現できるんじゃないかな。
09649572008/06/11(水) 00:01:42
wxTextCtrl::SetStyle
http://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:47
>>964
univ ってのは、たぶん Universal Version のこと。
Windows の例で言えば、Windows のコントロールを使わず、
全部自前で処理するようにすること。
いろいろなプラットフォームで共通した動作をするようになる。
09669572008/06/18(水) 18:21:31
なるほど、ありがとうございます。
返信遅れてすいません。

EVT_KEY_DOWN とか EVT_CHARとか使って強調表示機能っぽいものが出来始めたのですが、一つ分からないことが出てきました。

EVT_CHARは、ASCII文字の入力のタイミングは拾えるようなのですが、どうも全角文字の入力タイミングは拾えないみたいなんです。
全角文字でも強調表示したい単語があるので、全角文字が一字書き込まれる毎にそのタイミングを拾って、そのイベントが終了したらwxProcessEventでキャレット周辺の文字列を取得して、所定の文字列が含まれていたら強調表示〜みたいなことがしたいのですが、
そもそも全角文字入力の際に発生しているイベントはなんなのでしょう??
0967デフォルトの名無しさん2008/06/18(水) 21:37:04
>>966
2度EVT_KEY_DOWNが飛んできませんか?
内部で捨てていない限り2度飛んでくるので、
それを漢字1文字分にすればいいと思います。
0968デフォルトの名無しさん2008/06/18(水) 23:14:50
>>966
キー毎に強調表示するんでなくて、タイマーで1秒ごとに処理するとか ...
0969デフォルトの名無しさん2008/06/23(月) 01:12:54
なんかnoobっぽい質問なんですが

#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:25
>>969
noob ってなんだろ…

sample の memcheck.cpp をみてみたけど、 wx/setup.h の下に書いてある
wxUSE_MEMORY_TRACING か wxUSE_DEBUG_CONTEXT を 1 に
しないと使えないみたいだよ。
09719692008/06/23(月) 21:52:45
>>970
どうもありがとうございます、コンパイルはできました。

…ですがリンク時に大量のエラーが。
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
リンクコマンドはこんな感じなんですが。
0972デフォルトの名無しさん2008/06/23(月) 23:16:55
--cflagsも付けないと…
wx-config --cflags --libs --debug
でどうよ
0973デフォルトの名無しさん2008/06/23(月) 23:17:25
あ、ごめん、リンクコマンドでしたね
0974デフォルトの名無しさん2008/06/23(月) 23:25:24
>>971
wx-configだけで実行してみ?
-Lオプションとかちゃんとついてる?
09759692008/06/23(月) 23:42:53
$ wx-config --libs --debug
-pthread -Wl,-Bsymbolic-functions -lwx_gtk2ud_richtext-2.8 -lwx_gtk2ud_aui-2.8 -lwx_gtk2ud_xrc-2.8 -lwx_gtk2ud_qa-2.8 -lwx_gtk2ud_html-2.8 -lwx_gtk2ud_adv-2.8 -lwx_gtk2ud_core-2.8 -lwx_baseud_xml-2.8 -lwx_baseud_net-2.8 -lwx_baseud-2.8

こんなかんじでした。
0976デフォルトの名無しさん2008/06/23(月) 23:44:57
>>975
いや、だから、-Lがないじゃん。
--cflagsでも--ldflagsでもいいから、-Lオプションが出るようにしてみ?
09779692008/06/23(月) 23:51:19
>>976
うーん、どのフラグを指定しても-Lオプションは出ないみたいです。
ちなみにwx/setup.hをもとに戻してwxDebugContextの部分を消せば、ほかでwxWidgetクラスを参照していても
リンクまでちゃんとできます。
09789572008/06/24(火) 00:12:13
テキストコントロールの文字列を変更した直後に発生するEVT_TEXTというイベントがあるのを見つけ、それで解決しました。
レスありがとうございましたm(_ _)m
0979デフォルトの名無しさん2008/06/24(火) 00:28:58
>>977
あぁごめん、>>969からの流れ見てなかった。
自分でUbuntuにwxWidgets入れてみたら、/usr/lib/libwx*.so になってるから、-Lはいらなかった。多分>>969の環境も-L要らないんだろう。

で、wx/setup.hを勝手に変えちゃいけないよ。
wx/setup.hは、libwx*.soをビルドしたときに使ったオプションだから、変えたかったら自分でwxWidgetsをビルドしなおさないと。
0980デフォルトの名無しさん2008/06/24(火) 10:13:06
>>971
979 も書いているけど、ライブラリもリビルドしないと駄目。
リビルド方法は Windows ならやり方わかるんだけど、
Unix 関連だとわかんないや。スマソ。
09819692008/06/24(火) 23:27:51
>>980
なるほど、wxWidgets自体をリビルドですか…
思いのほかめんどいんですね。
ともかく、皆さんどうもありがとうございました。
レス数が950を超えています。1000を超えると書き込みができなくなります。