LRESULT CDlg2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
enum _tagDragMask_t
{
_DragNull = 0x00,
_DragLeft = 0x01,
_DragTop = 0x02,
_DragRight = 0x04,
_DragBottom = 0x08,
};
static UINT m_bEnterDrag = FALSE; //拖拽标记
switch(message)
{
case(WM_NCHITTEST):
{
//鼠标位置
CPoint point(LOWORD(lParam), HIWORD(lParam));
//窗口位置
CRect rcRect;
GetWindowRect(&rcRect);
const int iCx = GetSystemMetrics(SM_CXDRAG);
const int iCy = GetSystemMetrics(SM_CYDRAG);
//特定区域作为标题栏
//if(xxx.PtInRect(point)
//return HTCAPTION;
//左上角
CRect rcTL(rcRect.left, rcRect.top, rcRect.left + iCx, rcRect.top + iCy);
if(rcTL.PtInRect(point))
{
return HTTOPLEFT;
}
//右下角
CRect rcRB(rcRect.right-iCx, rcRect.bottom-iCy, rcRect.right, rcRect.bottom);
if(rcRB.PtInRect(point))
{
return HTBOTTOMRIGHT;
}
//左边框
CRect rcLt(rcRect.left, rcRect.top, rcRect.left+iCx, rcRect.bottom);
if(rcLt.PtInRect(point))
{
return HTLEFT;
}
//上边框
CRect rcTt(rcRect.left, rcRect.top, rcRect.right, rcRect.top+iCx);
if(rcTt.PtInRect(point))
{
return HTTOP;
}
//下边框
CRect rcBt(rcRect.left, rcRect.bottom-iCy, rcRect.right, rcRect.bottom);
if(rcBt.PtInRect(point))
{
return HTBOTTOM;
}
//右边框
CRect rcRt(rcRect.right-iCx, rcRect.top, rcRect.right, rcRect.bottom);
if(rcRt.PtInRect(point))
{
return HTRIGHT;
}
break;
}
case(WM_NCLBUTTONDOWN):
{
UINT nHittest = (UINT)wParam;
//在边框时捕捉焦点
m_bEnterDrag = _DragNull;
if(nHittest == HTTOPLEFT) m_bEnterDrag |= _DragTop|_DragLeft;
if(nHittest == HTTOP) m_bEnterDrag |= _DragTop;
if(nHittest == HTLEFT) m_bEnterDrag |= _DragLeft;
if(nHittest == HTBOTTOMRIGHT) m_bEnterDrag |= _DragRight|_DragBottom;
if(nHittest == HTBOTTOM) m_bEnterDrag |= _DragBottom;
if(nHittest == HTRIGHT) m_bEnterDrag |= _DragRight;
if(m_bEnterDrag != _DragNull)
{
SetCapture();
}
break;
}
case(WM_LBUTTONUP):
case(WM_NCLBUTTONUP):
{
//鼠标抬起时释放焦点
if(m_bEnterDrag)
{
ReleaseCapture();
m_bEnterDrag = _DragNull;
}
break;
}
case(WM_MOUSEMOVE):
{
//拖拽操作
if(m_bEnterDrag != _DragNull)
{
CPoint point((SHORT)(LOWORD(lParam)), (SHORT)(HIWORD(lParam)));
ClientToScreen(&point);
CRect rcRect;
GetWindowRect(&rcRect);
if(m_bEnterDrag & _DragTop) { rcRect.top = point.y; } //top
if(m_bEnterDrag & _DragLeft) { rcRect.left = point.x; } //left
if(m_bEnterDrag & _DragRight) { rcRect.right = point.x; } //right
if(m_bEnterDrag & _DragBottom) { rcRect.bottom = point.y; } //bottom
MoveWindow(&rcRect);
}
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}