一定時間後に切り替わる砂時計を実現したい


ひる  2011-11-29 10:35:08  No: 73016  IP: [192.*.*.*]

MFCで、専用データをカーソルキーやホイールなどで次々と切り替えて表示する、
簡易ビューアのダイアログを作成しています。

大抵のデータは小さいものを想定しているのですが、
中には大きなものもあり、切り替えに1秒前後待たされる可能性もあるため、
読み込み開始時にCWaitCursorで砂時計を入れるようにしました。

すると、一瞬で処理が終わる小さいデータでも毎回必ず砂時計が表示され、
ホイールで次々と切り替える動作などを行った際に
マウスカーソルがチカチカ切り替わって鬱陶しいと言われてしまいました。

関数内の読み込み処理が1秒続いたら初めて砂時計に切り替わるとか、
そういう動きができないかを模索しているのですが、
実現されているかたはいらっしゃいませんでしょうか。

編集 削除
仲澤@失業者  2011-11-29 12:50:20  No: 73017  IP: [192.*.*.*]

まず、その「データ」のサイズがあらかじめわかっていれば、その大小で
分岐すればよいことですよね(^^)。

次に、CWaitCursorはオブジェクトになっちゃってるので、
かえって使いやすさを悪化させてますね。こんなもん捨てて
SDKの::SetCursor( ::LoadCursor( IDC_WAIT))を使いましょう、
これなら任意の場所で発行できるので気が楽です。
これは、読み込みルーチンからでも発行でき、元に戻したければ
例えばDLG側の再表示の位置で、固定的に
::SetCursor( ::LoadCursor( IDC_ARROW));//元に戻す
とできるわけです。

最後に、読み込みを開始する前にサイズがわかっていない場合は、
特定のByte数まで読み込んで、まだ終了しそうもなかったら
カーソルを砂時計に変更するという方法と、
読み込み開始前にワンショットタイマーをかけて、タイムアウト後に
当該ファイルの読み込みが完了してなければ砂時計にする
という方法も考えられますね。

編集 削除