一直没有实现,最后50分啦
希望你帮我解决:提供一个最简单的无边框对话框能用鼠标拖动来调整窗体大小的代码或者指正我看下我的代码有什么问题任一都可
以下是我测试的关键代码:按网上的相关文章,我自己按一个方式来实现,
1、将资源对话框的border设置为none
2、响应 WM_NCHITTEST WM_SETCURSOR WM_NCLBUTTONDOWN 这三个消息。消息处理函数:UINT CXXXDlg::OnNcHitTest(UINT nHitTest, CPoint point)
{
CRect rect;
GetWindowRect(&rect);
if(point.x <= rect.left+3)
return HTLEFT;
else if(point.x >= rect.right-3)
return HTRIGHT;
else if(point.y <= rect.top+3)
return HTTOP;
else if(point.y >= rect.bottom-3)
return HTBOTTOM;
else if(point.x <= rect.left+10 && point.y <= rect.top+10)
return HTTOPLEFT;
else if(point.x >= rect.right-10 && point.y <= rect.top+10)
return HTTOPRIGHT;
else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)
return HTBOTTOMLEFT;
else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)
return HTBOTTOMRIGHT;
return 0;
}
BOOL CXXXDlg::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{
if(nHitTest == HTCAPTION || nHitTest == HTSYSMENU ||
nHitTest == HTMENU || nHitTest == HTCLIENT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
}
else if(nHitTest == HTTOP || nHitTest == HTBOTTOM)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));
}
else if(nHitTest == HTLEFT || nHitTest == HTRIGHT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));
}
else if(nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMRIGHT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));
}
else if(nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMLEFT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));
}
else
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
}
}
void CXXXDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if(nHitTest == HTTOP)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOM)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTRIGHT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTTOPLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTTOPRIGHT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOMLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOMRIGHT)
SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
}
不过我发现鼠标在移动到窗体的边缘时,并不会出现可拖放的鼠标样式,而且也改变不了窗体大小
于是我把该窗体的Client Edge设置 为true,这样,就可以实现理想的效果了。可是这样的问题是窗体会有一个很明显的边,很难看,既然打算用无边框的窗体,那么这个边还是不打算设置谁有办法解决这个问题?????不要边,却能实现窗体大小的调整?
希望你帮我解决:提供一个最简单的无边框对话框能用鼠标拖动来调整窗体大小的代码或者指正我看下我的代码有什么问题任一都可
以下是我测试的关键代码:按网上的相关文章,我自己按一个方式来实现,
1、将资源对话框的border设置为none
2、响应 WM_NCHITTEST WM_SETCURSOR WM_NCLBUTTONDOWN 这三个消息。消息处理函数:UINT CXXXDlg::OnNcHitTest(UINT nHitTest, CPoint point)
{
CRect rect;
GetWindowRect(&rect);
if(point.x <= rect.left+3)
return HTLEFT;
else if(point.x >= rect.right-3)
return HTRIGHT;
else if(point.y <= rect.top+3)
return HTTOP;
else if(point.y >= rect.bottom-3)
return HTBOTTOM;
else if(point.x <= rect.left+10 && point.y <= rect.top+10)
return HTTOPLEFT;
else if(point.x >= rect.right-10 && point.y <= rect.top+10)
return HTTOPRIGHT;
else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)
return HTBOTTOMLEFT;
else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)
return HTBOTTOMRIGHT;
return 0;
}
BOOL CXXXDlg::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{
if(nHitTest == HTCAPTION || nHitTest == HTSYSMENU ||
nHitTest == HTMENU || nHitTest == HTCLIENT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
}
else if(nHitTest == HTTOP || nHitTest == HTBOTTOM)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));
}
else if(nHitTest == HTLEFT || nHitTest == HTRIGHT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));
}
else if(nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMRIGHT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));
}
else if(nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMLEFT)
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));
}
else
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
}
}
void CXXXDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if(nHitTest == HTTOP)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOM)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTRIGHT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTTOPLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTTOPRIGHT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOMLEFT)
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
else if(nHitTest == HTBOTTOMRIGHT)
SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
}
不过我发现鼠标在移动到窗体的边缘时,并不会出现可拖放的鼠标样式,而且也改变不了窗体大小
于是我把该窗体的Client Edge设置 为true,这样,就可以实现理想的效果了。可是这样的问题是窗体会有一个很明显的边,很难看,既然打算用无边框的窗体,那么这个边还是不打算设置谁有办法解决这个问题?????不要边,却能实现窗体大小的调整?
示例工程下载:
http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/18%20%E6%97%A0%E8%BE%B9%E6%A1%86%E7%AA%97%E5%8F%A3%E5%AE%9E%E7%8E%B0%E6%8B%96%E6%8B%89%E6%95%88%E6%9E%9C.zip阿弥陀佛!UINT CDemoDlg::OnNcHitTest(CPoint point)
{
CRect rect;
GetWindowRect(&rect);
if(point.x <= rect.left+3)
return HTLEFT;
else if(point.x >= rect.right-3)
return HTRIGHT;
else if(point.y <= rect.top+3)
return HTTOP;
else if(point.y >= rect.bottom-3)
return HTBOTTOM;
else if(point.x <= rect.left+10 && point.y <= rect.top+10)
return HTTOPLEFT;
else if(point.x >= rect.right-10 && point.y <= rect.top+10)
return HTTOPRIGHT;
else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)
return HTBOTTOMLEFT;
else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)
return HTBOTTOMRIGHT;
return CDialog::OnNcHitTest(point);
}
{
// TODO: Add your message handler code here and/or call default
switch(mMouseStates)
{
case HTLEFT:
case HTRIGHT:
::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
break;
case HTTOP:
case HTBOTTOM:
::SetCursor(LoadCursor(NULL, IDC_SIZENS));
break;
case HTTOPLEFT:
case HTBOTTOMRIGHT:
::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
break;
case HTTOPRIGHT:
case HTBOTTOMLEFT:
::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
break;
default:
::SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
}
if (mMouseStates == HTTOP)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTBOTTOM)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTLEFT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTRIGHT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTTOPLEFT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTBOTTOMRIGHT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTTOPRIGHT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
else if (mMouseStates == HTBOTTOMLEFT)
PostMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
else
{
CRect rect;
GetClientRect(&rect);
rect.bottom = FRAME_TOP_SIZE;
if(rect.PtInRect(point))
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
}
CDialog::OnLButtonDown(nFlags, point);
}void CMyFrameDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(mEnableWindowSize && !IsZoomed())
{
CRect rect;
GetClientRect(&rect);
if (point.x <= rect.left + 5 && point.y <= rect.top + 5)
mMouseStates = HTTOPLEFT;
else if (point.x >= rect.right - 5 && point.y >= rect.bottom - 5)
mMouseStates = HTBOTTOMRIGHT;
else if (point.x >= rect.right - 5 && point.y <= rect.top + 5)
mMouseStates = HTTOPRIGHT;
else if (point.x <= rect.left + 5 && point.y >= rect.bottom - 5)
mMouseStates = HTBOTTOMLEFT;
else if (point.x <= rect.left + 5)
mMouseStates = HTLEFT;
else if (point.x >= rect.right - 5)
mMouseStates = HTRIGHT;
else if (point.y <= rect.top + 5)
mMouseStates = HTTOP;
else if (point.y >= rect.bottom - 5)
mMouseStates = HTBOTTOM;
else
mMouseStates = 0;
switch (mMouseStates)
{
case HTLEFT:
case HTRIGHT:
::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
break;
case HTTOP:
case HTBOTTOM:
::SetCursor(LoadCursor(NULL, IDC_SIZENS));
break;
case HTTOPLEFT:
case HTBOTTOMRIGHT:
::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
break;
case HTTOPRIGHT:
case HTBOTTOMLEFT:
::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
break;
default:
::SetCursor(LoadCursor(NULL, IDC_ARROW));
break;
}
} CDialog::OnMouseMove(nFlags, point);
}void CMyFrameDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialog::OnSizing(fwSide, pRect);
if(mEnableWindowSize)
{
switch(fwSide)
{
case WMSZ_LEFT:
pRect->left = min(pRect->left, pRect->right - mSizeX);
break;
case WMSZ_RIGHT:
pRect->right = max(pRect->right, pRect->left + mSizeX);
break;
case WMSZ_TOP:
pRect->top = min(pRect->top, pRect->bottom - mSizeY);
break;
case WMSZ_BOTTOM:
pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
break;
case WMSZ_TOPLEFT:
pRect->left = min(pRect->left, pRect->right - mSizeX);
pRect->top = min(pRect->top, pRect->bottom - mSizeY);
break;
case WMSZ_BOTTOMRIGHT:
pRect->right = max(pRect->right, pRect->left + mSizeX);
pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
break;
case WMSZ_TOPRIGHT:
pRect->right = max(pRect->right, pRect->left + mSizeX);
pRect->top = min(pRect->top, pRect->bottom - mSizeY);
break;
case WMSZ_BOTTOMLEFT:
pRect->bottom = max(pRect->bottom, pRect->top + mSizeY);
pRect->left = min(pRect->left, pRect->right - mSizeX);
break;
default:
break;
}
}
// TODO: Add your message handler code here
}mSizeX,mSizeY是窗口最大宽高
mMouseStates 从何而来?
OnMouseMove()函数里面不是赋值了么
FRAME_TOP_SIZE这个定义上面边框的宽度,主要是为了鼠标在顶端一小部分矩形中拖动才有效,而不是不管拖动哪里都可以将界面移动,如果不需要else中PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));这一句就可以了mEnableWindowSize这个变量作用是区分窗口是否可以放大缩小,自己决定值我这个类是我程序所有对话框的基类,有的窗口需要放大缩小,有的不需要
mSizeX,mSizeY是对话框能缩放的最小值
问题在这嗯,十分的感谢 joey_zoy和大家。问题已经解决。
只是分太少了,挺不好意思的,非常感谢!