zoukankan      html  css  js  c++  java
  • MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化

    无边框窗体如何实现用鼠标拖动窗体边缘实现窗体大小变动呢?下面介绍一种方法,通过以下几个步骤即可实现:

    1.实现WM_NCHITTEST消息,实现四条边框的模拟

    2.实现WM_NCLBUTTONDOWN,发送窗体拖曳变化的消息

     

    具体阐述如下:

    1.实现WM_NCHITTEST消息,实现四条边框的模拟

    参考代码如下:

    1. LRESULT CNoBorderWndChangeSizeDlg::OnNcHitTest(CPoint point)  
    2. {  
    3.     // TODO: 在此添加消息处理程序代码和/或调用默认值     
    4.     CRect rect;  
    5.     GetWindowRect(&rect);  
    6.     CRect rect1 = rect;  
    7.     rect1.DeflateRect(10, 10, -10, -10);  
    8.     rect1.NormalizeRect();  
    9.     if (point.x <= rect.left+3)  
    10.         return HTLEFT;  
    11.     else if (point.x >= rect.right-3)  
    12.         return HTRIGHT;  
    13.     else if (point.y <= rect.top+3)  
    14.         return HTTOP;  
    15.     else if (point.y >= rect.bottom-3)  
    16.         return HTBOTTOM;  
    17.     else if (point.x <= rect.left+10 && point.y <= rect.top+10)  
    18.         return HTTOPLEFT;  
    19.     else if (point.x >= rect.right-10 && point.y <= rect.top+10)  
    20.         return HTTOPRIGHT;  
    21.     else if (point.x <= rect.left+10 && point.y >= rect.bottom-10)  
    22.         return HTBOTTOMLEFT;  
    23.     else if (point.x >= rect.right-10 && point.y >= rect.bottom-10)  
    24.         return HTBOTTOMRIGHT;  
    25.     else if (!rect.IsRectEmpty())  
    26.     {  
    27.         LRESULT uRet = CWnd::OnNcHitTest(point);  
    28.         uRet = (uRet == HTCLIENT) ? HTCAPTION : uRet;  
    29.         return uRet;  
    30.     }  
    31.     else  
    32.     {  
    33.         return CWnd::OnNcHitTest(point);  
    34.     }  
    35.     return 0;  
    36. }  

    2.实现WM_NCLBUTTONDOWN,发送窗体拖曳变化的消息

    1. void CNoBorderWndChangeSizeDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)  
    2. {  
    3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
    4.     if (nHitTest == HTTOP)  
    5.     {         
    6.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));  
    7.     }  
    8.     else if (nHitTest == HTBOTTOM)  
    9.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));  
    10.     else if (nHitTest == HTLEFT)  
    11.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));  
    12.     else if (nHitTest == HTRIGHT)  
    13.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));  
    14.     else if (nHitTest == HTTOPLEFT)  
    15.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));  
    16.     else if (nHitTest == HTTOPRIGHT)  
    17.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));  
    18.     else if (nHitTest == HTBOTTOMLEFT)  
    19.         SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));  
    20.     else if (nHitTest == HTBOTTOMRIGHT)  
    21.         SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));  
    22.     else if (nHitTest==HTCAPTION)  
    23.         SendMessage(WM_SYSCOMMAND, SC_MOVE | 4, MAKELPARAM(point.x, point.y));  
    24. }  

    通常,使用上述的代码即可实现要求。

     

    我们进行一下扩展。在窗体大小发生变化时,有两种表现形式:一种是出现虚线框,一种没有。这个选择依赖于操作系统,你可以右击桌面/属性/外观/效果中通过选择或取消“拖动时显示窗口内容”来表现这两种形式。那么如何在程序中实现而不依赖于当前机器的设置呢(这里的意思是不依赖手动选择“拖动时显示窗口内容”项),我们可以在OnNcLButtonDown函数中通过加入如下的代码实现:

     

    1. if(nHitTest == HTTOP)  
    2. {         
    3.     SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, TRUE, NULL, 0);  
    4.     SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));  
    5.     SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, FALSE, NULL, 0);  
    6. }  

    这段代码意思是在拖动上边缘动作之前,设置“拖动时显示窗口内容”,当该动作结束后,恢复原来的设置。当然,更好的做法是你首先获取机器当前的选项是什么,函数依旧是SystemParametersInfo,只是选项变化,具体查看MSDN即可。

    (文章中的有些代码参考了网上的代码,整理的匆忙,忘记出处了,再找时候有很多地方都有该代码,也不知道源头是哪里,请原作者见谅)

  • 相关阅读:
    系统使用 aspose.cell , 使得ashx第一次访问会变很慢
    aspx页面生成html
    SQL Server 监控 使用sp_trace_create
    IE6 IE7: div中table宽度100%导致的宽度问题
    VSTO Word2003 添加菜单栏, 添加工具栏
    mysql主主同步的配置
    linux永久添加静态路由有两种方法
    centos 7 进入单用户系统并且更改所有系统文件
    rabbitmq-3.7.2编译安装全过程
    linux centos 升级 make 4.2
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318783.html
Copyright © 2011-2022 走看看