2022/09/07(水) [n年前の日記]
#1 [prog][windows] Windows用スクリーンセーバの作り方をまだもうちょっと調べてる
Windows用スクリーンセーバをC/C++で作る方法を、まだもうちょっと調べてるところ。
スクリーンセーバ(.scr)のリソースファイル(.rc)に、スクリーンセーバのタイトル名や、アイコンを含めることができるらしい。以下がとても参考になった。ありがたや…。
_How to Scr: Writing an OpenGL Screensaver for Windows
_スクリーンセーバーの実体 (mixi 日記アーカイブ)
_スクリーンセーバーのコマンドライン (mixi 日記アーカイブ)
_スクリーンセーバーの実装手順 (mixi 日記アーカイブ)
_scrnsave.lib の使い方 (mixi 日記アーカイブ)
_リソースの作成 (mixi 日記アーカイブ)
_関数の実装 (mixi 日記アーカイブ)
_実行してみる (mixi 日記アーカイブ)
環境は、Windows10 x64 21H2 + MinGW (gcc 9.2.0)。
しつこく何度も書くけれど、MinGW-w64 (+ MSYS2) じゃなくて MinGW (+ MSYS) で作業してます。MinGW-w64 は libscrnsave.a の中身が空なのでスクリーンセーバのビルドはできません。
スクリーンセーバ(.scr)のリソースファイル(.rc)に、スクリーンセーバのタイトル名や、アイコンを含めることができるらしい。以下がとても参考になった。ありがたや…。
_How to Scr: Writing an OpenGL Screensaver for Windows
_スクリーンセーバーの実体 (mixi 日記アーカイブ)
_スクリーンセーバーのコマンドライン (mixi 日記アーカイブ)
_スクリーンセーバーの実装手順 (mixi 日記アーカイブ)
_scrnsave.lib の使い方 (mixi 日記アーカイブ)
_リソースの作成 (mixi 日記アーカイブ)
_関数の実装 (mixi 日記アーカイブ)
_実行してみる (mixi 日記アーカイブ)
環境は、Windows10 x64 21H2 + MinGW (gcc 9.2.0)。
しつこく何度も書くけれど、MinGW-w64 (+ MSYS2) じゃなくて MinGW (+ MSYS) で作業してます。MinGW-w64 は libscrnsave.a の中身が空なのでスクリーンセーバのビルドはできません。
◎ リソースファイルに含められる情報。 :
前述の参考ページのおかげで、スクリーンセーバのリソースファイルに含める情報として、以下のシンボルが利用できると知った。
ちなみに、これらは scrnsave.h の中で値が定義されている。
_winsdk-10/ScrnSave.h at master - tpn/winsdk-10
そんなわけで、昨日作ったサンプルに対して、それらのシンボルを使ってリソースを含めてみた。
_ビットマップ画像を描画するスクリーンセーバを書いてみた
_resource.rc
アイコンファイル(.ico) は以下。
_appli_ico.zip
- IDS_DESCRIPTION (値は 1) : スクリーンセーバの名前/タイトルを示す。
- ID_APP (値は 100) : スクリーンセーバのアイコンを示す。
- DLG_SCRNSAVECONFIGURE (値は 2003) : スクリーンセーバの設定ダイアログを示す。
ちなみに、これらは scrnsave.h の中で値が定義されている。
_winsdk-10/ScrnSave.h at master - tpn/winsdk-10
そんなわけで、昨日作ったサンプルに対して、それらのシンボルを使ってリソースを含めてみた。
_ビットマップ画像を描画するスクリーンセーバを書いてみた
- IDS_DESCRIPTION は、"MinGW Scrnsave Sample" にした。これは、スクリーンセーバ設定画面のリスト一覧上の名前になる。
- ID_APP は、ICON "appli.ico" に。
- DLG_SCRNSAVECONFIGURE には、OKボタンとキャンセルボタンを並べた。
_resource.rc
/* resource.rc */ #include <windows.h> #include <scrnsave.h> #define IDC_STATIC_ICON 2300 #define IDC_STATIC_TEXT 2301 /* bitmap */ IDI_BALL BITMAP "ball.bmp" IDI_BALL_MSK BITMAP "ball_mask.bmp" IDI_BG BITMAP "bg2.bmp" IDI_PREVIEW BITMAP "scrsav_preview.bmp" /* screensaver title */ STRINGTABLE BEGIN IDS_DESCRIPTION "MinGW Scrnsave Sample" END /* Icon */ ID_APP ICON "appli.ico" /* Config dialog */ DLG_SCRNSAVECONFIGURE DIALOG DISCARDABLE 0, 0, 260, 80 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Setting Sample Screensaver" FONT 11, "Segoe UI" BEGIN DEFPUSHBUTTON "OK", IDOK, 140, 58, 50, 16 PUSHBUTTON "Cancel", IDCANCEL, 200, 58, 50, 16 ICON IDI_WARNING, IDC_STATIC_ICON, 8, 8, 20, 20 LTEXT "This is the template for the configuration dialog.", IDC_STATIC_TEXT, 32, 8, 230, 25 END※ このWeb日記システムの関係で、FONT指定行がおかしな状態で表示されてます。先頭の空白は削除してもらえればと…。
アイコンファイル(.ico) は以下。
_appli_ico.zip
◎ リソースファイル内の設定ダイアログを呼び出し。 :
昨日のサンプルでは、スクリーンセーバ設定画面の「設定」をクリックした際、プログラム内でメッセージダイアログを表示するようにしてあったのだけれど。
そもそも、スクリーンセーバの設定ダイアログについては、リソースファイルの中で記述しておけば、そちらが利用されて表示されるらしい…。
そんなわけで、設定ダイアログ関連の記述は以下のようになった。一部だけ抜粋。
_mgscrsv2.c
一応、ビルドに必要なファイル群をzipにして置いときます。
_mgscrsv2.zip
そもそも、スクリーンセーバの設定ダイアログについては、リソースファイルの中で記述しておけば、そちらが利用されて表示されるらしい…。
そんなわけで、設定ダイアログ関連の記述は以下のようになった。一部だけ抜粋。
_mgscrsv2.c
#include <windows.h> #include <tchar.h> #include <scrnsave.h> #include <time.h> #include <stdlib.h> #include "resource.h" /* ... */ /* Processing of dialog boxes for configuration */ BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, 0); return TRUE; case IDCANCEL: EndDialog(hDlg, 1); return TRUE; } return FALSE; } return FALSE; } /* Register non-standard window classes required by dialog boxes for configuration */ BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { return TRUE; }OKボタンやキャンセルボタンがクリックされた時の処理を書いておくだけでいいらしい。もちろん、色々なウィジェットを配置した場合は、それらの動作を反映させる必要があるのだろうけど…。
一応、ビルドに必要なファイル群をzipにして置いときます。
_mgscrsv2.zip
[ ツッコむ ]
以上、1 日分です。