ウィンドウにメニューバーをつける

Win32 API
スポンサーリンク

この記事では「win32 API」を使ったプログラム(テンプレート「Windowsデスクトップウィザード」を使用。下の画像)で作成したウィンドウにメニューバーを付ける方法を説明しています。


環境 
・ Windows8.1
・ visual studio 2019 community

この記事では下の画像のようなことについて説明しています。

スポンサーリンク

記事の概要

ます、何もしないウィンドウを作成する手順を説明しています。次にそのウィンドウにメニューバーを付ける手順を説明しています。

メニューバーの付け方だけわかればいい方はここをクリック。

スポンサーリンク

何もしないウィンドウを作成する手順

Visual Studioを起動し、表示されるウィンドウで「新しいプロジェクトの作成」をクリック。

「Windows デスクトップ ウィザード」を選択してから「次へ」をクリック。

プロジェクト名を入力し、保存フォルダを選択したら「作成」をクリック。

アプリケーションの種類を「デスクトップ アプリケーション(.exe)」とし「空のプロジェクト」にチェックを入れてから「OK」をクリック。 

スポンサーリンク

cppファイルの追加

ctr + alt + L (ctr キーとalt キーとLキーを同時に押す。以下この記法で書いてあります) で ソリューションエクスプローラーを開きます。

プロジェクトにcppファイルを追加します。「ソースファイル」を青く選択した状態で ctr + shift + A  すると「新しい項目の追加」ウィンドウが表示されます。

「C++ファイル(.cpp)」を選択し、名前と場所を決めたら「追加」をクリック。  

エディタが開かれるので以下のコードを貼り付けてください。(コードは猫でもわかるプログラミングを参考にさせていだだきました)

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void ShowMyText(HWND);
char szClassNme[] = "ウィンドウクラス・ネーム";

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
	LPSTR lpszCmdLine, int nCmdShow)
{
	HWND hWnd;
	MSG msg;
	WNDCLASS myProg;

	if (!hPreInst) {
		myProg.style = CS_HREDRAW | CS_VREDRAW;
		myProg.lpfnWndProc = WndProc;
		myProg.cbClsExtra = 0;
		myProg.cbWndExtra = 0;
		myProg.hInstance = hInstance;
		myProg.hIcon = NULL;
		myProg.hCursor = LoadCursor(NULL, IDC_ARROW);
		myProg.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
		myProg.lpszMenuName = NULL; 
		myProg.lpszClassName = szClassNme;
		if (!RegisterClass(&myProg))
			return FALSE;
	}
	hWnd = CreateWindow(szClassNme,
		"sample",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (msg.wParam);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		break;

	default:
		return(DefWindowProc(hWnd, msg, wParam, lParam));
	}
	return (0L);
}


スポンサーリンク

プロジェクトのプロパティを設定

このコードは「マルチバイト文字セット」に対応した表記になっています。Visual Studioのデフォルトでは文字セットはUnicode文字セットになっているのでこのままビルドするとコンパイルエラーになります。

そのためにプロジェクトのプロパティを設定しておく必要があります。

alt + P → P (altキーとPキーを同時に押してからPキーを押す)しプロジェクトのプロパティページのウィンドウを開きます。

「構成プロパティ」→ 「詳細」 と進み  「文字セット」を「マルチバイト文字セットを使用する」に変更して「適用」をクリック。

「OK」をクリックしてウィンドウを閉じます。

f5 を押下して実行すると何もしないウィンドウが表示されます。 

このウィンドウにメニューバーを付けていきます。

スポンサーリンク

大雑把な概要

メニューバーの名前(以下メニュー名)をウィンドウの形状などを指定する構造体のメンバに代入します。

もう少し細かい概要

メニュー名はリソースファイル(.rc)という種類のファイルに書かれています(これから作成します)。下の画像の「IDR_MENU1」がメニュー名です。

この「IDR_MENU1」を WinMain関数の書かれているcppファイルのWNDCLASS構造体のメンバ「lpszMenuName」に代入すればいいです。

具体的な手順

プロジェクトにリソースファイル(.rc)を追加

ctr + alt + L  でソリューションエクスプローラーを開きます。 

リソースファイルを青く選択した状態で ctr + shift + A 

「新しい項目の追加」が表示されるので「リソースファイル(.rc)」を選択し「追加」をクリック。ファイル名はそのままでいいです。 

勝手にリソースビューが開きます。今作成したリソースファイル(Resource.rc)が選択されているので、この状態で 

shift + f10 → A  と押下して リソースを追加 します。 

「Menu」を選択して「新規作成」をクリック。 

リソースエディタが開かれます。 

この状態でenterを押すと入力できる状態になるので文字を入力します。(なんでもいいです。この記事では「終了」と入力)

ctr + f4  を押下して リソースエディタを閉じます。

ソリューションエクスプローラーを開き(ctr + alt + L) Resource.rcを選択した状態で f7 を押下。

注意のウィンドウがでるので「はい」をクリック。

変更保存のウィンドウが出るので「はい]をクリック 

さきほどはリソースファイル(.rc)がGUIのエディタで開かれていましたが以下の画像のようにテキストエディタで開かれたと思います。 

下へスクロールしていくと53行目(この記事のコードでは)に 「IDR_MENU1 MENU」と書いてあると思います。「IDR_MENU1」がメニュー名です(メニュー名も自動で作成されました)。 

これをcppファイルの myProg.lpszMenuName(myProgはこの記事のコードで定義した構造体の名前です)に代入すればいいのですがこのまま作業を進めると問題が起きるので一つ作業をします

resource.hでの作業

このResource.rc(リソースファイル)には冒頭に #include “resource.h” と書いてあります。 

「resource.h」というファイルを読み込んでいます。resource.hも自動で作成されました。

このresource.h を開いてみると以下の画像のようにオブジェクト形式マクロが定義されています。

Resource.rcではresource.hを読み込んでいるのでこのまま何もしないとメニュー名のIDR_MENU1が101に置き換えられてしまいます。

メニュー名としてIDR_MENU1を使いたいので resource.h の

define IDR_MENU1 101  

この行をコメントアウトします。 

cppファイルでの作業

エディタでcppファイルを開き25行目(この記事のコードでは)の

myProg.lpszMenuName = NULL; のNULLをメニュー名に変更します。

“IDR_MENU1″のようにダブルコーテーションで囲んでください。lpszMenuNameは文字列型の変数です。 

以上でウィンドウにメニューバーを付ける手順は終了です。

f5 を押下して実行すればメニューバーがついたウィンドウが表示されるはずです。

メニューをクリックしたときの挙動をコードに書いてないのでメニューをクリックしても何も起きません。

スポンサーリンク

まとめ

ウィンドウにメニューバーをつけるにはWinMain関数内で定義したWNDCLASS構造体のメンバlpszMenuNameにメニュー名を代入します(ダブルコーテーションで囲んで)。

この記事は以上です