ウィンドウをドラッグ移動する際には、通常タイトルバー上でクリックし、そのままドラッグすればよい。
ではタイトルバーのないウィンドウをドラッグさせるにはどうすればよいだろうか。
ここでは、ウィンドウのクライアント領域上でクリックし、ドラッグすることで移動させる方法を実現する。
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など)を取得することができなくなってしまうので注意したい。
目次へ