【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/ >103- ttp://diary.imou.to/~AoiMoe/2004.09/middle.html#2004.09.13 c++とwxWidgetsを勉強中です。 わからないことがあるので教えていただけませんか。 void functestFrame::OnButton2Click(wxCommandEvent& event) { wxString str1 = L"まっぎょ"; functestFrame::wxStringfunc(&str1); } void functestFrame::wxStringfunc(wxString* str) { wxMessageBox(*str);} 4-10はコンパイルと実行できました。 void functestFrame::OnButton3Click(wxCommandEvent& event) { wxArrayString temp1; temp1.Add(wxT("ぽけもん")); functestFrame::wxArrayStringfunc(&temp1); } void functestFrame::wxArrayStringfunc(wxArrayString *arraystring) { for (int i=0 ; i< *arraystring.GetCount() ; i++) {*arraystring.Item(i);} } コンパイルエラーがでます。 C:\Users\x\Desktop\functest\functestMain.cpp||In member function 'void functestFrame::wxArrayStringfunc(wxArrayString*)':| C:\Users\x\Desktop\functest\functestMain.cpp|169|error: request for member 'GetCount' in 'arraystring', which is of non-class type 'wxArrayString*'| C:\Users\x\Desktop\functest\functestMain.cpp|170|error: request for member 'Item' in 'arraystring', which is of non-class type 'wxArrayString*'| ||=== Build finished: 2 errors, 0 warnings (0 minutes, 1 seconds) ===| wxstringと同じ方法をしているつもりなのですが、どのようにすればコンパイルができるのでしょうか? >>441 ちょっとしたコードを書いてみた http://pastebin.com/KCE8eyDe コンパイルが通らない原因 wxArrayStringの通常変数とポインタ変数の違いがわかっていない C++では実体に対しては「.」でアクセス、ポインタ変数に対しては「->」アロー演算子でアクセスする 参考:http://brain.cc.kogakuin.ac.jp/ ~kanamaru/lecture/prog1/13-03.html × arraystring.GetCount(); ○ arraystring->GetCount(); あと関数の入り口で「wxArrayString *arraystring」と宣言されているならば その関数内部では「*arraystring」ではなく「arraystring」でアクセスする 「*」をつけてしまうと「arraystring」のポインタのポインタになってしまう void functestFrame::wxArrayStringfunc(wxArrayString *arraystring) { for (int i=0 ; i< *arraystring.GetCount() ; i++) {*arraystring.Item(i);} ← ここもいまいち何をしようとしてるかわからん } あと細かいことを言うと文字列の宣言を以下のようにしているようだが wxString str1 = L"まっぎょ"; せっかく用意されているので「wxT」マクロを使った方がいい wxString str1 = wxT("まっぎょ"); これでどのような環境でも日本語が変数に入れられるはず >>442 ありがとうございます。 サンプルをコンパイルして、実行できました。 通常変数と、ポインタ変数ですか。 リンク先を読んで理解します。 すみません、あと一点教えてください。 wxStringは、通常変数? wxArrayStringは、ポインタ変数?を利用しているというころでしょうか? 下記マニュアルをどのように調べればよいのでしょうか? http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx368.htm http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx32.htm >>444 >wxStringは、通常変数? wxArrayStringは、ポインタ変数?を利用しているというころでしょうか? C/C++ではクラスや変数の宣言時に実体を宣言するかポインタで宣言するか決められるので その質問はそもそもちょっとポイントがずれている 【ポインタ】 例えば wxButton *btn1 = new wxButton(panel, wxID_BUTTON1, wxT("ボタン1")); はwxButtonクラスをポインタ変数で宣言している *btn1内のクラスメソッドをいじるには「*btn1->GetLabel();」と書く必要がありますよ、と 普通は大きなクラスはポインタ変数でインスタンスを作って宣言したほうが良い 【実体】 wxString myTestStr; myTestStr = wxT("テスト文字列"); myTestStr.IsEmpty(); ← 空文字であるかどうか調べてる >下記マニュアルをどのように調べればよいのでしょうか? もうお気づきかもしれないが http://wxwindowsjp.sourceforge.jp/docs/html/wx/wx368.htm に載っているのは wxStringという「クラス」についてのリファレンス wxString::Hogehoge のように「::」がくっついた後半部分がそのクラスが使用出来るメソッド(関数) myTestStr.IsEmpty(); ← wxStringのIsEmptyというメソッドをつかっている 自分が欲しい機能をクラスリファレンスで探し、クラスを宣言してどのように使えるかは メソッド部分を見れば良いということ。 DLLよりもstaticの方が配布サイズ小さくなるな DLLリンクで作るともちろんexeは小さくなるけど DLLも一緒に配布するとなるとでかくなるって意味 いや先入観無しで聞いてくれ 最初はそう思ってたんだが 確かにDLLリンクで作るとexeはめっちゃ小さい しかし実際そこそこの規模のプログラム書いて staticで作ってみて出来たexeが (前者のexeに必要なDLLを合わせたサイズに比べると) 意外と小さい DLLはwxWidgetsのシンボル全部入ってるけど、 staticリンクだと本体が使うシンボルだけ.aから 引っ張ってくるんだから、そうなるのは当たり前 wxWidgetsで作ったexeが一個(あるいは少数)しかないときはそうなるのは当たり前。 DLLのメリットが生きるのはOS等のようにexeが無数にあってさらに共通部分(API)が多い場合。 趣味でやってるならSTATICでいいんじゃね? めずらしくwxWidgetsスレが伸びている・・・ 2.9.4 はまだ Development だよね。 いつ Stable になるんだよ、まったく。 事故解決しました。 リンカ設定ではディレクトリで vc_dll の方を指定していたのですが、 PreprocessorDefinitions に WXUSINGDLL が抜けていたため、 static link しようとしてシンボル未解決になっていたようです。 つ ttp://wiki.wxwidgets.org/Microsoft_Visual_C%2B%2B_Guide#Project_properties >>445 レスありがとうございます。 >>その質問はそもそもちょっとポイントがずれている ポインタ渡し、参照渡しを調べていたのですが、勘違いしていたようです。 int,charなどの型の場合・関数の場合・クラスの場合と大体は似ているようですが、 クラス内の機能を使用するときには、->を使わないとだめなことがなんとなくわかりました。 void functestFrame::OnButton2Click(wxCommandEvent& event) { wxString str1 = wxT("まっぎょ"); functestFrame::wxStringfunc(&str1); } void functestFrame::wxStringfunc(wxString* str) { wxMessageBox(*str); str -> Last();} 教えてもらったとおりやると、コンパイルと実行ができ、str.Lastとやればコンパイルエラーがでました。 間接参照演算子の*strの使い方で勘違いしていました。 あくまで、データをみるだけで、クラス等のpointer渡しの場合かつその機能を使う 場合は、->を使うんですね。 ありがとうございました。 wxWCharBuffer の使い方が良く判りません。 わからないことがあるので、教えてください。 http://fossies.org/unix/misc/wxWidgets-2.9.4.tar.gz:a/wxWidgets-2.9.4/utils/helpview/src/client.cpp のソースの中で、149行目と150行目の : は何という演算子で、どのようなことをしているのでしょうか? 149 MyFrame::MyFrame(wxFrame *frame, const wxString& title) 150 : wxFrame(frame, wxID_ANY, title, wxDefaultPosition, wxSize( 200, 100 ) ) 149行目は、コンストラクターというのはなんとなくわかりますが、その後の演算子?がなにをしているのかが わかりません。 検索しても、スコープ演算子はでてくるのですが、: 一個だけの演算子の意味がでてきません。 試しに、150行目に該当する部分をコメントアウトしてみると、ビルドは通りますが、実行しても何も表示されません。 {}の中に、 wxFrame(frame, wxID_ANY, title, wxDefaultPosition, wxSize( 200, 100 ) );を追加してビルドして 実行しても何も表示されません。 すいません、リンク先の内容が質問したい内容と同じではありませんでした。 実際は、C:\wxWidgets-2.9.3\samples\sockets\client.cppの内容をビルドしながら理解しようとしています。 client.cpp // frame constructor MyFrame::MyFrame() : wxFrame((wxFrame *)NULL, wxID_ANY, _("wxSocket demo: Client"),wxDefaultPosition, wxSize(300, 200)) ここのコンストラクタの後の、: の演算子?であっているのかどうかも不明なのですが・・・ これは何をしているのでしょうか? >>475 MyFrameは多分継承したクラスなので、基底クラスであるwxFrameのコンストラクタを呼び出している。 >>476 教えてくれてありがとうございます。 継承と基底クラスを調べてみます。 連結グラフ G=(V,E) と重み d:E->R+が与えられたとき 最小木を求めよ。 wxStaticBitmapに透過png画像を指定して描画しても、 透過になってくれてないようなのですが、 単にwx.BITMAP_TYPE_PNGで読んだものを貼るだけじゃ駄目なんでしょうか? wxInitAllImageHandlers() の呼び忘れや png を作成したソフトが原因で正常に透過処理されないとかかなあ サンプルのimage参考にするといいと思うよ スライド565ページって、出版じゃないのかー。 それでも俺は原書を選ぶぜ。 webはスライドだけど savefileボタン押したら 普通にPDFが落ちて来た ・wxAuiPaneInfoで、一度設定したCaptionをCaptionVisibleのtrue, falseで切り替えたいけど なぜか反映されん、なんでだぜ wx 2.9.4使ってみた ・GTK環境 wx2.8でSetSizer呼んだ後Fit呼ぶと異常終了するバグが2.9.4では直ってた ・同じくGTK環境 wxListctrlでwxLIST_AUTOSIZEしても、自動でカラムの幅が調整されない (なんかメーリス見たらwxPythonのロビンさんが「まだ直ってないの?」みたいなこと書いてた。誰か直して。) GTK+ は多段タブも実現できんのだな WindowsにできてGTKにできんことが結構見えてきた ミゲルさんもこんなこと書いてるし、Linuxのデスクトップはダメだな http://www.yamdas.org/column/technique/linuxdesktopj.html eNprdGhEhnH6XMi8RgcFfQj71L1t6+FS Cvr6jXc0G/c3BgLhfriwvl5No4NejUJz LpIZQVwwPY0OQOkaBSBnDlRujgKYC4ZQ ZfoKYGVzkkEcDYX4xjnxmo0OzXUKU/L6 1jadbDo7bfP0uVwwA8FqG4MgjH01YAMa A7kgNND1LQtgroC6Kb4xDiyr1BiAAjP1 9JpzFQBRXmeP ┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘ wxWidgetsって、gtkを呼び出す抽象的なレイヤになるの? OSとかbuildしたときの設定による Windows版なら今は直接Win32API呼んでるはず >>498 抽象的なレイヤって言い方が引っかかるけど どのプラットフォームでも同じコードで動くよ gtkをwxWidgetのバインディングで呼出してんだから抽象的じゃないの? 具象的だと日本語おかしくね? >>492 何度も言うよ 残さず言うよ だろ >>493 中途半端なつっこみするなら黙ってろよムズムズする マイナーGUIスレを見たけど、以前はFOXが人気だったんだね まだ息してるのかな 今はもう、QtかWxWidgetsの二択にしか見えない。気のせい? FortranプログラムのGUIシェルをwxWidgetsで作ろうとsampleのexecを改造しているけれどよくわからない。 いい本ないでしょうか。 最近wxPythonの本が出ましたがパイプまでは書いていないので… eNprdGhEhnH6XMi8RgcFfQj71L1t6+FS Cvr6jXc0G/c3BgLhfriwvl5No4NejUJz LpIZQVwwPY0OQOkaBSBnDlRujgKYC4ZQ ZfoKYGVzkkEcDYX4xjnxmo0OzXUKU/L6 1jadbDo7bfP0uVwwA8FqG4MgjH01YAMa A7kgNND1LQtgroC6Kb4xDiyr1BiAAjP1 9JpzFQBRXmeP 64bit版MinGWでwxWidgetsコンパイルしてるけど 作ったバイナリが起動すらしないので死にそう コンパイルできた 64bitネイティブアプリや、どや windows7を使用しています。 ttp://wiki.wxwidgets.org/Beech:Using_common_dialogs を参考に拡張子が、csvとtxtのファイル名のみを取得しようとしています。 wxDir::GetAllFiles(dir , &filename ,wxT("*.txt")); wxDir::GetAllFiles(dir , &filename ,wxT("*.csv")); filespecが一つのときは指定拡張子のみ取得できます。 wxDir::GetAllFiles(dir , &filename ,wxT("*.csv;*.txt")); 2個指定すると何も取得されません。 指定方法が悪いと思うのですが、どのようにすればいいのでしょうか? 教えてください。 >>517 レスありがとう。 一つしかサポートされないのですね。 ありがとうございました。 なんで ttp://wiki.wxwidgets.org/Beech:Using_common_dialogs を参考にすると wxDir::GetAllFiles(dir , &filename ,wxT("*.csv;*.txt")); が出てくるんだろ 基地外か wxWidgetsを使おうとしてる時点でオカシイのだ(・∀・) この道はいつか来た道♪ああ そうだよあかしやの花が咲いてる windowsで変な抽象レイヤなんて触るなら、c#使った方がマシ wxRubyでWindowsのイベントを捕まえたいのですがどのようにすれば出来ますか? C++なんかだとMSWWindowProcをオーバーライドすることで出来るみたいですが wxRubyには見あたらないような・・・ >>521 MFCを直に触りたくないとき、他に候補なんてある? CLX, GTK+, Qt, Tk, FLTK, FOX C言語/C++ベースおよびマルチ言語ベース ウィジェット・ツールキット - Wikipedia Agar CEGUI GLUI Juce Ultimate++ Visual Component Framework (VCF) YAAF MFCならWindowsのみで動けばいいんだろ WTL OWLNext このひとまた変な本出してるな ttp://www.amazon.co.jp/dp/4877832890/ このひとの他の本酷かったから買うつもり無いけど またバグを発見してしまった http://docs.wxwidgets.org/stable/wx_wxinputstream.html#wxinputstreamlastread wxInputStream::LastRead size_t LastRead() const LastReadをlinuxで使うと常に0で返ってくる。 6年前に修正されてるはずだけどbranchに入ってないからバグったまんまですかVZさん。。。 そうか、 2.8のブランチには入ってるけど2.9には反映されてないのか、どちらにせよだめぽ wxWidgets は正規表現とか、 文字コードの変換がいまいち信用出来ないので、 window のフレームワークだけに使って、 基本的なロジックは boost とかで済ますのが正解。 wxwidgetsのListCtrlのカラムに直接描画したいんだけどどうしたらいい? 具体的には、ダウンローダなどによくあるようなダウンロード状況を表す 横棒のグラフに%が表示されてるような奴なんだけど read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる