MFC,无边框的对话框如何实现窗体大小调整。。。。。。。。。

s31628 2010-12-10 09:12:02
一直没有实现,最后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,这样,就可以实现理想的效果了。可是这样的问题是窗体会有一个很明显的边,很难看,既然打算用无边框的窗体,那么这个边还是不打算设置



谁有办法解决这个问题?????不要边,却能实现窗体大小的调整?
...全文
1016 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2010-12-10
  • 打赏
  • 举报
回复
建议换种放大和缩小的模式.然后千万要注意不要频繁出发刷新.
s31628 2010-12-10
  • 打赏
  • 举报
回复
刚你说“mSizeX,mSizeY是窗口最大宽高”,原来其实他是窗体可呗调整的最小大小
问题在这

嗯,十分的感谢 joey_zoy和大家。问题已经解决。
只是分太少了,挺不好意思的,非常感谢!
joey_zoy 2010-12-10
  • 打赏
  • 举报
回复
肯定是没有问题的,自己再调调吧
joey_zoy 2010-12-10
  • 打赏
  • 举报
回复
上面有些变量是我自己程序里面的定义
FRAME_TOP_SIZE这个定义上面边框的宽度,主要是为了鼠标在顶端一小部分矩形中拖动才有效,而不是不管拖动哪里都可以将界面移动,如果不需要else中PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));这一句就可以了

mEnableWindowSize这个变量作用是区分窗口是否可以放大缩小,自己决定值

我这个类是我程序所有对话框的基类,有的窗口需要放大缩小,有的不需要
mSizeX,mSizeY是对话框能缩放的最小值
s31628 2010-12-10
  • 打赏
  • 举报
回复
感谢2楼和大家的恢复,不过现在按2楼的方式,程序有问题,拖的时候很乱,一按下鼠标还没拖呢,就改变大小了,我不知道是不是这个 FRAME_TOP_SIZE 的定义??你怎么定义的?

还有,mEnableWindowSize 这个只有读取没有设置,应该是TRUE吧?

谢谢,添麻烦了,这么点分,都不好意思问了
s31628 2010-12-10
  • 打赏
  • 举报
回复
还有,FRAME_TOP_SIZE 你定义的是多少?
joey_zoy 2010-12-10
  • 打赏
  • 举报
回复
int mMouseStates;
OnMouseMove()函数里面不是赋值了么
向立天 2010-12-10
  • 打赏
  • 举报
回复
一楼的方法应该可以啊
Eleven 2010-12-10
  • 打赏
  • 举报
回复
上面那么多代码还没解决?
s31628 2010-12-10
  • 打赏
  • 举报
回复
问2楼:
mMouseStates 从何而来?
fandh 2010-12-10
  • 打赏
  • 举报
回复
是鼠标点击下,准备拉的时候,调用函数:SetCapture,这样,在MOVE中改变大小,可以用SetWindowPos ,改变完成后,调用ReleaseCapture 释放鼠标!
zzw820626 2010-12-10
  • 打赏
  • 举报
回复
提供个简单的想法,当鼠标移到窗口边缘的时候吧类型改为Client Edge,拖完再改回去。
joey_zoy 2010-12-10
  • 打赏
  • 举报
回复
重载OnLButtonDown,OnMouseMove,OnSizing

void CMyFrameDlg::OnLButtonDown(UINT nFlags, CPoint 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是窗口最大宽高
jacky_qiu 2010-12-10
  • 打赏
  • 举报
回复
添加以下代码即可,
示例工程下载:
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);
}


VC++ MFC 经典教程 - 基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4 11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 13.MFC_GDI_画文本和字体.mp4 14.MFC_GDI_备用对象和取消选定.mp4 15.MFC_Ruler.mp4 16.MFC_窗口滚动条.mp4 17.MFC_Accel.mp4 18.MFC_Accel(2).mp4 19.MFC_消息框.mp4 2.Windows_编程模型.mp4 20MFC_客户区鼠标消息.mp4 21.MFC_TicTac-1.mp4 22.MFC_TicTac-2.mp4 23.MFC_TicTac-3.mp4 24.MFC_鼠标滚轮.mp4 25.MFC_捕获鼠标.mp4 26.MFC_VisualKB-1.mp4 27.MFC_VisualKB-2.mp4 29.MFC_菜单.mp4 3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4 32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4 35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7种方法_A.mp4 37.MFC_对话框_访问控件_7种方法_B.mp4 38.MFC_对话框_访问控件_7种方法_C.mp4 39.MFC_对话框_复选框_单选钮.mp4 4.MFC_消息映射.mp4 40.MFC_模态对话框.mp4 41.MFC_非模态对话框.mp4 42.MFC_属性表.mp4 43.MFC_公用对话框.mp4 44.MFC_数组类-1.mp4 45.MFC_数组类-2.mp4 46.MFC_CArray.mp4 47.MFC_列表类.mp4 48.MFC_映射类.mp4 49.MFC_类型指针类.mp4 5.MFC_使用向导快速进行MFC程序设计.mp4 50.MFC_CFile.mp4 51.MFC_CArchive.mp4 52.MFC_四个对象四种方法.mp4 53. MFC_Ruler.mp4 54.MFC_Ruler.mp4 55.MFC_Ruler.mp4 56.MFC_SdiSquares.mp4 57.MFC_Scroll_Ruler.mp4 58.MFC_CHtmlView.mp4 59.MFC_CTreeView.mp4 6.MFC_字符集和TEXT宏.mp4 60.MFC_CListView.mp4 61.MFC_MdiSquares.mp4 62.MFC_动态拆分窗口.mp4 63.MFC_ToolBar.mp4 64.MFC_ToolBar_Ex13a.mp4 65.MFC_StatusBar.mp4 66.MFC_StatusBar_Ex13b.mp4 67.MFC_Rebar.mp4 68.MFC_EZPrint.mp4 69.MFC_Print_Bubble.mp4 7.MFC_建立应用程序.mp4 8.MFC_第一个MFC程序设计(不用向导).mp4 9.MFC_Windows_GDI_设备描述表类.mp4 数据结构与算法_C语言 01.swap.mp4 02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4 07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速排序.mp4 11.归并排序.mp4 12.顺序栈.mp4 13.顺序队列.mp4 14.链表的基本概念.mp4 15.单链表的基本运算.mp4 16.循环单链表.mp4 17.双向链表.mp4 18.链式栈.mp4 19.链式队列.mp4 20.基数排序.mp4 21.树.mp4 22.二叉树的存储表示与实现.mp4 23.二叉树的遍历.mp4 24.二叉查找树.mp4 25.红黑树.mp4 26.堆.mp4 27.堆排序.mp4 28.哈希表.mp4 29.图_邻接矩阵

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧