VC6.0++ SDK c言語使用
スクリーンセーバーを表示するときに、クライアント領域(=画面全体)を8×8の子
リンドウに分割し、それぞれにランダムな図形を表示させるプログラムを作っていま
す。
通常、スクリーンセーバーというものは、一定時間が経つと開始され、ユーザーがマウ
ス或いはキーボードからのなんらかんお働きかけを行うと終了される(=消える)とい
う動作をするんだと思います。
単純にクライアント領域に描画を行うスクリーンセーバープログラムでは、何の問題も
なく、上のような想定どうりの動作を得られます。
ただ子ウィンドウに分割すると、キーボードメッセージには反応して終了してくれるの
ですが、マウスメッセージには全然反応してくれません。
子ウィンドウのウィンドウプロシージャに、WM_NCHITTESTが送られてきた場合、それを
そのまま親ウィンドウにSendMessageで送る、という方法をとると、スクリーンセーバー
起動とほぼ同時に終了してしまいます。
結局、子ウィンドウへのWM_LBUTTONDOWNとWM_RBUTTONDOWNで親ウィンドウ(=スクリーン
セーバープログラム)を終了させていますが、いまいちおかしいという気がしています。
何かいい方法はないでしょうか?
同様の問題で困ったことがないのですが、
もしかして、全部自前でやろうとしてませんか?
終了時の処理なんかは、dllが勝手にやってくれたような
覚えがありますが。
下記リンク先に書いてあるような方法で試してみてください。
(リンクエラーを解消するのに一癖あったような気がする。
分からなければ、また聞いてください。)
http://www.kumei.ne.jp/c_lang/index.html
http://www.kumei.ne.jp/c_lang/sdk2/sdk_127.htm
http://www.kumei.ne.jp/c_lang/sdk2/sdk_128.htm
http://www.kumei.ne.jp/c_lang/sdk2/sdk_129.htm
↑こんなのは当然知っているよ、という場合は、
子ウィンドウの分割のあたりの説明が必要なのかも。
たいちうさんの指摘のサイトは、作者の本も持ってますが、見直してみて、
DefWindowProcのかわりにDefScreenSaverProcを使わなきゃいけなかったと分かりまし
た。
ありがとうございました。
メインウィンドウプロシージャっていうのかな?ScreenSaverProcのほうでは、
DefScreenSaverProcをきちんと使っていたんですが、子ウィンドウプロシージャの方で
は単純にDefWindowProcとしていたところがおかしかったようです。
ここをDefScreenSaverProcとしたら、マウスの移動でも終了させることができるように
なりました。
ただ親ウィンドウさえ終了してしまえば、子ウィンドウは自動的に終了させるという認
識でおったのですが、この当たりが良く分からないところです。
とりあえず解決マーク入れておきます。お世話かけました。