ウインドウの移動位置を固定する方法は次の通りです。(戻る)
- WM_NCLBUTTONDOWN メッセージで HTCAPTION の処理を無視する。
今回のサンプルでは、ウインドウのタイトルバーでウインドウが絶対に移動できなくなります。
時計ソフトなどのミニソフトなどの移動位置を固定したいときに使えます。
プロトタイプ宣言
BOOL SetForegroundWindow( HWND hWnd // ウインドウのハンドル );
サンプル
// ウインドウの移動位置の固定 BOOL WindowMoveLock( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if ( uMsg == WM_NCLBUTTONDOWN ){ if ( wParam == HTCAPTION ){ SetForegroundWindow( hWnd ); return TRUE; } } UNREFERENCED_PARAMETER( lParam ); return FALSE; }
使い方1(ウインドウ・プロシージャ)
// break 付きのキーワード #define CASE break;case #define DEFAULT break;default // ウインドウ・プロシージャの関数 LRESULT CALLBACK mainWindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if ( WindowMoveLock(hWnd,uMsg,wParam,lParam) ){ return 0; } switch ( uMsg ){ CASE WM_CLOSE: DestroyWindow( hWnd ); CASE WM_DESTROY: PostQuitMessage( 0 ); DEFAULT: return DefWindowProc( hWnd, uMsg, wParam, lParam ); } return 0; }
- ウインドウ・プロシージャで使うときは、WindowMoveLock 関数が実行されたら 0 を返します。
- 上記の使い方でウインドウはタイトルバーで絶対に移動できなくなります。
- なお、WindowMoveLock 関数を実行しなければ通常と同じくウインドウが移動可能。
使い方2(ダイアログ・プロシージャ)
// break 付きのキーワード #define CASE break;case #define DEFAULT break;default // ダイアログ・プロシージャの関数 BOOL CALLBACK mainDialogProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { if ( WindowMoveLock(hDlg,uMsg,wParam,lParam) ){ return TRUE; } switch ( uMsg ){ CASE WM_CLOSE: EndDialog( hDlg, IDOK ); DEFAULT: return FALSE; } return TRUE; }
- ダイアログ・プロシージャで使うときは、WindowMoveLock 関数が実行されたら TRUE を返します。
- 上記の使い方でウインドウはタイトルバーで絶対に移動できなくなります。
- なお、WindowMoveLock 関数を実行しなければ通常と同じくウインドウが移動可能。
関連記事
- 画面中央にウインドウを移動
- 画面隅にウインドウを移動
- 画面端にウインドウを移動
- 画面9箇所にウインドウを移動
- ウインドウの移動範囲を制御
- ウインドウの移動位置を固定
※コメント投稿者のブログIDはブログ作成者のみに通知されます