OriosのActiveBasic講座(2-1): ウィンドウパーツ
1.スケルトンウィンドウ

c.解説

前ページのプログラムの解説ですが、前ページのプログラムは5つの部分に分けることができます。 下では、その各部分ごとに説明していきます。

[1] 変数の宣言

'lesson2-1-1 ' 変数の宣言 Dim lpWcx As WNDCLASSEX Dim hBrush As HBRUSH Dim hMainWnd As HWND Dim lpMsg As MSG
【ここでやること】
プログラムに必要な変数を宣言します。
【詳しい説明】
( ) 変数の宣言
ウィンドウを作るには次の4つの変数が必要です。
  • "WNDCLASSEX構造体"の変数 …… 1つ
  • "HBRUSH型"の変数 …… 1つ
  • "HWND型"の変数 …… 1つ
  • "MSG構造体"の変数 …… 1つ
  • ※1: "WNDCLASSEX構造体"・"MSG構造体"はActiveBasicの中で既に定義されていますので、自分で「TypeEnd Type」を使って定義する必要はありません。
  • ※2: "HBRUSH型"・"HWND型"の代わりにDWord型を使っても構いません。

[2] ウィンドウクラスの登録

' ブラシの作成 hBrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)) ' 変数lpWcxの初期化 FillMemory(VarPtr(lpWcx), Len(lpWcx), 0) ' クラスデータの設定 With lpWcx .lpszClassName = "NORMAL" .lpfnWndProc = AddressOf(MainWndProc) .hIcon = LoadIcon(NULL,IDI_APPLICATION) .hIconSm = LoadIcon(NULL,IDI_WINLOGO) .hCursor = LoadCursor(NULL,IDC_ARROW) .cbSize = SizeOf(WNDCLASSEX) .style = CS_DBLCLKS or CS_HREDRAW or CS_VREDRAW .hInstance = GetModuleHandle(0) .hbrBackground = hBrush End With ' ウィンドウクラスの登録 RegisterClassEx(lpWcx)
【ここでやること】
ウィンドウクラスを登録します。
【詳しい説明】
(1) ウィンドウクラス
「ウィンドウクラス」というのは、言わば「ウィンドウのひな型」で、コールバック関数([5]で説明)・背景色・アイコンなどのデータをひとまとめにしたものです。 普通のウィンドウを作るときには、実際に作成する前にそのウィンドウ用の「ウィンドウクラス」を作る必要があります。
(2) ブラシの作成
みなさんが壁に色を塗るときには「ブラシ」(はけ)を使うと思いますが、コンピュータがウィンドウの背景を塗りつぶすのにもコンピュータ用の「ブラシ」(正体は色や模様のデータのセット)が必要です。 普通のブラシを作るには「CreateSolidBrush関数」を使います。
HBRUSH型変数  = CreateSolidBrush(ブラシの色 )
これでブラシの色 で指定した色のブラシができます。 HBRUSH型変数 には、ここで作ったブラシを示す番号(ハンドル)が代入されます。 ウィンドウの背景色はユーザのパソコンの標準のものを使うので、ブラシの色 は、標準のウィンドウの背景色を求める関数を使って指定します。
GetSysColor(取得する色 )
この関数は、設定されているいろいろな色を取得するもので、取得する色 のところに「COLOR_3DFACE」と書けばウィンドウの背景色が取得できます。
  • ※ ブラシの色に直接色を指定する場合は「RGB関数」を使って「RGB(255,128,0)」[この場合R:255, G:128, B:0]のようにします。
(3) ウィンドウクラスのデータ
ウィンドウクラスのデータを「WNDCLASSEX構造体」に代入していきます。
(a) 初期化
Dimで変数や構造体を宣言しただけでは、その変数や構造体にどんな値が入っているか分かりません。 なので、その場合は、実際に値を代入する前に値を0に初期化する必要があります。 構造体を初期化するには次のようにします。
FillMemory(VarPtr(構造体変数 ), Len(構造体変数 ), 0)
  • ※ この関数は、第1パラメータで指定されたポインタから、第2パラメータで指定されたバイト数分だけ、第3パラメータの値で埋めるものです。
(b) クラス名
「.lpszClassName」には、そのウィンドウクラスの名前を文字列で指定します。 この名前は自分で好きに付けて構いません。
(c) コールバック関数
「.lpfnWndProc」には、コールバックバック関数のポインタを指定します。 コールバック関数については後で説明しますが、簡単に言えば「ウィンドウの処理をする関数」です。 この関数は自分で作るので、関数名は好きな名前で構いません。 そして、「関数のポインタ」を取得するには「AddressOf関数」を使用します。
AddressOf(関数名 )
(d) 構造体のサイズ
「.cbSize」には、WNDCLASSEX構造体のサイズを指定します。 このときにWNDCLASSEX構造体のサイズである「48」を直接代入する方法の他に、型や構造体のサイズを求める「SizeOf関数」を使う方法があります。
SizeOf(サイズを求める型・構造体名 )
例えば「DWORD型」のサイズを求める場合は「SizeOf(DWORD)」のように、「WNDCLASSEX構造体」のサイズの場合は「SizeOf(WNDCLASSEX)」のようにします。
(e) 背景のブラシハンドル
「.hbrBackground」には、先ほど作ったウィンドウの背景に使うブラシを代入します。
他の項目は、今の段階では変える必要がないので説明を省略します。
  • ※参考:「.hIcon」にはウィンドウのアイコンハンドル、「.hIconSm」にはウィンドウの小アイコンハンドル、「.hCursor」にはカーソルハンドル、「.style」にはウィンドウのスタイル、「.hInstance」にはインスタンスをそれぞれ代入します。
(4) ウィンドウクラスの登録
(3)でデータを代入した「WNDCLASSEX構造体」は、そのままでは何の意味も成しません。 実際にウィンドウクラスの一つにするためには、これを登録する必要があります。 そのために使用するのが「RegisterClassEx関数」です。
RegisterClassEx(登録するWNDCLASSEX構造体変数 )
これで登録することで、先ほど作ったウィンドウクラスが実際に使えるようになります。

[3] ウィンドウの作成

' ウィンドウの作成 hMainWnd =_ CreateWindowEx( NULL, "NORMAL", "スケルトンウィンドウ", WS_OVERLAPPEDWINDOW or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, GetModuleHandle(0), NULL )
【ここでやること】
ウィンドウを作成します。
【詳しい説明】
(1) CreateWindowEx関数
ウィンドウを作るには「CreateWindowEx関数」を使用します。 この関数はパラメータが多いので、一気に書かずに最初のパラメータから順番に並べて説明します。
(a) 拡張スタイル
今は使用しないので、とりあえず「NULL」または「0」と書いてください。
(b) 使用するウィンドウクラス
作るウィンドウのウィンドウクラスを指定します。 先ほど[2]で作ったウィンドウクラスを使用してください。
(c) ウィンドウタイトル
ウィンドウのタイトルバーに表示する文字列を指定します。
(d) ウィンドウスタイル
ウィンドウスタイル(ウィンドウの外観)を指定します。 ウィンドウスタイルは次に挙げるものを組み合わせて使用します。 普通は「WS_OVERLAPPEDWINDOW」と「WS_VISIBLE」を指定します。 また、どのような場合でも「WS_VISIBLE」は必ず指定してください。
WS_OVERLAPPEDタイトルバーと枠だけのウィンドウを作ります。
WS_SYSMENUウィンドウを閉じるボタン(「×」ボタン)を付けます。
WS_THICKFRAMEウィンドウの縁をドラッグ・アンド・ドロップすると大きさを変えれるウィンドウにします。
WS_MINIMIZEBOX最小化ボタンを付けます。
WS_MAXIMIZEBOX最大化ボタンを付けます。
WS_OVERLAPPEDWINDOW上に書いたものを全部指定したのと同じウィンドウを作ります。
WS_VISIBLE表示されるウィンドウを作成します。
WS_MAXIMIZEウィンドウを最大化して表示します。
WS_MINIMIZEウィンドウを最小化して表示します。
2つ以上のものを同時に指定する場合は、「or」ではさんで「WS_OVERLAPPED or WS_VISIBLE or WS_MAXIMIZE」のようにします。
  • ※ ここで書いたものは最低限のもので、ウィンドウスタイルは他にもたくさんあります。
(e) ウィンドウの左上のx座標(横方向の位置)
(f) ウィンドウの左上のy座標(縦方向の位置)
(g) ウィンドウの幅
(h) ウィンドウの高さ
この4つのパラメータでウィンドウの位置と大きさを指定します。 (e)(f)は、画面の左上を(x座標,y座標)=(0,0)として、そこから右に行くとx座標が、そこから下に行くとy座標が増えるような座標で指定します。 また、この4つのパラメータのうち適当な値にしたいものには、そこに「CW_USEDEFAULT」を指定します。
(i) 親ウィンドウ
(j) メニューハンドル
今は必要ないので、2つとも「NULL」または「0」を指定してください。
(k) インスタンスハンドル
とりあえず「GetModuleHandle(0)」と指定してください。
(l) CREATESTRUCT構造体へのポインタ
今は必要ないので「NULL」または「0」を指定してください。
(2) ウィンドウハンドル
「CreateWindowEx関数」の戻り値は、作られたウィンドウの「ウィンドウハンドル」です。 この「ウィンドウハンドル」というのは、作ったウィンドウを識別するための番号です。

前ページ - 次ページ

ご質問・ご意見・ご感想・苦情等はメールまたはメイン掲示板のActiveBasic板などでお気軽にどうぞ。

ホーム > OriosのActiveBasic講座(トップページ) >