Win32/64アプリ開発 002 基礎の理解

提供:yonewiki
2023年10月17日 (火) 20:32時点におけるYo-net (トーク | 投稿記録)による版

Win32/64 アプリケーション開発

概要

 前回、示したコードを少しづつ理解してみましょう。全部を理解しようと思わない方がよいです。Win32/64コード。未来永劫、少しでも多くを知ろうというスタンスで良いと思います。


 最初はインクルード文です。


#include <windows.h>
#include "resource.h"


 windows.hはwin32アプリ開発では、ほぼ必須となるような標準的なヘッダファイルです。コンソールアプリケーション開発で使ったcstdio.hやstdio.hのようなものと同等のモノです。


 resource.hはリソースと呼ばれるアイコンやダイアログボックスのようなグラフィカルな要素を含む部品を利用するときに(プロジェクト名).rcでグラフィカルな要素をテキストベースで定義する作業をVisualStudioのような開発アプリでは、視覚的なUIのリソースエディタで操作することで、定義のコード自動生成するもので、resource.hにはリソース部品に使われるIDと呼ばれるテキストコードに対応する番号を管理するようなファイルで、リソースエディタで操作すると、自動で編集されるものです。最初のうちは、あまり理解できないでしょう。メニューバーやアイコンやダイアログボックスを表示させるようなアプリを作り始めたら、理解が深く進んでいくものです。


 次に以下のような定義についてです。


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
wchar_t szClassName[] = L"SimpleEditWindow";
HWND HWNDg_hEdit;
HWND HWNDg_hWnd;
HINSTANCE HINSTANCEg_hInst;


 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);は関数のプロトタイプ宣言です。WinMainという関数がコンソールアプリでいうところのmain関数にあたりますが、WndProcのような関数はWimMain関数側で作成するWindowアプリが必ず定義する必要のあるウィンドウプロシージャーというメッセージ処理関数です。


 Windowsアプリはウィンドウの構造をプログラムによって構築していく部分とOS側からのマウス操作やキー操作やウィンドウについている各種ボタンを操作したときに信号が送られるようになっています。これをウィンドウプロシージャーと呼ばれるメッセージ処理関数でどのような処理を行うかをコードで表現することで実現されます。ウィンドウを生成するときに、そのセットになるウィンドウプロシージャ関数名も設定するようになっています。


 他にもウィンドウプロシージャ関数はダイアログボックスを作るときにも定義できるようになっていますので、ひとつのアプリケーションで複数のウィンドウプロシージャ関数によりメッセージ処理を行うことになります。


 wchar_t szClassName[] = L"SimpleEditWindow";ではウィンドウを作るときに名づけが必要になるので作ったワイド文字列です。適当な値でいいでしょう。L" "はwcha_t型のワイド文字列を設定するときに使うリテラル(変数をもたない文字列、変数を持たないとはいえ、リテラルの先頭アドレスを何らかの変数に代入して使います。)の定義方法です。ワイド文字列はマルチバイト文字列という方式に相対する文字列の方式です。ワイド文字は日本語のような文字コード体系の部分を保持するのに向いている文字列の形式で2バイトで1文字を表すようなUTF-16に似ているコード管理方式です。マルチバイト文字列でも日本語文字列を表現することは可能ですが、可変長の文字コード体系になります。Shift-JISのような方式です。


 次に、HWND HWNDg_hEdit; HWND HWNDg_hWnd;のように2つのHWND型グローバル変数を宣言しています。HWND型と聞くと、聞いたこともない新しい型のように思えますが、int型の変数を一つもつような構造体で、シンプルな新しい構造体変数の別名です。typedefキーワードで型名はいくらでも別名を持つことができます。新しい型名のほとんどは、C言語で習ったような変数で構成された型名が集まった構造体であるか、ただの別名に過ぎません。HWND型は主にWindowのハンドルと呼ばれるWindow番号を保持しているだけです。単なる数値です。考えすぎないことです。どんんなに複雑なモノでも、0と1で全てが表現されるのがコンピュータです。謎めいたものなど存在しません。このウィンドウハンドルというものをグローバル変数で保持しておくと、いろいろなウィンドウプロシージャ関数をまたいで、同じ値のウィンドウハンドル番号をどこからでも参照できて便利なのでグローバル変数にしています。グローバル変数を使い始めると変数名の重複が起こってプログラム制作での障壁になりやすいと言われることがありますが、1000や2000のグローバル変数くらいは命名方法をきちんときめていれば、許容できるものです。この程度の数のグローバル変数を管理できないようであれば、変数を関数の中で管理してどこからでも呼び出せるややこしさには太刀打ちできません。現によくある、Webアプリの設定ファイルなんかにある、設定変数は1000や2000種類くらいあります。グローバル変数となんら変わりありません。


 とはいえグローバル変数にしまくれと言っているわけではありません。その他の方法もありますので、バランスよく使っていきましょう。ここの管理人はグローバル変数を沢山使ってもいいと思っています。変に固執すると、グローバル変数で「すっ」とできることが、「ずっと」ややこしいことになります。ウィンドウズでは、アプリ構築の関数とメッセージ変数を扱うプロシージャ関数とに分かれています。構築側とプロシージャ側とで変数の受け渡しをするには、グローバル関数を使うのも楽な手段のひとつです。


 HINSTANCE HINSTANCEg_hInst;も似ていますが、HWNDよりはひとつのアプリで扱う番号が少ないハンドルです。アプリの実体番号のようなものです。これもグローバル変数で管理されていたほうが楽なことが多い番号です。