Re: MFCのスクリーンセーバー


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by Uz on 2000/11/13 12:26:45

In Reply to: MFCのスクリーンセーバー Posted by 中瀬 on 2000/11/13 10:33:23


    > はじめまして、中瀬と申します。
    はじめまして。

    > Windows2000, VC++6.0で、MFCのサンプルのスクリーンセーバーを
    > もとにして、スクリーンセーバーを作っています。
    > [画面のプロパティ] - [スクリーン セーバー]の
    > プレビュー・ウィンドウには表示されますが、
    > [設定]ボタンをクリックしても、ダイアログが表示されません。
    > ただし、[コマンド プロンプト]でスクリーンセーバーを
    > 実行すると、ダイアログが表示されます。
    > もともとのMFCのサンプルのスクリーンセーバーでも
    > 同じ現象が生じます。
    > どうしたらよいのでしょう。
    > よろしくお願いします。

    まず、スクリーンセーバーの基礎知識から。
    スクリーンセーバーはコマンドライン引数によって
    スクリーンセーバーを起動するのか、設定ダイアログを出すのか
    を切り替えます。

    参考

    http://support.microsoft.com/support/kb/articles/Q182/3/83.ASP


    で、これをふまえて、調査してみると、
    設定ボタンを押したとき、__argv[1]を見てみると、
    ”/c:[数値]”が入っている。
    で、サンプルの引数をチェックしているところを見てみると、
    MatchOption関数で

    if (lstrcmpi(lpsz, lpszOption) == 0)
    return TRUE;

    としている。
    引数が「/c」だけだったら、問題ないのだが、
    「/c:[数値]」のように、なっているとMatchOptionはTRUEを
    返さないので、問題が生じる。

    よってこの関数を修正すれば直ります。

    簡単な修正は

    //if (lstrcmpi(lpsz, lpszOption) == 0)
    // return TRUE;
    if (lpsz[0] == lpszOption[0])
    return TRUE;

    とすれば、一応正常に動作する。

    上で紹介したサイトには「/c:[数値]」に関する説明が無い
    ことから、新しい仕様で昔からあるサンプルでは対応出来なかった
    のかも知れませんね。


記事スレッド一覧