• 无边框窗口实现拖拉效果


     实现效果需要处理以下这三个消息:

    WM_NCHITTEST  WM_SETCURSOR  WM_NCLBUTTONDOWN 

    UINT CXXXDlg::OnNcHitTest(UINT nHitTest, CPoint point)
    ...{
     // TODO: 在此添加消息处理程序代码和/或调用默认值
     CRect rect;
     CRect rect1;
     GetWindowRect(&rect);
     rect1 = rect;
     rect1.DeflateRect(10, 10, -10, -10);
     rect1.NormalizeRect();

     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;
     else if(!rect.IsRectEmpty())
     {
      LRESULT uRet = CWnd::OnNcHitTest(point);
      uRet = (uRet == HTCLIENT) ? HTCAPTION : uRet;
      return uRet;
     }
     else
     {
      return CWnd::OnNcHitTest(point);
     }
        return 0;
    // return CWnd::OnNcHitTest(point);
    }


    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 CEditWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
    {
     // TODO: 在此添加消息处理程序代码和/或调用默认值
       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));
       else if(nHitTest==HTCAPTION)
      SendMessage(WM_SYSCOMMAND, SC_MOVE | 4, MAKELPARAM(point.x, point.y));
     //CWnd::OnNcLButtonDown(nHitTest, point);
    }


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mynamelj/archive/2006/12/16/1445567.aspx

  • 相关阅读:
    只因写了一段爬虫,公司200多人被抓!
    中国顶级程序员图鉴
    漫画 | 外行对程序员误会有多深!
    关于深夜技术事故纪实录的若干问题回复
    富士康14跳被我赶上了,流水线车间真的没有梦想 | 十年系列
    祖国和我们小山村的希望
    互联网从此没有 BAT
    程序员,职场上请远离这种人!
    HTML5漂亮实用的电子书
    这个jQuery导航菜单怎么样
  • 原文地址:https://www.cnblogs.com/carl2380/p/1924647.html
Copyright © 2020-2023  润新知