アイコンを乗せよう2

さて、今回は前回に引き続きアイコンをプログラムに組み込みます。 ただし今回組み込むのは小さいアイコンです。 前回のプログラムでは普通のアイコンしか作ってないので小さいアイコン表示の場合つぶれてしまうのです。
ではさっそく小さいアイコンを作ってプログラムに組み込みましょう。 今回は次の順番でやっていきます。簡単ですね。

  1. 前回作ったアイコンに、小さいアイコン(16*16)を追加する。
  2. ウィンドウクラスのhIconSmに入れる。


図入りで説明します。まずは前回作ったアイコンを開いてください。 そして図のように、新規デバイスイメージというところをクリックします。



すると以下のようなダイアログが出るので、目的のサイズ(ここではスモール16*16)をクリックしてOKを押します。 これで小さいアイコンのできあがりです。後は好きな絵を描いてビルドすれば完成です!



起動すると今度はつぶれずにさっき書いた小さいアイコンが表示されているのが分かります。 ところで2番目にやるはずだったことはどうしたんでしょうか・・・。 実はここは省略が可能です。ですがなるべく省略せず、設定しておいた方がいいです。 その方がOSが直接小さいアイコンを見つけられるので少しは早くなると思います(^_^;)。



ではウィンドウクラスに小さいアイコンを追加します。 使うのはLoadImage関数で、今回は普通のアイコンとカーソルもこれを使ってみます。


HANDLE LoadImage(
  HINSTANCE hinst,   // イメージを含むアプリケーションのハンドル
  LPCTSTR lpszName,  // イメージのIDか名前
  UINT uType,        // イメージの種類
  int cxDesired,     // 横幅
  int cyDesired,     // 高さ
  UINT fuLoad        // 読み込むときの設定フラグ
);
hinst イメージを持つアプリケーションの、インスタンスハンドルを指定します。OSのイメージを指定するときはNULLを入れます
lpszName イメージの名前、あるいはIDをMAKEINTRESOURCEマクロで文字列に変換したもの。イメージのファイル名も可能です。
uType イメージの種類を指定します。ビットマップ:IMAGE_BITMAP、カーソル:IMAGE_CURSOR、アイコン:IMAGE_ICON です。
cxDesiredイメージの横幅を指定します。
cyDesiredイメージの高さを指定します。
fuLoad イメージを読み込むときに、どんな感じで読み込むかを設定します。詳しくは後述します。
戻り値 成功すれば読み込んだイメージのハンドルが返ります。そしてこれを任意の型にキャストします。

fuLoadに入れるフラグ
LR_DEFAULTCOLOR デフォルトのフラグです。白黒でないことを意味します。
LR_CREATEDIBSECTIONビットマップをロードするときに、DIBセクションビットマップでロードします。
LR_DEFAULTSIZE アイコンやカーソルをシステム標準サイズでロードします。ただしcxDesiredとcyDesiredを0に指定する必要があります。
LR_LOADFROMFILE lpszNameの指すファイルからイメージをロードします。このフラグを使わない場合、リソースからロードします。
LR_LOADMAP3DCOLORS イメージ内の特定の灰色をシステムの3Dカラーに変換します。
ダークグレー(128,128,128)→COLOR_3DSHADOW
グレー(192,192,192)→COLOR_3DFACE
ライトグレー(223,223,223)→COLOR_3DLIGHT
LR_LOADTRANSPARENT イメージ内の最初のピクセルの色を、COLOR_WINDOWに変換します。LR_LOADMAP3DCOLORSと一緒に指定すると、COLOR_3DFACEに変換されます。
LR_MONOCHROMEイメージを白黒でロードします。
LR_SHARED イメージハンドルを共有します。つまり同じリソースをロードする場合、同じハンドルが返ってきます。
つまりこの関数を使えばアイコン、カーソル、ビットマップをリソースやファイルから読み込み、そのハンドルを取得できるわけです。 ひとつの関数でいろいろ出来るので便利ですね。 ここでは大きいアイコンとカーソルはそのままのサイズでロードし、小さいアイコンは直接サイズを指定してロードします。 では今回のソースコードをどうぞ、やっぱり変更点を赤くしています。


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

///// プロトタイプ宣言

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp);

///// 変数宣言

const char *strClassName="SAMPLE"; // ウィンドウクラスの名前
const char *strTitle="サンプル"; // タイトル

///// WinMain

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	// ウィンドウクラスの登録
	WNDCLASSEX wcx;
	wcx.cbSize			= sizeof(WNDCLASSEX);
	wcx.style			= CS_DBLCLKS; // ダブルクリック検知
	wcx.lpfnWndProc		= WindowProc;
	wcx.cbClsExtra		= 0;
	wcx.cbWndExtra		= 0;
	wcx.hInstance		= hInstance;
	wcx.hIcon			= (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON)
							,IMAGE_ICON  , 0, 0,LR_DEFAULTCOLOR); // アイコン
	wcx.hIconSm			= (HICON)LoadImage(hInstance,MAKEINTRESOURCE(IDI_ICON)
							,IMAGE_ICON  ,16,16,LR_DEFAULTCOLOR); // 小さいアイコン
	wcx.hCursor			= (HCURSOR)LoadImage(hInstance,MAKEINTRESOURCE(IDC_CURSOR)
							,IMAGE_CURSOR, 0, 0,LR_DEFAULTCOLOR); // カーソル
	wcx.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1); // ウィンドウ背景色
	wcx.lpszMenuName	= NULL;
	wcx.lpszClassName	= strClassName;

	if(!RegisterClassEx(&wcx)) return 0; // クラス登録

	// ウィンドウ作成
	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表示

	// メッセージループ
	MSG msg;
	while(GetMessage(&msg,NULL,0,0)) // WM_QUITが来ると終わり
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

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

やっぱりこっから下は特に変わっていません。
また分かりやすいように、ウィンドウクラスのメンバの順序を少し変えてみました。


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

アイコンのサイズを指定するときに、0,0で指定しています。こうするとリソースのサイズに自動的に合わせてくれるので便利です。 ただし小さいアイコンの場合、0,0にすると大きいアイコンをロードしてしまうので直接サイズを指定する必要があります。

さてついでといっては何ですが、今回は背景色も変えています。 前に比べると随分すっきりしています(アイコンやカーソルの部分は大きくなったけど(^_^;))。 これは「システム標準色」というのを使用したからで、これを使うときは、必ず1増やしてからHBRUSH型に変換しなければなりません。 また背景色に0(NULL)を指定すると、背景描画が行われず変な感じになります。ゲームなど背景を自分で描画するときなどに使用します。 システム標準色には以下のようなものがあります。

システム標準色
COLOR_SCROLLBAR スクロールバーの背景の色
COLOR_BACKGROUNDデスクトップの背景色。標準は緑っぽい。
COLOR_ACTIVECAPTION アクティブウィンドウのタイトルバー色。標準は青い
COLOR_INACTIVECAPTION非アクティブウィンドウのタイトルバー色。
COLOR_MENU メニューの色。
COLOR_WINDOWウィンドウの色。標準は白い。
COLOR_WINDOWFRAME 枠の色。標準は黒いです。
COLOR_MENUTEXT メニューの文字色。
COLOR_WINDOWTEXT ウィンドウの文字色。
COLOR_CAPTIONTEXT タイトルバーの文字色。
COLOR_ACTIVEBORDERアクティブウィンドウの太い枠の色。
COLOR_INACTIVEBORDER非アクティブウィンドウの太い枠の色。
COLOR_APPWORKSPACE MDIアプリケーションの背景色。標準はちょっと灰色。
COLOR_HIGHLIGHT 文字を選択したときの背景色。
COLOR_HIGHLIGHTTEXT 文字を選択したときの文字色。
COLOR_BTNFACE ボタンの上の色。
COLOR_BTNSHADOWボタンの陰の色。
COLOR_GRAYTEXT ボタンが選択できないときの文字色。
COLOR_BTNTEXT ボタンの文字色。
COLOR_INACTIVECAPTIONTEXT非アクティブウィンドウの文字色。
COLOR_BTNHIGHLIGHTボタン押してるときの色。
COLOR_3DDKSHADOW3Dオブジェクトの陰の色。
COLOR_3DLIGHT 3Dオブジェクトの色。
COLOR_INFOTEXT ツールチップの文字色。
COLOR_INFOBK ツールチップの背景色。標準は黄色っぽい。
COLOR_HOTLIGHT
COLOR_GRADIENTACTIVECAPTION
COLOR_GRADIENTINACTIVECAPTIONタイトルバーがグラデーションしてるときの右の方の色。

サンプルプログラムでは、クリックするごとに背景色を上から順番に変えていっています。実際にどんな色になっているかを確かめてみてください。また、早くクリックするとうまく変わらないので注意!

さて、今回でひとまずリソースが分かったでしょうか? といってもまだまだたくさんの種類がありますがひとまずここで一段落つけます。 来週からは何をやるかは未定です。ではヽ(^0^)ノ


★INDEX★

Copyright(C) へぽぽ