2001年12月29日

分割

ウィンドウ分割

TabFolderの仕様では同じドライブのフォルダは同時に見れません。
ちょっと見たい時もあるかな?ということでウィンドウを分割してみることにしました。

詳細表示の時は上下分割の方が良いような気がするのですが、ほとんどのファイラーが左右分割なんですよね。なんででしょう?
というわけで横にも縦にも分割できるようにしました。

大分まともなファイラーらしくなってきました。
しかしウィンドウが2つになったことで、どちらがメインかわかりません。
というわけで色分けすることに…さらにタイトルバーにもサブのパスも表示するようにしました。
何かしっくり来ませんが他にもやることが山ほどあるので、とりあえずこのまま行く事にしました。

その後…

分割時の問題はパスの分り難さです。タイトルバーに左がメインで右がサブという表示になっていました。
これではかなり分りにくい場合も出てきます。
左右分割で左がメインならこれでも構いませんが、右がメインになっている場合は…
上下分割だとさらに分り難いはずです。続きを読む
posted by T.M at 00:00| Comment(0) | TrackBack(0) | TabFolder | このブログの読者になる | 更新情報をチェックする

2001年12月22日

監視

フォルダの監視

さて、フォルダの監視です。 なぜ監視するのかというと、ファイル名の変更や属性の変更削除などディレクトリに何か変化があった場合にすぐ更新できるようにしなければなりません。
監視にはFindFirstChangeNotification()とFindNextChangeNotification()(長すぎ(w)というAPIを使用します。
このAPIで監視用のハンドルを取得して、一定時間毎にチェックして変化があったことを検知したら更新すればいいわけです。

いらなくなったらFindCloseChangeNotification()でハンドルを閉じます。(ていうかやっぱり長すぎ(w)

TabFolderの性質上いくつフォルダを開いているか分りません。
ルートのハンドルを取得してサブディレクトリも監視するのが効率的な気もしますがそうでもありません。
変化を検知したら開いている全てのフォルダをチェックしないとならないので、余計な負荷が掛かってしまいます。
結局タブ毎にハンドルを取得することにしました。

さらにチェックするのは表示されているタブのみで、後はアクティブになった時にチェックすることにしました。
(他にも色々条件があるのですがどうでもいいですね(w)

問題発生

とりあえずこれで問題が無いと思われましたが…
FindFirstChangeNotification()でハンドルが取得できない場合が出てきました。
チェック用に同じPCの共有フォルダにネットワーク経由で開いていたのですが、いくつか開いているうちにハンドルが取得できなくなってしまいます。
試しに他のPCの共有フォルダを開いてみたらこちらは最初から駄目…
これはまずいということで、ハンドルが取得できなかった場合でもなんとか自動更新できるようにしました。

自動更新の弊害

仕様?というかどう動作するかというと
ネットワークだった場合はまずルートの監視用のハンドルを取得。 それができたら以後開いたフォルダもそれを使ってチェック。(サブディレクトリも監視するモードで取得しておくので)
駄目だったら仕方が無いので通常より長いインターバルでチェック。
そしてアクティブでない時はタイマーを停止する。これでなんとか我慢することに…

しかしこの仕様の所為でネットワーク関連の管理が共有フォルダ単位になってしまいました。
(その後さらに仕様変更をしてサーバ単位に戻せました。Ver 0.8.1.5)

ちなみにエクスプローラは自動更新していませんでした(w(設定で変わるのかな?)
posted by T.M at 00:00| Comment(0) | TrackBack(0) | TabFolder | このブログの読者になる | 更新情報をチェックする

2001年12月20日

ファイラー

昔のファイラー

エクスプローラに近いものを作ろうとするのがこれほど大変だとは思いませんでした。
とにかくやらなくてはならないことが多い。
実はファイラーはDOS時代に作った事があります。
あくまで勉強用だったのですがそこそこのものが出来ました。(今見たら分りませんが(w) 特に苦労した記憶もありません。
でもそれはシングルタスク&キーボード操作だから楽にできたのです。

Windowsのファイラ

マルチタスク&マウス操作だそう簡単にはいきません。
まず苦労したのは表示と動作速度です。
テキストベースと割り切ってしまえばもっと速くできるのですが、やはりアイコンも表示した方が分りやすいのでリストビューを使用することにしました。
これが高機能でなかなか便利なコントロールなのですが、その反面動作が軽いとは言えません。

最初はリストビューは1枚だけ用意して、タブを切り替えたら一旦データを全部削除して新しいタブのデータを入れるようにしていました。
しかしこれではファイル数の多いフォルダを開くと、目に見えて遅く感じました。

リストビューの内容をメモリにコピーして取ってみたりなどいろいろやってみたのですが、目に見えて速くなるということはありませんでした。
あまりやりたくはなかったのですが最後の手段として、タブが追加されるとリストビューも追加するという力技で捻じ伏せてしまいました。
なんというか似非MDIとでも言うのでしょうか?そんな感じになりました。
速度はかなり向上しましたが、ちょっと納得が行かないところも…まあ本物のMDIよりはメモリを食わないということで…

他にもやる事が…

他には自分以外がファイルを更新したり追加や削除する可能性もあるわけですから、開いているフォルダを常に監視していなければなりません。 さらに他のウィンドウとの連携、マウスのドラッグ&ドロップの処理などやることが山ほどあります。

オンラインソフトでもファイラーにはシェアウェアが多いのがなんとなく納得できました。
posted by T.M at 00:00| Comment(0) | TrackBack(0) | TabFolder | このブログの読者になる | 更新情報をチェックする

2001年12月19日

再描画

ビカビカ

とりあえず基本的なファイルの列挙ができるようになったので、ちょっとチェック。
見た目は普通のフォルダとほぼ同じになりました。しかし重大な欠点が…

それはサイズを変更すると全部再描画するらしく画面がビカビカします。もうちらちらなんてレベルではなく、見れたものではありません。
諸悪の根源はリストビューというのは突き止めたのですが、いろいろやってもこの再描画を止められません。

しかし見た目がほぼ同じなのに、フォルダはサイズを変えてもほとんどちらつきません。
この違いは何なのでしょう??仕方が無いのでSpy++で覗いてみる事にしました。

まだ使い物にならないのでフォルダは普通に開いています。Spy++で適当にCabinetWClassを見つけてプロパティを見てみました。
違いはほとんど無くクラススタイルがCS_BYTEALIGNWINDOWということぐらいでした。あまり期待せずに駄目元でクラススタイルをCS_BYTEALIGNWINDOWにしてみました。

結果は・・・あっさり再描画が止まりました。
なんだか分りませんがとにかく解決しました。動けばいいんです(w
エクスプローラが使っているので、特に問題があるということはないでしょう。
ちょっと調べてみようかとも思いましたが、既に問題なく動くようになったものに構うのも時間の無駄なので先に進む事にしました。
posted by T.M at 00:00| Comment(0) | TrackBack(0) | TabFolder | このブログの読者になる | 更新情報をチェックする

2001年12月18日

機能実装

まずはリストビューにドロップ処理

とりあえず外見はほぼできました。でも肝心の中身が全然できていません。
まずはリストビューのウィンドウにファイルをドロップしてファイルのコピーor移動を出来るようにしました。
これは簡単でした。

タブにドロップで…でも

次はタブにファイルをドロップしてのコピーor移動です。
どのタブにドロップされたかを調べるためには、タブのそれぞれの座標を調べる必要があります。
TabCtrl_GetItemRect()という丁度良いマクロがありました。これはタブの座標をRECT構造体に入れて返してくれるというものです。
この座標とマウスポインタの座標を比べてタブの中にあれば・・・という感じであっさり行くと思いました。
そう…実際に正しい値を返してくれれば何の問題も無いことでした。

しかしそう簡単には行きませんでした。
試しにWM_MOUSEMOVEできちんとマウスポインタの下にあるタブのインデックスが返ってくるかチェックしてみたところ全然駄目です。
何が駄目かと言うと反応が悪い上に、エラーになった時の値が返ってくることのほうが多いのです。
正しい値が返ってくることもあるのですが、ハッキリ言って当てになりません。
原因はTabCtrl_GetItemRect()がエラーを返してくるのですが、これを私にどうしろと…

かなり悩みました。マクロではなくSendMessage()でTCM_GETITEMRECTを送ってみたりもしてみましたが、同じ結果でした。(当たり前なのですが)
頭に来てこんなコードを書いたりもしましたが結局駄目でした。
while(!TabCtrl_GetItemRect(hTabwnd,tabnum,&rect));

なぜか解決

正直仕様の変更も考えました。しかしこれができないと逆に不便なファイラーになってしまいます。
仕方が無いのでとりあえず保留ということで、先に進むことにしました。

それでもタブへのドロップを処理するために、タブコントロールをサブクラス化しました。
暫定的に現在のタブにコピーor移動する(全然意味がないのですが)という仕様で作る事にしました。
まあ、これはリストビューで既にやっているのですぐに終わりました。

そこでふと思いました。「ここでTabCtrl_GetItemRect()呼んだらできたりして?」
やってみました。あっさりできました。エラーになりません。もうバッチリです…

なんで親ウィンドウから呼んだら駄目なんだろう…Windows分らん…
posted by T.M at 00:00| Comment(0) | TrackBack(0) | TabFolder | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。