Dalog Box で速度を設定



スクリーンセーバーの設定ボタンをクリックすると表示される Dialog Box から描画速度を設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 空の新規プロジェクトを作成して下さい。
  2. プロジェクトのフォルダーに、次のファイルを格納して下さい。
    ファイル 説明
    Saver03.cpp Screen Saver のプログラム
  3. 次の画像を参考にして [リソースの追加][Dialog] で DialogBox を作成します。
    DialogBox のIDは scrnsave.h の中で決められています。

    BOX ID
    DialogBox DLG_SCRNSAVECONFIGURE
    EditBox IDC_EDIT1
    Button IDOK
    Button IDCANCEL
  4. [プロジェクト][既存項目の追加] から次のファイルをプロジェクトに追加します。
    ファイル
    Saver03.cpp
    Script1.rc
    resource.h
  5. resource.h を表示して次の修正を行って下さい。
    ScreenSaver Dialog のIDは scrnsave.h の中で DLG_SCRNSAVECONFIGURE 2003 と決められているのですが [リソースの追加] で作成するとIDに別の値が割り当てられます。
    この行をコメントにして scrnsave.h をインクルードします。
        #include    <scrnsave.h>
        //#define DLG_SCRNSAVECONFIGURE           101
        
  6. ScreenSaver の専用ライブラリを使用するのですが #pragma でリンクしているので特に操作は不要です。
    #pragma comment(lib,"scrnsave.lib")
  7. プログラムをコンパイルして *.exe を作成します。
    Debug モードでコンパイルするとサイズが大きくなるので Release モードでコンパイルして下さい。
  8. *.exe を *.scr にリネームします。
    *.scr をダブルクリックすると ScreenSaver のテストモードで少しだけ実行されます。
  9. スクリーンセーバーの設定です。
    *.scr を Windows\system32 のフォルダーにコピーします。
    このフォルダーに格納するとスクリーンセーバーとして選択できるようになります。
  10. モニタ画面を右クリックして、プロパティからスクリーンセーバーを設定します。
    設定ボタンをクリックすると DialogBox が表示されて、ここから描画速度の設定ができます。
    DialogBox が表示されないときは、もう一度よく見直して下さい。

プログラムの説明

  1. resource.h の修正した行の前後を表示します。
    scrnsave.h を取り込んで、DLG_SCRNSAVECONFIGURE の定義をコメントにして下さい。
        // Used by Script1.rc
        //
        #include    <scrnsave.h>
        //#define DLG_SCRNSAVECONFIGURE           101
        #define IDC_EDIT1                       1000
    
        // Next default values for new objects
        
  2. ScreenSaver のヘッダーをインクルードして、専用のライブラリをリンクして下さい。
    scrnsave.h は resource.h の中でインクルードされています。
    nSpeed は SetTimer にセットする描画速度の値です。
        #include    <windows.h>
        #include    "resource.h"
        #pragma     once
        #pragma     comment(lib,"scrnsave.lib")
        #define     ID_TIMER 32767
    
        int         nSpeed= 500;      //SetTimerにセットする値
        
  3. ScreenSaverConfigureDialog() 関数で DialogBox の処理を行います。
    見かけは今までの DialogBox と同じなので、特に説明の必要はないでしょう。
    だた一つ注意することは、ここで nSpeed に値を設定しても ScreenSaverProc() からは参照できないことです。
    そこで DialogBox から設定された値を Profile に書き込んで、Profile を通じて値を引き継ぎます。
        BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        {   char    Temp[32];
    
            switch(msg)
            {   case WM_INITDIALOG:
                    SetDlgItemText(hDlg,IDC_EDIT1,"500");
                    return TRUE;
                case WM_COMMAND:
                    switch (LOWORD(wParam))
                    {   case IDOK:
                            GetDlgItemText(hDlg,IDC_EDIT1,Temp,sizeof(Temp));
                            WritePrivateProfileString("Saver03","SPEED",Temp,"TEST.INI");
                            EndDialog(hDlg,IDOK);
                            return TRUE;
                        case IDCANCEL:
                            EndDialog(hDlg,IDCANCEL);
                            return TRUE;
                    }
                    return FALSE;
            }
            return FALSE;
        }
        
  4. ScreenSaver の MainProgram に相当するコールバック関数です。
    WM_CREATE: で ScreenSaverConfigureDialog() 関数で書き込まれた Profile から nSpeed に値を設定します。
    後は前回と同じです。
        switch(msg)
        {   case WM_CREATE:
                nSpeed= GetPrivateProfileInt("Saver03","SPEED",500,"TEST.INI");
                GetClientRect(hWnd, &rc);
                wx = rc.right - rc.left;
                wy = rc.bottom - rc.top;
                SetTimer(hWnd,ID_TIMER,nSpeed,NULL);
                break;
        

超初心者のプログラム入門(Win32API C++)