MFC,无边框的对话框如何实现窗体大小调整。。。。。。。。。
一直没有实现,最后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,这样,就可以实现理想的效果了。可是这样的问题是窗体会有一个很明显的边,很难看,既然打算用无边框的窗体,那么这个边还是不打算设置
谁有办法解决这个问题?????不要边,却能实现窗体大小的调整?
...全文
相关推荐
MFC控件自适应窗体改变大小
**CDialogEx类**: 如果你的窗体是基于CDialogEx的,那么可以利用对话框资源中的DS_SETFONT标志,让所有控件的字体大小随对话框字体大小改变而自动调整。
MFC中子对话框的大小随tab控件的大小改变而改变
该项目实现MFC中子对话框随Tab控件大小动态调整的界面布局功能。通过CLayout类管理控件缩放与位置,结合OnSize消息响应,在窗口尺寸变化时自动重排子控件。核心类包括CBoxFrame和CEm
mfc根据窗口大小自动调整所有控件大小
标题“mfc根据窗口大小自动调整所有控件大小”所指的就是如何在MFC程序中实现这种动态布局。MFC提供了一种机制,叫做“布局管理器”(Layout Manager),用于处理控件的自动布局问题。
MFC 对话框中控件随对话框大小改变而改变
总结起来,实现MFC对话框控件随对话框大小改变的功能,关键在于覆盖`OnSize`函数,并在其中处理控件的位置和大小调整。通过自定义CDialog派生类,我们可以封装这个功能,使其易于使用。
VC中对话框窗体背景透明而控件不透明
为了确保对话框的背景在改变大小时仍然透明,需要处理 WM_NCPAINT 消息。在 CDialog 的派生类中覆盖 OnNcPaint 函数,并在其中绘制对话框的非客户区(如边框)。


界面
