【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/ ポインタ置いときますね。皆さん先刻ご存知かもしれませんが。
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
ありがとうございます。
中身を読んでも良く判りませんでした。
どういう意味でしょうか? ん?
「〜」301C(E3809C)
はValidじゃないのか? 問題なのはUTF-8として正しいかどうかじゃなくて
cp932に変換出来るかどうかってことなんだよな
そうなるとスレ違いかもな wxWidgetsって、けっこうS-JISの処理が弱いので、そこの部分だけはネイティブの処理にしたほうがいいかも
俺もアプリ作った事あるけど、S-JISに変換する部分だけはWideCharToMultiByte関数を呼ぶようにしたよ >>192
wxUSE_UNICODE_UTF8 を定義してないと使えないよ
つ ttp://docs.wxwidgets.org/trunk/overview_string.html
みなさん色々とありがとうございます。
wxString sjis_data = wxString::FromUTF8(utf8_data.c_str());
のところで例外出して死ぬパターンと sjis_data が空になるパターン
それからちゃんと成功するパターンとがありました。
結局アクセスしていたサイトに広告が入っていて、
時間帯によって内容が変わるようなのですが、
どうも本体は UTF8 なのに広告部分だけ SJIS とか、
お粗末なサイトだったのが混乱した原因の一つでした。 wxWidgetsとWinPcapをあわせて使おうとしてハマってたのが解決したのでカキコ
- winpcapのpcap.hはwxWidgetsのヘッダファイルのあとにincludeする必要がある
- pcap.h内部でwinsock2.hを呼んでいる
- winsock2.hはwindows.hの前にincludeする必要がある
- wxWidgetsのヘッダは、物によっては内部でwindows.hを呼んでいる
というデッドロック
#include <winsock2.h>
#include <wx/msw/winundef.h>
#include <wx/wx.h>
#include <pcap.h>
こんな感じでwinsock2.h呼んだあとにwx/msw/winundef.hを呼んでやれば解決する GUI の配置は XML で定義出来るのが一番良いなあ リストボックスのアイテムとして
ボタンやテキストボックスを表示できる? >>205
wxListBoxそのままでは無理。
テキストボックスだけでいいならwxEditableListBox使った方が早い。
それ以外でちょっとだけコントロールを付け足したいだけなら、
wxListBox継承してるwxCheckListBoxのソースが参考になると思う。
画像管理ソフトみたいなサムネリストが欲しいならwxThumbnailCtrl
って非公式コントロールが楽(古いので2.9系では若干修正が必要)。
ttp://wxwidgets.blogspot.com/2011/02/markup-in-control-labels.html
で紹介されてるマークアップがwxListBoxにも適用されると見た目を
いじるだけならすごく楽になるんだろうけどねぇ。
自作のTestApp(wxWidgets製)は起動時に渡されたパスを読み込んで処理を
するとして、既に起動しているTestAppがあれば、そのTestAppにパスを引き
渡して自分は死ぬ(多重起動しない)、という動作をしたいです。
Winの場合、EnumWindowsでトップレベルウィンドウでTestAppを探し、
WM_COPYDATAをSendMessageで投げMSWWindowProcで受ける、
という方法を採っていますが、この辺のニーズは常にあるだろうし、
もっと楽なやり方があるんじゃないかと思ってます。
こういう方法の方が楽、とかありましたら教えてください。
と >>209
コメントありがとう。
でもMutexだと多重起動のチェックには使えるけど、
「既に起動している別プロセスへ任意のデータを引き渡す」
って処理には使えなく無いですか?
・メモリマップファイル
・共有メモリ
・TCP/IP
・DDE/OLE/ActiveX
・ウィンドウメッセージ
好きなの使えばいいよ。普通は都合のいい方法を使って自分で作る。
wxならメッセージが一番楽だろう。 >>210
元のをポップアップさせてあとのを閉じれば渡す必要なくね? 一番簡単なのが欲しいなら作業ファイルにデータ書き込め。
いっそ多重起動もdir lockでやっとけ。 wxMutex
ttp://docs.wxwidgets.org/2.9.2/classwx_mutex.html wxSingleInstanceChecker
ttp://docs.wxwidgets.org/2.9.2/classwx_single_instance_checker.html なんかいっぱい回答もらえた。ありがとうございます。
誤解を生んで申し訳ないんだけど、多重起動の禁止だけじゃなくて、
データを引き渡すってところまでがやりたいことなんです。
>>211
・メモリマップファイル
・共有メモリ
公式ドキュメントだけ読んで無いと思っていたんですが、
改めて調べたら5年前にパッチとして提出されてました。
「理由は言わないけど却下」と問答無用でRejectされてましたが、
普通に使えました(なんで却下されたんだろう……)
・TCP/IP
ちょっと大掛かりですが、確かにこれだとwxWidgetsのクラスのみで
クロスプラットフォームにいけますね。
・DDE/OLE/ActiveX
MSが意図しているアプリ間通信にはこれを使うべきなんですかね。
クロスプラットフォームからはかけ離れますが。
・ウィンドウメッセージ
はい。最初に書いたとおり、これは把握済です。
ただ、全トップレベルウィンドウを調べるwxWidgetsの関数って
無いですよね?(MS側のAPIはあるけど)
>>213
・起動済アプリを殺して自分が前面に出る
タスクバーに収納されていたり表に出ていたり、というアプリにしているので、
起動済のアプリのそれらの状態を把握するのにちょっと手間がかかりますね。
表示状態のコピーが不要なら確かに比較的手っ取り早いですが。
>>214
・作業ファイルにデータ書き込み&排他制御
大量のデータ通信をアプリ間でやるわけじゃないので、
手っ取り早く汎用性も高くwxWidgetsだけで完結しますね。
しかもクロスプラットフォームで安定している。なるほど。
皆さん色々な案の提示、どうもありがとうございました。 今更なんですが、C++でGUIを考えた場合、wxWidgetsとQTが候補に挙がりましたが
両者の比較を書いているサイトや記事などありましたら教えてください。 いまは VC2010Express でも wxWidgets 使えて便利だわ 2.9.2落としてきてVC2008でビルドしてたけど、これgdgdすぎ
スタティックライブラリはできたけど、DLL版は全然ビルドできないわ、サンプルはデバッグ
ライブラリ用になってるからいちいち直さないといけない&直しても同じリソースがどうたら
でビルドできんし、Qtにいくわ おいらはMinGWでMakefile作りながらGUI作ってるよ〜 (^q^) ああ、早とちりすまん
結局添付されていたVC2008用のプロジェクトファイルがうんこで、VC6用の奴を変換して
ビルドしたらうまくいきましたわ
サンプルも同じでVC6用の奴を変換してビルドすると正常にビルドできました
悪口いってすまん、けどビルドできないVC2008用プロジェクトファイルって罠じゃないのか nmakeしたらいきなりエラーで止まったし、ぐぐるとnmakeよりもVC++上でコンパイルする記事が多かった
ので、そうしてました。
お騒がせして申し訳ないついでに実は開発版の2.9.2をビルドしようとしてたみたいで、俺死にたい...
というより氏ね>俺 VC使わないといけない理由があるんなら仕方ないけど
gccの方がすんなり行くんじゃないかなぁ。 WinでgccというとMinGだよね?
たまたまVC入ってたからVCでやってたけど、MinGの方が捗るの? wxWidgetsの開発はLinuxのgccで行われてるだろうからMinGW+gccだと環境づくりが楽かも?
VCのことは知らないけどMinGWだと普通に2.9.2コンパイルできたし
コーディングの効率を考えるとVCのオートコンプリート機能が使えたら楽かもしれんが、たぶん出来んだろうしな
winでわざわざMinGなんて使う必要ないよ。
VCでいい。 MinGWだとEXEサイズ小さくなるかなと試してみたが、makeしてもlibができないなぁと1時間も
悩んでた、.aで正しいのにwww
アホすぎる俺
しかしwxWidgetsいいね、コントロールは揃ってるし、ドッキングもできる、開発版にすればリボンもどきも
使えるし、wxFormBuilder使えばGUIで画面組み立てられるし、とりあえず満足できる環境だし MinGWでビルドした奴とVC++2008でビルドした奴を比較してみたけど、
VC++2008でビルドしたサンプルauidemo.exeは6073KB、MinGWでは9761KB、stripかけて6645KBだった
どちらもデバッグなしのリリース版なんだけど、MinGWの方がでかくなるのね
Dumpbinで依存DLL調べてみたら、VC++2008の方は標準DLLのみでVCランタイム依存もなし
かたやMinGWはやり方が悪いのだろうけどlibgcc_s_dw2-1.dll、libstdc++-6.dllに依存してた
VC++2008の方が優秀な気がする >>232
MSYS上から、
g++ -static -o test.exe test.cpp `wx-config --cxxflags` `wx-config --libs`
こうかな?
-staticオプションつければOKのはず。
以下、wxをビルドしたときの設定。MinGW-w64でもいけました。
./configure --with-opengl --enable-ipv6 --disable-shared --disable-monolithic --enable-unicode --enable-official_build --disable-threads --prefix=/mingw
ちなみにgccは-sオプションをつけると結構ファイルサイズは小さくなる >>233-234
アホな俺にわざわざありがとう!
もう1回試してみます! >>230
なるほど人によるなあ。
俺なら「わざわざVC使わんでも、MinGでいい」って発想になるわ。 >>233
ライブラリも作成し直し、サンプルもビルドし直しましたがサイズは6621KBでした
あとDLL依存はとれないのですね >>237
同意。
UNIX文化的には、gccが「標準」でVCは「非標準」って認識だからなぁ。
自分で何か書く時とか、「自分はgccしか使わないけど、Win使いのためにVCもサポートしてやるか」ってレベル。 結局どっちの文化に属してるかによって
何がデフォで何がわざわざなのかが違うってことで。
で、wxそのものがUNIX文化なんだよな。 >> 238
サンプルはそのままビルドするとDLL依存になるとおもう。
cd samples
make "LDFLAGS = -static"
こんな感じでいかかでしょ。
>>241
いや、自分でmakeファイルに-static直書きしたけど駄目でした
まぁ、なんか勘違いしてるか頭がアホなんて理解できてないだけでしょう
とりあえずVCでも問題ないのでVCでやります、いろいろありがとうございました >>242
がんがれ。
ただ、オープンソース系のライブラリを今後使っていくんなら
いずれにしてもgcc系の流儀とかも覚えておいた方がいいと思うよ。 call vcvarsall
pushd build\msw
nmake -f makefile.vc BUILD=debug UNICODE=1 USE_GDIPLUS=1 SHARED=1 RUNTIME_LIBS=dynamic
popd
こんな感じでいいんじゃね
あと2.9.2はstableじゃないけどいいの? 質問お願いします。
http://www.dotup.org/uploda/www.dotup.org2004935.jpg
こういうよくある(名前、種類、ディレクトリ、サイズ)みたいなのを
表示したいんですがヴィジェットは何を使ったらいいでしょうか?
できれば画像のように名前のところの矢印みたいなのを付けたいのと
項目の順番をD&Dで入れ替えたり表示、非表示をポップアップメニューで行いたいです。
項目にはDBのカラムを割り当てたいと思っています。 すいません、listctrlで出来そうですね。
なんでいつも質問した後は簡単に見つかるんだろう… wxWidgetsのライセンスって何なの(L-GPL)?
これ使って書いたプログラムってソースコード開示する必要あるの?
教えてエロい人!! まあその質問はググッたらでてきそうだしな…
ところで組み込み用のwxWidgetsとかないんだろうか。 >>249
試しにググッたら意外と出てこなかったので教えてやるでおじゃる
http://web.archive.org/web/20080919161353/http://www.geocities.co.jp/SiliconValley-Cupertino/8526/wxWindows/license.html
http://ms2.seesaa.net/article/3184354.html これですね
http://www.wxwidgets.org/about/newlicen.htm
"wxWindows Licence"で配布されていて、
ソースコード開示の必要はないというのが一応の答えかな
需要があるかどうか不明ですが。
wxWidgetsマニュアルにある Syntax of the builtin regular expression library の邦訳です。
拙作ソフト説明書の一部になっていますが、この頁の訳文に関してはご利用自由です。ただし独自訳多数。
http://h12u.com/hmo2/manual/%E8%A8%AD%E5%AE%9A%E7%AA%93%E5%8F%A3/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E6%96%87%E6%B3%95.html
>>258
乙です
てかwxWidgetsにも正規表現ライブラリあったんだな >>258
正格表現って初めて見たが、正則表現ではなくて?
POSIXブラケットのうち、[. .] [= =] [:<:] [:>:]とかって他のライブラリじゃほとんど見ないな。
[[=A=]]ってAやÄなどにマッチするんだっけ? >>260
ご指摘Thx. 直しておきました。どこで間違ったんだろう。
> [[=A=]]ってAやÄなどにマッチするんだっけ?
建前としてはそうなるはずだけど誰も実装してないとか何とか。よく知らないですが。
調べてみたら [. .] と [= =] の訳文はかなりおかしい気がしてきた。
実は訳間違ってました[[=A=]]
ってかくと顔文字っぽい。 258です。訳文とかちょっと修正しました。ページ内部のリンクも増やした。
>>263
実は私もよく知らない。 http://ja.wikipedia.org/wiki/POSIX
POSIX(ポジックス パーズィックス、Portable Operating System Interface)とは、
異なる実装のUNIX OSを始めとする各種OSに共通のAPIを定め、移植性の高い
アプリケーションソフトウェアの開発を容易にすることを目的としてIEEEが策定した
アプリケーションインタフェイス規格である。 motifもIEEEが規格決めてたから、こっち使いましょうよ >>263
ザックリとでよければ「UNIX互換」くらいに考えておけば良い。
CodeBlocks10.05とwxWigets2.8を使用しています。
勉強中です。
http://wiki.codeblocks.org/index.php?title=WxSmith_tutorialsの1-7までは実行してみました。
そんなレベルなのですが、ディレクトリ内のファイル名を一覧でcsvにだせるところまでを目標に
しています。
void filenameFrame::OnButton1Click(wxCommandEvent& event)
{
wxString CurrentDocPath;
wxString Filename;
wxArrayString Filenames;
wxString GetDirectory;
wxFileDialog* OpenDialog = new wxFileDialog(
this,wxEmptyString,wxEmptyString,wxEmptyString,wxEmptyString,wxFD_MULTIPLE,wxDefaultPosition);
if (OpenDialog->ShowModal() == wxID_OK)
{
CurrentDocPath = OpenDialog->GetPath();
Filename << OpenDialog->GetFilename();
GetDirectory << OpenDialog->GetDirectory();
Filenames << OpenDialog->GetFilenames[0];
TextCtrl1->SetLabel(CurrentDocPath);
TextCtrl2->SetLabel(Filename);
TextCtrl3->SetLabel(GetDirectory);
TextCtrl4->SetLabel(Filenames);
}
OpenDialog->Destroy();}