为了拖动控件的大小,我重载了OnNcHitTest,只想它向下、向右、右下拖动。
代码如下:
LRESULT CGridCtrl::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default

CRect rect;
GetClientRect(&rect);
CPoint pt =point;
ScreenToClient(&pt);
int nFrame=3;
rect.DeflateRect(nFrame,nFrame);
if (!rect.PtInRect(pt))

//  if (pt.x<=nFrame && pt.y>=rect.bottom-nFrame)
//  {
//  // return HTBOTTOMLEFT; //左下角拖动大小
//  }
//  else if (pt.x<=nFrame && pt.y<=nFrame)
//  {
//  // return HTTOPLEFT; //左上角拖动大小
//  }
//  else if (pt.x>=rect.right-nFrame && pt.y<=nFrame)
//  {
//  // return HTTOPRIGHT; //右上角拖动大小
//  }
if (pt.x>=rect.right-nFrame && pt.y>=rect.bottom-nFrame)
{
return HTBOTTOMRIGHT; //右下角拖动大小
//HitFlag=1;
}
//  else if (pt.x<=nFrame)
//  {
//  // return HTLEFT; //屏蔽向左拖动大小
//  }
//  else if (pt.y<=nFrame)
//  {
// 
//  // return HTTOP; //屏蔽向上拖动大小
//  }
else if (pt.y>=rect.bottom-nFrame)
{
DWORD style = GetWindowLong(m_hWnd, GWL_STYLE);
if ((style & WS_HSCROLL)==0) //未出现垂直滚动条
{
//HitFlag=1;
return HTBOTTOM; //向右拖动大小
}
}
else if (pt.x>=rect.right-nFrame)
{
DWORD style = GetWindowLong(m_hWnd, GWL_STYLE);
if ((style & WS_VSCROLL)==0) //未出现水平滚动条
{
//HitFlag=1;
return HTRIGHT; //向下拖动大小
}
}
}
//  else
//  {
//  // return HTCAPTION; //拖动位置
//  }

return CWnd::OnNcHitTest(point);
}出现了一个问题,在我的PC上,拖动完成后,控件才会改变大小,即拖动时,只有外框在移动,控件没有移动,鼠标左键UP后,控件更新大小;但是,在其他的PC上,一边拖动,控件大小随即改变,不是在鼠标右键UP后。请问:这时怎么回事?怎么修改成第一种情况?

解决方案 »

  1.   

    SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, TRUE, NULL, SPIF_SENDWININICHANGE);
    这个意思?
      

  2.   

    谢谢2位,确实如此。SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, FALSE, NULL, SPIF_SENDWININICHANGE);即可满足第一种情况。
    另外想请问,在向下或者向右拖动时,会有这样的情况:滚动条出现时,不能拖动滚动条,鼠标上去就会显示可以拖动控件,不能点击滚动条,怎么解决?我目前是如果发现滚动条,则不允许拖动控件,可以右下角拖动来满足左右拖动。