mieki256's diary



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 の中身が空なのでスクリーンセーバのビルドはできません。

リソースファイルに含められる情報。 :

前述の参考ページのおかげで、スクリーンセーバのリソースファイルに含める情報として、以下のシンボルが利用できると知った。
  • 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
#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 日分です。

過去ログ表示

Prev - 2022/09 - Next
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project