[win] "NUL" という名前のファイルを削除する

ocra を使った際に、カレントディレクトリに NUL という名前のファイルが生成されてしまった。
このファイル名、winではリザーブされているため、削除することもリネームすることも出来ない。

こんなときは、

DEL \\.\C:\path\to\NUL

としてやればよい。

[wxWidgets] wxWidgets覚え書き

※wxWindow という名前だったと記憶していたが、いつの間にか wxWidgetsに改名したらしい。
 何でも、M$からの圧力だとか…… ヒソヒソ( ´д)ヤダァ(д` )ネェ、キイタ?( ´д)オクサン(д` )アラヤダワァ

wxAuiManager使用時に、Windowをドラッグさせると "Timer creation failed"エラーが発生する

idを指定しない状態で wxTimer をインスタンス化すると発生するようだ。
new wxTimer(pParent, ID_TIMER) ときちんとidを設定する。

Windowが MOUSEWHEEL イベントをキャッチしてくれない

同クラスで、EVT_LEFT_DOWN(マウス左クリックイベント)をキャッチしている場合は、
OnLeftDownイベン内で this->SetFocus() していないのが原因。
フォーカスが当たらないので、イベントが違う Windowに飛ばされている。
※this->SetFocus() の代わりに、event.Skip() を記述しても良い

Win環境でリンク時に"GetClassInfoW"シンボルが無いエラーが出る

リンク時に下記のようなエラーが出るときは、wxのヘッダをインクルードする前に、"wx/msw/winundef.h " をインクルードする
> error LNK2001: unresolved external symbol "public: virtual class wxClassInfo * __thiscall wxObject::GetClassInfoW(void)const " (?GetClassInfoW@wxObject@@UBEPAVwxClassInfo@@XZ)

ソース: #2421 (wxGridTableBase::GetClassInfoA, Windows, linker error) – wxWidgets

wxImage#LoadFile で失敗する

wxInitAllImageHandlers() を発行しているかチェック。

ImageHandlersの初期化を行わないと、画像ファイルの読み込みで失敗してしまう。

Windowを作成する際に、ユニークなIDを取得したい

wxNewId() を使用する。
宣言されているファイルは、wx/utils.h

wxAuiManager はデフォルトで登録された wxWindowインスタンスを Close 時に破棄しない。

破棄したい場合は、AddPane時に明示的に wxAuiPaneInfo().DestroyOnClose(true) を指定する。
※デフォルト動作は逆の方が良いんじゃないか??……

wxAuiManagerに管理されている Window で Closeイベントをキャッチする方法

Closeイベントを持っているwxFrameインスタンスを wxAuiManager#AddPaneに 渡すと、表示の挙動がおかしくなるため、
wxAuiManagerの管理下にあるWindowは、自身ではClose イベントはキャッチ出来ない。
そこで、Closeイベントをキャッチする為には、wxAuiManagerの wxEVT_AUI_PANE_CLOSE イベントを連結してやれば良い。


auiManager_ の Closeイベントを MyPane に連結する
2010/4/28修正。 Connectは非推奨で、Bindの使用を推奨しているらしい

auiManager_.Bind(wxEVT_AUI_PANE_CLOSE, &MyPane::OnClose, pMyPane);

※下記は以前のConnectを使用したバージョン(非推奨)

auiManager_.Connect(wxEVENT_AUI_PANE_CLOSE, wxAuiManagerEventHandler(MyPane::OnClose), 0, pMyPane);

マニュアルには明記していないが、Bindの宣言は下記のようになっている

void Bind(const EventTag &eventType,
              void (Class::*method)(EventArg &),
              EventHandler *handler,
              int winid = wxID_ANY,
              int lastId = wxID_ANY,
              wxObject *userData = NULL)


MyPane側には以下を追加

....
void MyPane::OnClose(wxAuiManagerEvent& event) {
    // do anything...
}

BEGIN_EVENT_TABLE(MyPane, wxPanel)
  EVT_AUI_PANE_CLOSE(MyPane::OnClose)
END_EVENT_TABLE()


wxAuiManagerに複数の MyPane が登録されている時
上記の方法でイベントを登録とすると、wxAuiMakagerに登録されている全てのインスタンスに対して OnClose がコールされてしまう。
選択的に OnClose を行うには、下記の方法をとると良い(と思われる)

1. wxAuiManager に登録するときに、登録するインスタンスアドレスを wxAuiPaneInfo#Window で指定する

auiManager_.AddPane(pMyPane, wxAuiPaneInfo().Window(pMyPane));
auiManager_.Bind(wxEVT_AUI_PANE_CLOSE, &MyPane::OnClose, pMyPane);

2.イベントを受ける側(MyPane)はwxAuiManagerEvent::windowの値を手がかりにする

void MyPane::OnClose(wxAuiManagerEvent& event)
{
    if (this == event.GetPane()->window) {
        // do something...
        return;
    }
    event.Skip();    
}

[Ubuntu] Ubuntu の locate は mlocate

Ubuntu に初期インストールされている mlocate では、find のオプションが渡せないので、find-utils版の locateを導入。

詳しくは、http://d.hatena.ne.jp/kitokitoki/20091025/p2


■参考
GNU locate を有効活用する — ありえるえりあ

[ATOK] ATOKの推測候補モードのキーバインドをEmacs風に

ATOKの「推測候補」というのは、携帯等の予測変換の様なモード。
結構便利なんだけれども、難点が一つある。
何故か、候補を選ぶキー(通常カーソルの上/下キー若しくは、Tab/S-Tab)のキーバインドが変更出来ないのだ。


しかし、Tab/S-Tab で候補選択が出来るという仕様を上手く利用すれば、副作用はある物のC-n/C-pを選択キーに変更することが出来る。
つまり、「入力中」の C-n を Tab の機能に、C-p を S-Tab の機能に割り当ててしまえば良いという事なので、
Ctrl+N の「入力中」を「省入力変換」に、Ctrl+P の「入力中」を「ツールチップ候補選択前移動」に設定すれば良い。


副作用で C-n での確定動作が行えなくなってしまうが、C-m で決定すれば良いのでそれほど困ることはない。