結構便利なアクセラレータ

いきなりですがアクセラレータとは何でしょうか?ビデオカードに乗ってるのはグラフィックアクセラレータですね。 元々の意味を調べるとアクセル、加速器となっています、何が加速するのかというと「メニューコマンドへのアクセス速度」です。 なにしろ押せばすぐに対応したメニューコマンドが実行される訳ですから早いわけです。 例で言うと[Alt+F4]を押すとすぐに終了するあれがアクセラレータです(これはシステムメニューについてます)。 では早速作りましょう、と行きたいところですが、まずはメニューを少し改造したいと思います。

メニューを開き、「終了(Q)」を開きます。そしてキャプションを「終了(&Q)\tCtrl+Q」に変更してください。 これは何のキーを押せばこのメニューコマンドを実行できるかを教える為のもので、それ以外に効果はありません。
つぎに新しくメニューコマンドを作ります。空白のメニューをダブルクリックしてからポップアップを解除し、 ID「IDM_VERSION」キャプション「バージョン情報(&A)」を作ってください。



さらにポップアップメニューをだすメニューを作ってみます。名前は「ファイル(F)」です。 作ったら「終了(Q)」をドラッグ&ドロップでその中に入れちゃってください。



さあメニューの改造は終わりです。ソースコードの方はアクセラレータと一緒に改造します。 では次にアクセラレータをリソーススクリプトに組み込んでみましょう。 いつも通りに右クリックメニューから挿入を選び、Acceleratorを新規作成してください。 今気づいたのですが、下の図のようにツールバーをクリックしても作れますね。



作ったらIDを「IDR_ACCELERATOR」に変更してください。そしてダブルクリックしるとダイアログが出ます。 まずはIDの欄に「IDM_QUIT」と入れてください。次に下の「キータイピング登録」を押します。 するとキャンセルボタンしかないダイアログが出るので、そのときに[Ctrl+Q]を入力します。成功すると下の図のようになるはずです。



ちゃんと入力が出来てるかなど確認したらリターンキーで確定してください。 これでひとまずアクセラレータの完成です!では休む間もなくソースコードをいじりましょう。 今回のソースコードは、結構大がかりな変更が必要になります。 では変更点周辺のみを表示します。


・・・
ウィンドウクラス登録後です

	// ウィンドウ作成
	HWND hwnd;
	hwnd=CreateWindowEx(NULL,strClassName,strTitle,WS_OVERLAPPEDWINDOW,
				CW_USEDEFAULT,CW_USEDEFAULT,320,240,
				HWND_DESKTOP,NULL,hInstance,NULL);
	if(!hwnd) return 0;

	ShowWindow(hwnd,nCmdShow); // Window表示

	// アクセラレータテーブル読み込み
	HACCEL hacc;
	hacc=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR));

	// メッセージループ
	MSG msg;
	while(GetMessage(&msg,NULL,0,0)) // WM_QUITが来ると終わり
	{
		TranslateAccelerator(hwnd,hacc,&msg); // WM_COMMANDに変換
		TranslateMessage(&msg); // WM_CHARに変換
		DispatchMessage(&msg);
	}

	// Loadしたアクセラレータテーブルは自動的に削除されます。
	// Createしたものは削除しなければなりません。
//	DestroyAcceleratorTable(hacc);

	return msg.wParam;
}

///// ウィンドウプロシージャ

・・・

今回のソースコードです。バージョン情報を押したときにメッセージボックスが出るようになってます。

DownLoad!サンプルソースファイルをDownLoad!

まずLoadAccelerators関数でアクセラレータテーブルを読み込みます。あとはメッセージループ内でTranslateAccelerator関数を呼ぶだけです。削除は自動的にされます。
アクセラレータの仕組みは、まずWM_KEYDOWN(WM_SYSKEYDOWN)メッセージを受け取るとTranslateAccelerator関数がアクセラレータテーブル(これがリソース)から検索し、 あればそれに対応したコマンドをWM_COMMAND(WM_SYSCOMMAND)で発信するというふうになっています。 もちろんアクセラレータテーブルを複数持つことや、プログラム内で作成することも可能です。
前に説明したTranslateMessage関数もWM_KEYDOWNが来たときに、一部をWM_CHARで発信する関数です。

TranslateMessage関数やTranslateAccelerator関数は変換したメッセージを送信すると「真」を返します。 真というのは0では無い値です。つまり「TRUE」とか[1]で、if-else分岐でifの方に回る方です。 だから返り値を調べてcontinueなどを使えば無駄なWM_KEYDOWNを送信せずにすみます。豆知識でした。

さて今回はアクセラレータをやりました。これでかなりリソースは大丈夫だと思います。 次回はストリングテーブルをやるつもりです。 基礎の割にはリソースばっかりやってますが、早いうちに便利なものの使い方を覚えておいた方がいいと思ったので(^_^;)。


★INDEX★

Copyright(C) へぽぽ