filer

ファイル一覧を取ってくる

wxDir からファイル名をひっぱり、 wxFileName で詳細を得ることが出来る。これはしっかりしているのでこれだけわかってればいまのところなんとかなる。

画面表示に関しては、unicode build で問題なく日本語もよめたので問題なしとしたが、printf で整形して出してみるとずれることが判明。もとから長いファイル名は途中でうちきって並べるのが方針なので wxString::Len() であからじめ取っておくのが基本だと思ってたら半角,全角ともに1文字で返すので画面表示がだめだった。

しかたないので wxString を継承して Len() を override して半角は1, 全角は2として計算して算出しようとおもったら、うまく動かないので諦める。(あとから override するには元の class 定義で virtual 修飾が必要なことを思い出す, virtual 定義はライブラリ再構築とか virtual 自体のコストとかリスク大)

別の案として、メイン画面にいきなり書くのではなく別の画面に文字列をかいて、別画面からメイン画面へ指定の大きさで切って貼り付けることにすれば、文字列長は無視できると判断。この方法だと途中で打ち切っていないかわかんなかったりする。

壁紙を付ける

画像ファイルを選ぶとビュアーが出てきて画像を表示してくれるんだが、ビュアーを出して空き領域を占用するのは好みではない。そこで壁紙としてプレビューできるといいなと思った。エロ画像フォルダを選んだだけで先頭のファイルをプレビューしてくれたら便利だし。

壁紙の実装なんだが、現状はこんな感じになってしまっている。メイン画面に文字列を書くと文字以外は透過されるので問題ないのだが、切って貼り付けるときに透過できてない。

ドキュメントを見た感じ、透過しつつ貼り付け (Blit) ができるらしいのだが Mask が必要でなんたら... というところでグラフィックを扱うクラスが4つほどあって、うまく切り分けができてない。

  • wxStaticBitmap: Frame 内の表示用パーツだと思う
  • wxBitmap: wxMemoryDC に渡すことができるクラス。SetMaskColour ができる。
  • wxImage: wxBitmap に似ているが、resize, scale, rotate など加工ができる。明度の処理はできないみたい。

これらのクラスは継承関係はない(が同じ名前と目的のメソッドが多い)ので、変換して渡す必要がある。sample で使ってるみたいだがよく理解できず、ここで時間を食ってしまったので後回し。

ウィンドウのサイズを決める

frame の size を設定すると外枠の設定はできるが、メイン画面は枠の太さやツールバーとかスクロールバーとかステータスバーなどでそれよりも小さくなる。つまりメイン画面に 640x480 の広さが欲しくて frame の大きさを 640x480 にすると一回り小さくなる。

気づいてたけど、いままで致命的にならなかったので適当に大きめにしてた。これはメイン画面として機能する sizer の大きさを基準に計算し直せば良いことに気づいた。

void myframe::resize(int width, int height)
{
	wxSize outside = this->GetSize();
	wxSize inside = this->GetSizer()->GetSize();
	wxSize diff =  outside - inside;
	outside.SetWidth(width);
	outside.SetHeight(height);
	outside += diff;
	this->SetSize(outside);
}

これで安泰。ついでにウィンドウの場所を設定ファイルから読み書きするように前に作ったツールのソースを使い回しておいた。

next

キー操作関連とかカーソル描写関連をやっておく。