Screen Saver で画像を表示



二個の画像と矩形を乱数で描画する Screen Saver のプログラムです。
VisualC++ には ScreenSaver を作成するためのライブラリが用意されていて、これを使えば簡単に ScreenSaver を作成することが出来ます。

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

次のエラーが表示されたときは .net の lib のフォルダーに scrnsave.lib をコピーして下さい。

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

プロジェクトの設定

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

プログラムの説明

  1. ScreenSaver の WinMain() はライブラリに組み込まれています。
    ライブラリがサポートされるまでは、WinMain() のパラメータを解析しながら処理していたのですが、 ずい分と便利になったものです。(^_^;
  2. ScreenSaver のヘッダーをインクルードして、専用のライブラリをリンクして下さい。
  3. ScreenSaver の MainProgram に相当するコールバック関数です。
    WM_CREATE でウインドウのサイズを調べて、タイマーをセットしています。
    WM_TIMER: で画像と矩形を描画します。
    WM_DESTROY: でタイマーを停止して終了します。
    基本的には、たったこれだけです。
        LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
        {   RECT    rc;
            HDC     hdc,hdc_mem;
            static  int  wx,wy;
            int     x1,x2,y1,y2,r,g,b,bmp_w,bmp_h;
            HBRUSH  hBrush,hOldBrush;
            HBITMAP hBitmap;
            BITMAP  bmp_info;
    
            switch(msg)
            {   case WM_CREATE:
                       :
                    break;
                case WM_TIMER:
                       :
                    if (r%2 == 0)
                        hBitmap= LoadBitmap(hMainInstance,MAKEINTRESOURCE(IDB_BITMAP1));
                    else
                        hBitmap= LoadBitmap(hMainInstance,MAKEINTRESOURCE(IDB_BITMAP2));
                       :
                    BitBlt(hdc,x1,y1,bmp_w,bmp_h,hdc_mem,0,0,SRCCOPY);
                       :
                    break;
        

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

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