Screen Saver 作成講座

第2回 ビットマップを表示するスクリーンセーバーを作る



今回は前回の何も表示されないさびしいスクリーンセーバーを
星型(★)ビットマップを画面内を反射しながら移動するものに改造してみましょう。
(まぁ、ビットマップは何でもいいんですけどね (^_^) )

まず、メニューの "挿入" -> "リソース" をクリック。 "Bitmap" を選択して "新規作成" ボタンを押す。 表示されているビットマップ編集ウィンドウの余白部分をダブルクリックして プロパティを表示します。 ID を IDB_STAR に変更。 幅・高さを 16 に変更。 ビットマップを編集(★を描く、背景は黒にしてください)。 リソースツリーのウィンドウを閉じて、リソースを保存。 ここではファイル名(Scr.rc)として保存します。 メニューの "プロジェクト" -> "プロジェクトへ追加" -> "ファイル..."をクリックし さっき保存したファイルを選択(Scr.rc)して "OK" ボタンを押す。 後は、ソースを以下のように変更します。(太字は今回の変更・追加行)
// Scr.c /////////////////////////////////////////////////////////////////////////// // // 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 RegisterDialogClasses(HANDLE hInst) { return TRUE; } BOOL WINAPI DConfig(HWND hDlg, UINT message, UINT wParam, LONG lParam) { return TRUE; }
ビルドし直して実行してみてください。 できたかな? これだけでもさみしいのでいろいろ改造してみてください。 次回は、現在のままではアイコンも設定画面もないのでその作り方をやります。