VC++の使い方

VC++の使い方 > VC++ Tips > GUIのチップス > ウインドウ選択 インターフェース
このページの内容
どんなウインドウか
ダウンロード
実装方法
ありがたいスポンサー様
All About ソフトウエアエンジニア
ネットで8%割引!自動車保険はアメリカンホーム・ダイレクト
人生の「チャンス」と「ピンチ」にモビット!
保険料が一生上がらない、保険料最大50%割引の一生涯の医療保険!

どんなウインドウか

特定のウインドウを選択するようなインターフェースが必要になることがある。このときによく用いられるのが SPY++ で用いられる次のようなインターフェースがあります。

SPY++のウインドウ選択インターフェース
SPY++のウインドウ選択インターフェース

これを自分のアプリケーションでもやってみよう作戦です。

ダウンロード

select_window.lzh(14.2KB) からどうぞ。ご自由に使ってやってください。サンプルの使用に関しての詳細は このサイトについて をご覧ください。

実装方法

窓アイコンやカーソルは、VC++ に付属している SPY++ からパクってきました。

スタティックウインドウのサブクラス化

アイコン上でクリックすると、マウスをキャプチャーして、マウスが動くたびに反応する必要があります。これをするためにはデフォルトの static ウインドウを使うだけではだめなので、アイコンを表示している static をサブクラス化します。

マウスダウンとアップに反応

サブクラス化したプロシージャのなかで、WM_LBUTTONDOWN と WM_LBUTTONUP に反応してやります。blnCapture はグローバルでもいいですが、このサンプルではプロシージャの中で static に宣言してやっています。

case WM_LBUTTONDOWN:
{
	// アイコン変更
	HINSTANCE hInst = GetModuleHandle(NULL);
	HICON hicon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FINDER_NOCURSOR));
	SendMessage(hWnd, STM_SETICON, (WPARAM)hicon, 0);

	// マウスをキャプチャー
	SetCapture(hWnd);
	blnCapture = TRUE;
	
	// カーソル変更
	HCURSOR hcursor = LoadCursor(hInst, MAKEINTRESOURCE(IDC_FINDER));
	SetCursor(hcursor);
	return 0;
}

case WM_LBUTTONUP:
	if(blnCapture)
	{
		// アイコン変更
		HINSTANCE hInst = GetModuleHandle(NULL);
		HICON hicon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_FINDER));
		SendMessage(hWnd, STM_SETICON, (WPARAM)hicon, 0);

		// キャプチャー解除
		ReleaseCapture();
		blnCapture = FALSE;

		// カーソル変更
		HCURSOR hcursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
		SetCursor(hcursor);
		
		return 0;
	}

カーソルの場所のウインドウを取得する

GetCursorPos を呼び出してから、WindowFromPoint を呼び出します。このままだと、static ウインドウのハンドルを取得できないので、ChildWindowFromPoint を呼び出してやります。ChildWindowFromPoint の結果が NULL の場合は、WindowFromPoint の戻り値を使うようにしてやります。

// カーソル場所のウインドウ取得
POINT pt;
GetCursorPos(&pt);
HWND hwndFind = WindowFromPoint(pt);
if(hwndFind)
{
	ScreenToClient(hwndFind, &pt);
	HWND hwndTmp2 = ChildWindowFromPoint(hwndFind, pt);
	if(hwndTmp2)
	{
		hwndFind = hwndTmp2;
	}
}

カーソル位置のウインドウをハイライトする

これは、VC++6 にある SPY のサンプルからそのまま拝借しました。SPY++ もソース公開してくれよ、と思ってしまいます。