Screen Saver 作成講座

第3回 スクリーンセーバーのアイコンと設定画面を作る



まず、スクリーンセーバーのアイコンを作りましょう。
ワークスペース(左側にあるツリーが表示されているウィンドウ)の
リソースのツリーを表示し "Scrリソース" を右クリックして 
"挿入"をクリック。
"Icon" を選択、 "新規作成" ボタンを押す。
アイコンを編集する。(好きな絵を書いてください。)
これでビルドして作成されたファイルのアイコンを確認してください。
ちゃんと今作ったアイコンで表示されたでしょ?

では、次。
設定用のダイアログを作りましょう。
アイコンと同様に
リソースのツリーを表示し "Scrリソース" を右クリックして 
"挿入"をクリック。
"Dialog" を選択、 "新規作成" ボタンを押す。
出来たダイアログにラベルでも置いておきましょう。
(自分で作ったものかどうかわかるように)
あと、余白部分をダブルクリックして、プロパティを表示して、
ID を "IDD_DIALOG"にしてください。

後は、ソースを以下のように変更します。(太字は今回の変更・追加行) 
        
/////////////////////////////////////////////////////////////////////////// // // S C R E E N S A V E R // /////////////////////////////////////////////////////////////////////////// #include #include // スクリーンセーバー用 #include "resource.h" HBITMAP bitmap, oldbmp; // ビットマップハンドル int iSCX, iSCY; // スクリーンサイズ int x, y, dx, dy; // ビットマップ表示座標・移動差分 LRESULT WINAPI ScreenSaverProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc, memdc; // デバイスコンテキスト switch (message) { case WM_CREATE: // 初期化処理 // ビットマップの読み込み bitmap = LoadBitmap(hMainInstance, MAKEINTRESOURCE(IDB_STAR)); // スクリーンサイズ取得 iSCX = GetSystemMetrics(SM_CXSCREEN); iSCY = GetSystemMetrics(SM_CYSCREEN); // 座標・移動差分初期化 x = y = 0; dx = dy = 10; SetTimer(hwnd, 100, 0, NULL); // 描画用タイマー作成 break; case WM_TIMER: // タイマーイベント hdc = GetDC(hwnd); // 表示デバイスコンテキスト(DC)取得 memdc = CreateCompatibleDC(hdc); // メモリDC作成 oldbmp = SelectObject(memdc, bitmap); // DCにビットマップを選択 // メモリDCのビットマップを黒で表示(前の絵を消す) BitBlt(hdc, x, y, 15, 15, memdc, 0, 0, BLACKNESS); // 座標移動 x += dx; y += dy; // 反射チェック・移動方向反転 if (x < 0) dx *= -1; if (x + 16 > iSCX) dx *= -1; if (y < 0) dy *= -1; if (y + 16 > iSCY) dy *= -1; // ビットマップ描画 BitBlt(hdc, x, y, 15, 15, memdc, 0, 0, SRCCOPY); SelectObject(memdc, oldbmp); // 前のビットマップを選択 DeleteDC(memdc); // DCを削除 ReleaseDC(hwnd, hdc); // DCを開放 break; case WM_DESTROY: // 終了処理 KillTimer(hwnd, 1); // タイマー削除 break; } return DefScreenSaverProc(hwnd, message, wParam, lParam); } BOOL WINAPI ScreenSaverConfigureDialog(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return TRUE; } BOOL WINAPI DConfig(HWND hDlg, UINT message, UINT wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (wParam) { case IDOK: case IDCANCEL: EndDialog(hDlg, TRUE); return TRUE; } break; } return FALSE; } BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { // 16ビット互換用関数を使用していたため、以下のコードに修正 (2000/09/21) //PROC lpDialogProc; // //lpDialogProc = MakeProcInstance((FARPROC)DConfig, hMainInstance); //DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG), 0, lpDialogProc); //FreeProcInstance(lpDialogProc); DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG), 0, DConfig); return TRUE; }
ソースの変更が終わったら、 プロジェクトの設定を変更します。 Alt + F7 で設定ダイアログを表示して "デバッグ" のタグをクリックして プログラムの引数を削除します。 スクリーンセーバーの場合 引数は なしのとき設定ダイアログ、 "/s" のときスクリーンセーバーの実行 なので必要に応じて変更してください。 次回は、このダイアログで、星の移動速度を設定できるようにしましょう。