タイトルバーのないウィンドウのドラッグ移動

ウィンドウをドラッグ移動する際には、通常タイトルバー上でクリックし、そのままドラッグすればよい。 ではタイトルバーのないウィンドウをドラッグさせるにはどうすればよいだろうか。
ここでは、ウィンドウのクライアント領域上でクリックし、ドラッグすることで移動させる方法を実現する。
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	m_bMoving = TRUE;
	SetCapture();
	m_pointOld = point;
	
	CDialog::OnLButtonDown(nFlags, point);
}

void CMyDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	if( m_bMoving == TRUE ) {
		// ドラッグ中だった場合
		m_bMoving = FALSE;
		::ReleaseCapture();	
	}
	
	CDialog::OnLButtonUp(nFlags, point);
}

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
	if( m_bMoving == TRUE ) {
		CRect rect;
		GetWindowRect(&rect);
		rect.left += (point.x - m_pointOld.x);
		rect.right += (point.x - m_pointOld.x);
		rect.top += (point.y - m_pointOld.y);
		rect.bottom += (point.y - m_pointOld.y);
		SetWindowPos(&wndTopMost, rect.left, rect.top,
		rect.right - rect.left, rect.bottom - rect.top,
		SWP_SHOWWINDOW);
	}

	CDialog::OnMouseMove(nFlags, point);

もっと簡単な方法もある。WM_NCHITTESTメッセージハンドラであるCWnd::OnNcHitTest関数を次のようにカスタマイズさせる。
	UINT CMyDlg::OnNcHitTest(CPoint point) 
	{
		// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
		UINT nHitTest = CDialog::OnNcHitTest(point);
		if( nHitTest == HTCLIENT )
			return HTCAPTION;
		else
			return nHitTest;

		//return CDialog::OnNcHitTest(point);
	}
ただし、この方法を使うとクライアント領域でのマウスメッセージ(WM_LBUTTONDOWNなど)を取得することができなくなってしまうので注意したい。

目次へ