このページの内容 |
---|
どんなウインドウか |
ダウンロード |
実装方法 |
ありがたいスポンサー様 |
---|
特定のウインドウを選択するようなインターフェースが必要になることがある。このときによく用いられるのが 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++ もソース公開してくれよ、と思ってしまいます。