String Table(idsIniFile, idsAppName)を使用する

Saver のプロパティ設定画面

scrnsave.h の中で定義されている idsIniFile と idsAppName を String Table で定義します。
設定ボタンをクリックして「表示する文字列と描画速度」を設定します。

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

プロジェクトの設定

  1. 空の新規プロジェクトを作成して下さい。
  2. プロジェクトのフォルダーに、次のファイルを格納して下さい。
    ファイル 説明
    Saver04.cpp Screen Saver のプログラム
  3. ページ先頭の画像を参考にして [リソースの追加][Dialog] で DialogBox を作成します。
    DialogBox のIDは scrnsave.h の中で決められています。
    BOX ID
    DialogBox DLG_SCRNSAVECONFIGURE
    EditBox IDC_EDIT1
    EditBox IDC_EDIT2
    Button IDOK
    Button IDCANCEL
  4. String Table を定義します。
    idsIniFile は profile の名前で、idsAppName はスクリーンセーバーの名前です。
    IDは scrnsave.h の中で定義されているので重複しないようにして下さい。
        /////////////////////////////////////////////////////////////////////////////
        //
        // String Table
        //
    
        STRINGTABLE PRELOAD DISCARDABLE 
        BEGIN
            idsIniFile              "saver04.ini"
            idsAppName              "Screen Saver.saver04"
        END
        
  5. [プロジェクト][既存項目の追加] から次のファイルをプロジェクトに追加します。
    ファイル
    Saver04.cpp
    Script1.rc
    resource.h
  6. resource.h を表示して次の修正を行って下さい。
    ScreenSaver Dialog のIDは scrnsave.h の中で DLG_SCRNSAVECONFIGURE 2003 と決められているのですが [リソースの追加] で作成するとIDに別の値が割り当てられます。
    この行をコメントにして scrnsave.h をインクルードします。
    idsIniFile や idsAppName が定義されているときは、その行もコメントにして下さい。
        #include    <scrnsave.h>
        //#define DLG_SCRNSAVECONFIGURE           101
        
  7. ScreenSaver の専用ライブラリを使用するのですが #pragma でリンクしているので特に操作は不要です。
    #pragma comment(lib,"scrnsave.lib")
  8. プログラムをコンパイルして *.exe を作成します。
    Debug モードでコンパイルするとサイズが大きくなるので Release モードでコンパイルして下さい。
  9. *.exe を *.scr にリネームします。
    *.scr をダブルクリックすると ScreenSaver のテストモードで少しだけ実行されます。
  10. スクリーンセーバーの設定です。
    *.scr を Windows\system32 のフォルダーにコピーします。
    このフォルダーに格納するとスクリーンセーバーとして選択できるようになります。
  11. モニタ画面を右クリックして、プロパティからスクリーンセーバーを設定します。
    設定ボタンをクリックすると DialogBox が表示されて(先頭画面を参照)、文字列と速度の設定ができます。
    DialogBox が表示されないときは、もう一度よく見直して下さい。

プログラムの説明

  1. ScreenSaver のヘッダーをインクルードして、専用のライブラリをリンクして下さい。
    scrnsave.h は resource.h の中でインクルードされています。
    nSpeed は SetTimer にセットする描画速度の値です。
    szText[40] はスクリーンセーバーで表示する文字列です。
        #include    <windows.h>
        #include    "resource.h"
        #pragma     once
        #pragma     comment(lib,"scrnsave.lib")
        #define     ID_TIMER 32767
    
        int         nSpeed= 500;      //SetTimerにセットする値
        char        szText[40];       //スクリーンセーバーに表示する文字列
        
  2. ScreenSaverConfigureDialog() 関数で DialogBox の処理を行います。
    見かけは今までの DialogBox と同じなので、特に説明の必要はないでしょう。
    注意することは、ここで nSpeed や szText に値を設定しても ScreenSaverProc() からは参照できないことです。
    そこで DialogBox から設定された値を Profile に書き込んで、Profile を通じて値を引き継ぎます。
    Profile で使用する idsAppName と idsIniFile を String Table から取得します。
    これらのIDや領域は scrnsave.h の中で定義されています。
        case WM_INITDIALOG:
            LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
            LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
            GetPrivateProfileString(szAppName, "TEXT", "Saver Sample-4",
                szText, sizeof(szText), szIniFile);
            SetDlgItemText(hDlg, IDC_EDIT1, szText);
            nSpeed = GetPrivateProfileInt(szAppName, "SPEED", 500, szIniFile);
            wsprintf(szTemp, "%d", nSpeed);
            SetDlgItemText(hDlg, IDC_EDIT2, szTemp);
            return TRUE;
        case WM_COMMAND:
            switch (LOWORD(wParam))
            {   case IDOK:
                    GetDlgItemText(hDlg, IDC_EDIT1, szText, sizeof(szText));
                    WritePrivateProfileString(szAppName, "TEXT", szText, szIniFile);
                    nSpeed = GetDlgItemInt(hDlg, IDC_EDIT2, NULL, FALSE);
                    wsprintf(szTemp, "%d", nSpeed);
                    WritePrivateProfileString(szAppName, "SPEED", szTemp, szIniFile);
                    EndDialog(hDlg, IDOK);
                    return TRUE;
        
  3. ScreenSaver の MainProgram に相当するコールバック関数です。
    WM_CREATE: で ScreenSaverConfigureDialog() 関数で書き込まれた Profile から値を取得します。
    描画は前回と同じですが、szText[40] を画面に表示して下さい。
        {   case WM_CREATE:
                LoadString(hMainInstance, idsAppName, szAppName, APPNAMEBUFFERLEN);
                LoadString(hMainInstance, idsIniFile, szIniFile, MAXFILELEN);
                GetPrivateProfileString(szAppName, "TEXT", "Saver Sample-4",
                    szText, sizeof(szText), szIniFile);
                nSpeed = GetPrivateProfileInt(szAppName, "SPEED", 500, szIniFile);
                GetClientRect(hWnd, &rc);
                wx = rc.right - rc.left;
                wy = rc.bottom - rc.top;
                SetTimer(hWnd, ID_TIMER, nSpeed, NULL);
                break;
        

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