GUIの編集はwxGladeで行うと簡単です。
国際対応は、xgettext -k_ xxx.cpp -o ja.po でテンプレートを作成し、
これを編集して.poファイルを完成させる。
これをmsgfmt -c -o ja/xxx.mo ja.poでコンパイルし.moを作る。
これをロケールデータフォルダーにおく。
wxRegEx re( wxT( "\.cpp" ) );
if ( re.Matches(wsName) ) {...}
re.ReplaceAll( wxT( ".cxx" ) );
wxAppのメンバーにint argc,char ** argvがある。wxAppsを継承したアプリケーションクラスのOnInit()メソッド中でこれを参照し、CustomFrameのメソッドに通知するなど。
wxConfigを使う。
#include <wx/config.h>
void read(){
wxConfig *config = new wxConfig(wxT("foo"));
wxString ws;
config->Read(wxT("bar"), &ws);
delete config;
}
GUI操作はメインスレッドを通して行う(スレッドセーフでない部分がある)。ワーカースレッドからのGUI更新には、イベント通信を用いる。カスタムイベントを定義するのが王道であるが、適当にIDを定義して、既存イベントを流用するのが手軽。下記の例では、Text control(TEXT_HTTP_EVENT)のイベント(TEXT_ENTER)を利用。
class MyCFrame:public MyFrame{
...
static void cb(void *obj, void *frame); // call back function called by a worker thread.
}
// MyCFrame.cpp
void MyCFrame::cb(void *obj,void *frame){
wxCommandEvent event( wxEVT_COMMAND_TEXT_ENTER, TEXT_HTTP_EVENT );
((MyCFrame *)frame)->GetEventHandler()->AddPendingEvent( event );
}
// MyFrame.cpp
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
...
EVT_TEXT_ENTER(TEXT_HTTP_EVENT, MyFrame::OnHttpUpdate)
...
END_EVENT_TABLE();
void MyFrame::OnHttpUpdate(wxCommandEvent &event)
{
event.Skip();
}
// MyCFrame.cpp
void MyFrame::OnHttpUpdate(wxCommandEvent &event)
{
....
}
参考)http://wiki.wxwidgets.org/Inter-Thread_and_Inter-Process_communication
wxGladeでスケルトンを作成している場合、上記イベントに対するテーブル登録などもwxGladeで処理したい。
そこで、非表示にしたwxTextControlを登録し、そのイベントを流用するのが簡便。前項の例では、wxTextControlをGUIに配置し、非表示、無効化した上で、IDとしてTEXT_HTTP_EVENTを登録し、TEXT_ENTERイベントに対するEVENTハンドラーとしてOnHttpUpdateを登録した。
http://wiki.wxwidgets.org/WxListCtrl
・CustomFrame.hに[#include "wx/dnd.h"] を追加
・wxDropTargetを継承しDropを受け取るクラスを定義
お手軽には、基底クラスとしてwxTextDropTarget, wxFileDropTargetを用い、OnDropText()もしくはOnDropFiles()を実装する。
本格的には、wxDropTargetを直接継承し、OnDragOver()、OnData()を実装する
// 受け取る
#include "wx/dnd.h"
//wxTextCtrl *text_ctl_1がDropを受け取る場合
class DnDFile : public wxFileDropTarget{
public:
DnDFile(wxTextCtrl *pOwner = NULL) ;
virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames);
private:
wxTextCtrl *m_pOwner;
};
// ctor : dropを受け取るコントロールを引数とする。
DnDFile::DnDFile(wxTextCtrl *pOwner = NULL) { m_pOwner = pOwner; }
// Dropを受け取ったときの動作を記述
bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames)
{
size_t nFiles = filenames.GetCount();
if (m_pOwner != NULL)
{
for ( size_t n = 0; n < nFiles; n++ )
m_pOwner->AppendText(filenames[n]);
}
return true;
}
// ctor of the Frame Dropを受け取るコントロールを引数としてDnDFileを作成し、これをドロップターゲットとして登録する
CustomFrame::CustomFrame(...):MyFrame(...){
text_ctrl_1->SetDropTarget(new DnDFile(text_ctrl_1));
}
BUG)wxWidget のバグ static box sizerの子要素はDropを受け取れない!
http://wxwindowsjp.sourceforge.jp/doc_jp/current/html/node712.html#wxdndoverview
Drag
wxFileDataObjectは、Dragoutに対応せず。
Warning: Under all non-Windows platforms this class is currently "input-only", i.e. you can receive the files from another application, but copying (or dragging) file(s) from a wxWidgets application is not currently supported. PS: GTK2 should work as well.