リソーススクリプトの書き方


リソーススクリプトの構文を知りたくても、思うように調べるのはなかなか困難です。ページ一番下に、参考になる MSDN へのリンクがあります。


 

以下は、ダイアログボックス のリソーススクリプトです。

あらかじめ Windows に入っている「リソース」が使えます。ダイアログボックスや、メニュー、十数種のコントロールなどです。



        

//
// my_resource.rc
//
//--MYDIALOG

#include <windows.h>
#include <commctrl.h>
// commctrl.h は、拡張コントロールのため用:ここではmsctls_statusbar32

#define IDC_STATIC1 101
#define IDC_BUTTON1 102
#define IDC_BUTTON2 103
#define IDC_BUTTON3 104
#define IDC_STATUS1 105
#define IDC_BUTTON4 106
#define IDC_BUTTON5 107
//--

MYDIALOG DIALOGEX DISCARDABLE 0, 0, 168, 120
STYLE WS_POPUP | DS_SETFONT | DS_MODALFRAME | WS_VISIBLE
| DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU
CAPTION "ウィンドウズでダイアログ"
FONT 12, "MS 明朝"
BEGIN
CONTROL "わたしはスタティックコントロール(Static Control) といいます" ,
IDC_STATIC1 ,
"STATIC" ,0L ,22 ,15 ,140 ,20
CONTROL "私はボタン、押してくれ" ,IDC_BUTTON1 ,
"BUTTON" ,
BS_PUSHBUTTON| BS_MULTILINE ,11 ,43 ,105 ,17
CONTROL "なんだか" ,IDC_BUTTON2 ,
"BUTTON" ,
BS_AUTORADIOBUTTON| BS_MULTILINE ,44 ,62 ,54 ,10
CONTROL "レイアウトが" ,IDC_BUTTON3 ,
"BUTTON" ,
BS_AUTORADIOBUTTON| BS_MULTILINE ,44 ,73 ,80 ,9
CONTROL "" ,IDC_STATUS1 ,
"msctls_statusbar32" ,0L ,42 ,76 ,66 ,20
CONTROL "すごいことに" ,IDC_BUTTON4 ,
"BUTTON" ,
BS_AUTORADIOBUTTON| BS_MULTILINE ,44 ,84 ,91 ,9
CONTROL "なってるね!" ,IDC_BUTTON5 ,
"BUTTON" ,
BS_PUSHBUTTON| BS_MULTILINE , 44 ,95 ,91 ,12
END

// C 言語や リソースコンパイラでは、
//「//」 を書けばその行全体がコンパイラにより無視されます。
// そのことを、「コメントアウト」するといいます。

これをソースファイル(.cpp) 内で、CreateDialog() 関数に MYDIALOG を指定して呼び出すとダイアログボックスが表示できます。[基本的なことはこちら]

 

これを書いたら、このあと一体これをどうするのか、についてはここでは述べません。

 

説明をしやすくするため色で分けました。


  MYDIALOG は、ダイアログの名前です。自分で決めるものです。

  DIALOGEX は、 DIALOG でも構いませんが、テンプレートがダイアログであるとを示します。

    画面には、貼り付けられたボタンが2つしかないのに、スクリプトの "BUTTON" は5つもあります。
    丸っこい選択フォームみたいなものも、ボタン
"BUTTON" の一種(選択ボタン)で、BS_AUTORADIOBUTTON で種類を変えています。 BS_PUSHBUTTON はごく普通のプッシュ式ボタンです。ただし、この 「スタイルフラグ」 によって、こうもスタイルがかわるのは ボタンだけ で、スタイルフラグはコントロールの「機能、振る舞い」を指定するためにも使うものです。

 

  "msctls_statusbar32" は、ステータスバーです。画面の下部に何気ない表示バーのようなものがありますが、これも、コントロールの一つで、テンプレート内に記述することで作成、貼り付けしています。他にどんなコントロールがあるか、紹介しようか迷うところです。限られた数、十数種です。このページ下に強調してリンクを用意しました。どんなコントロールがあるか一列に(一覧)眺めたいとき、それを探すとなると、やってみればわかりますが、困難なはずです。用意したリンクは正式な参照場所です。

  ( ヒント : CreateWindow()、CreateWindowEx() 関数 : コントロールのことを知る上で非常に有効なキーワードになります)

   ! こう説明すると、例外があるので言わずにはいられないのですが、HTMLコントロールを CreateWindow 関数で呼び出す方法があるようなので、わたくしはやってみるつもりです。Atl を使用する高度な技で、bcc でやるには com の知識を必要とするのですが、わたくしはちょうどその準備が整ったばかりなのでした・・・(早く書き終えねばならぬのです)。

※ my_resource.rc となっているように、このスクリプトは、このままファイルに保存して、ソースファイルのコンパイル時に利用できますが、ステータスバーが表示できないかもしれません。msctls_statusbar32 はコモンコントロールといって、拡張コントロールの一つです。InitCommonControl[Ex] () 関数による初期化を行わないと使用出来ない場合があります。実行したときに表示されないだけで、コンパイル自体には問題ありません。

 

  IDC_STATIC1 は、各コントロールの (コントロール)ID といい、識別番号です。 #define IDC_STATIC 101 となっているので、アイテムに 101 番 をつけたことになります。この部分は直接数字を入れることもできます。番号だから数字を書けばいいんだよね、と考えるのは正解です。けれども、この ID番号 はソースファイル(.cpp) でも使えなくては困るものです。だから、 #define IDC_STATIC 101 のように書いてあるのです。どのコントロールに何番をつけたのか暗記できて、そうしようとする人は .rc ファイル内でも .cpp ファイル内でもその番号を思い出してプログラムを書けば ID の #define は必要ないといっておきます。生の数字よりも、文字としてシンボル化したほうが遥かにわかりいいからこのように ID を #define するのです。

 通常、この、ID の #define 部分は、ヘッダファイル (.h) にまとめて(記述して)しまいます。ここで説明することではないかもしれませんが、結局、プログラムを組む際は、.cpp ファイル、.rc ファイル、.h ファイルの3つを作ることになります。
  ( ヒント : GetDlgCtrlID() [GetWindowID マクロ] <=> GetDlgItem() , ウィンドウハンドル : これら2つは必ず 必要となるけど自分で見つけにくい関数です。)

 

さて、これ以外の部分には構わないことにしましょう。わからないところはそのまんまにして、雛形のようにして使っていってください。WS_VISIBLE などのスタイルフラグは、Windows Programming に独特な 固有キーワードなので、検索すればすぐにヒットします。非常に探しやすいです。また、意味をある程度察することのできるフラグもありますね。

 


  ここでは全部 「CONTROL」 コントロールワードを用いています。これだけだと分かりやすいのですが、少しだけ余計なことがあります。"BUTTON" や、"EDIT"、"COMBOBOX"、"SCROLLBAR"、"STATIC"、"LISTBOX" の6つは、省略形の、

  EDITTEXT IDC_EDIT1 ,36 ,30 ,49 ,16,0L // EDIT コントロールの場合

  のような表記(構文)も用意されています。これらはそれぞれに書き方(構文)が異なる(統一的というわけではない)ので、注意してください。一方、CONTROL の構文(書き方)は種類によらず同じです。

MYDIALOG DIALOGEX DISCARDABLE 0, 0, 200, 125
STYLE WS_POPUP | DS_SETFONT | DS_MODALFRAME | WS_VISIBLE | DS_SETFOREGROUND | WS_CAPTION | WS_SYSMENU
CAPTION "タイトル"
FONT 12, "MS 明朝"
BEGIN
CONTROL "コントロール1", CTRLID ,"STATIC" ,0L ,22 ,15 ,140 ,20
END

このような雛形一つ用意しておくと安心だ、といえば気休めになるでしょうか。

 


[リソーススクリプトって絶対書かなくちゃいけないの?]

 リソーススクリプトは、ダイアログボックス(DIALOG DIALOGEX)、メニュー(MENU)の2つのほか、文字列リソース(STRINGTABLE)、ビットマップ(BITMAP)、アイコン(ICON)、カーソル(CURSOR)、トランスレータ アククセラレータ (ACCELERATORS ; キーボードのショートカット機能 : キーボードのキーとある識別ID を関連づける )、rawデータ を、ソースプログラム内で使用したい場合に実のところ、 半ばオプション的に記述するものです。一部の場合を除いては、基本的にリソーススクリプトを用いずとも、ソースプログラム内の API 関数のみで処理することが可能なのです。そのような API 関数が存在します。特に メニュー関係には豊富な API 関数がそろっています。反対に、ダイアログボックスの場合、CreateDialogIndirect() 関数で、パラメータを指定してダイアログを作成し、さらに、それにコントロールを(一つ一つ CreateWindow() 関数で!) 貼り付ける作業をするとなると、その方法よりは、リソーススクリプトを利用するほうをとらざるを得ません。リソーススクリプトは、簡便のための要素ということで、しばられる必要は特にありません。

上で挙げたそれぞれのリソース(ダイアログボックスやらメニュー)に、書き方やコントロールワード(文法)がありますが、だいたい決まりきった原型というものがあって、それをまず書いてしまい、あとは細かいところを修正していくという形でやっていきます。HTML 記述とある意味似たような感覚でとらえてかまわないと思います。正式に調べるには下に厳選サイトを用意しました

 

 ダイアログボックスにメニューを付けたい、のような場合、「ダイアログボックスの記述の中にメニューの記述も書くのか」 のように考えると、複雑に思えてしまいますが、そういうこととは少し違います。それぞれを 独立 に リソースファイル(.rc) 内に記述します。DIALOGEX 内、BEGIN の手前で、MENU MYMENU (作った、記述したメニュの名前) のようにします。

 

  おまけ  [ MSDN : Windows Controls コントロール ] [ MSDN : Resources メニュー等 ]

 厳選 MSDN : リソーススクリプト リソーススクリプトトップ

 

 

脱線してきたところ(コンパイラのところ)へ戻る

トップ リソーススクリプト