Screen Saver 入門



乱数で矩形を表示する Screen Saver のプログラムです。

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

ScreenSaver は、元々CRTの焼付けを防止するためのプログラムだったのですが、本来の目的はどこへやら すっかりファッションになってしまいました。(-.-;)
あなた方の中にも強い興味を持っている人がいるのではないでしょうか?
VisualC++ には ScreenSaver を作成するためのライブラリが用意されていて、これを使えば簡単に ScreenSaver を作成することが出来ます。

Visual C++ .net には scrnsave.lib が格納されていませんでした。

次のエラーが表示されたときは、プロジェクトのフォルダーに scrnsave.lib と scrnsave.h をコピーして下さい。

プロジェクトの設定

  1. 空の新規プロジェクトを作成して下さい。
  2. Saver01.cpp をプロジェクトのフォルダーに格納して [プロジェクト] [既存項目の追加] からプロジェクトに追加します。
  3. ScreenSaver の専用ライブラリを使用するのですが #pragma でリンクしているので特に操作は不要です。
    #pragma comment(lib,"scrnsave.lib")
  4. プログラムをコンパイルして *.exe を作成します。
    Debug モードでコンパイルするとサイズが大きくなるので Release モードでコンパイルして下さい。
  5. *.exe を *.scr にリネームします。
    *.exe と *.scr は基本的には同じ実行形式のプログラムです。
    *.scr をダブルクリックすると ScreenSaver のテストモードで少しだけ実行されます。
  6. スクリーンセーバーの設定です。
    *.scr を Windows\system32 のフォルダーにコピーします。
    このフォルダーに格納するとコンボボックスに登録されて、スクリーンセーバーとして選択できる(先頭の画像を参照)ようになります。
  7. モニタ画面を右クリックして、プロパティからスクリーンセーバーを設定します。
    プレビューで実行状態を確認(先頭の画像を参照)できます。
  8. 設定を終了して、時間が経過するとスクリーンセーバーが起動します。

プログラムの説明

  1. ScreenSaver の WinMain() はライブラリに組み込まれています。
    ライブラリがサポートされるまでは、WinMain() のパラメータを解析しながら処理していたのですが、 ずい分と便利になったものです。(^_^;
  2. ScreenSaver のヘッダーをインクルードして、専用のライブラリをリンクして下さい。
        #include <windows.h> 
        #include <scrnsave.h>
        #pragma once
        #pragma comment(lib,"scrnsave.lib")
        
  3. ScreenSaver の MainProgram に相当するコールバック関数です。
    WM_CREATE でウインドウのサイズを調べて、タイマーをセットしています。
    WM_TIMER: で矩形を描画します。
    WM_DESTROY: でタイマーを停止して終了します。
    基本的には、たったこれだけです。
        LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            RECT    rc;
            HDC     hdc;
            static  int wx,wy;
            int     x1,x2,y1,y2,r,g,b;
            HBRUSH  hBrush,hOldBrush;
    
            switch(msg)
            {   case WM_CREATE:
                    GetClientRect(hWnd,&rc);
                    wx= rc.right-rc.left;
                    wy= rc.bottom-rc.top;
                    SetTimer(hWnd,ID_TIMER,100,NULL);
                    break;
                case WM_TIMER:
                    r= rand() % 256;
                    g= rand() % 256;
                    b= rand() % 256;
                    hdc = GetDC(hWnd);
                    hBrush= CreateSolidBrush(RGB(r,g,b));
                    hOldBrush= (HBRUSH)SelectObject(hdc,hBrush);
                    x1= rand() % wx;
                    y1= rand() % wy;
                    x2= rand() % wx;
                    y2= rand() % wy;
                    Rectangle(hdc,x1,y1,x2,y2);
                    SelectObject(hdc,hOldBrush);
                    DeleteObject(hBrush);
                    ReleaseDC(hWnd,hdc);
                    break;
                case WM_DESTROY:
                    KillTimer(hWnd,ID_TIMER);
                    PostQuitMessage(0);
                    return 0;
                default:
                    break;
            }
            return DefScreenSaverProc(hWnd, msg, wParam, lParam);
        }
        
  4. 今回は次の関数で行う処理はありません。
    return TRUE; で終わらせて下さい。
        BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
        {
            return TRUE;
        }
    
        BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
        {
            return TRUE;
        }
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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