无边框的对话框的大小拖动实现

网上收集的:

void   CMyDlg::OnMouseMove(UINT   nFlags,   CPoint   point)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  if(m_nMyHitTest   ==   20)//当鼠标没有选择拖动类型的时候改变鼠标状态  
  {  
  CRect   rect;  
  CRect   staticRect;  
  this->GetWindowRect(&rect);  
  ScreenToClient(&rect);  
  HCURSOR   hCursor;  
  if(point.x   >   rect.left   &&   point.x   <   rect.right   &&    
  point.y   >   rect.top-FRAME_SPACE   &&   point.y   <   rect.top+FRAME_SPACE)//上边框区域  
  {    
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENS);  
  SetCursor(hCursor);  
  }  
  else   if(point.x   >   rect.left   &&   point.x   <   rect.right   &&    
  point.y   >   rect.bottom-FRAME_SPACE   &&   point.y   <   rect.bottom+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENS);  
  SetCursor(hCursor);  
  }  
  else   if(point.y   >   rect.top   &&   point.y   <   rect.bottom   &&    
  point.x   >   rect.left-FRAME_SPACE   &&   point.x   <   rect.left+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);  
  SetCursor(hCursor);  
  }  
  else   if(   point.y   >   rect.top   &&   point.y   <   rect.bottom   &&    
  point.x   >   rect.right-FRAME_SPACE   &&   point.x   <   rect.right+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);  
  SetCursor(hCursor);  
  }  
  GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&staticRect);  
  ScreenToClient(staticRect);  
  if(staticRect.PtInRect(point))  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENWSE);  
  SetCursor(hCursor);  
  }  
  }  
  CDialog::OnMouseMove(nFlags,   point);  
  }

void   CMyDlg::OnLButtonDown(UINT   nFlags,   CPoint   point)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  CRect   rect;  
  CRect   staticRect;  
  this->GetWindowRect(&rect);  
  ScreenToClient(&rect);  
  HCURSOR   hCursor;  
  if(point.x   >   rect.left   &&   point.x   <   rect.right   &&    
  point.y   >   rect.top-FRAME_SPACE   &&   point.y   <   rect.top+FRAME_SPACE)//上边框区域  
  {    
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENS);  
  SetCursor(hCursor);  
  SetCapture();  
  m_bChangeSize   =   TRUE;  
  m_nMyHitTest   =   HTTOP;  
  }  
  else   if(point.x   >   rect.left   &&   point.x   <   rect.right   &&    
  point.y   >   rect.bottom-FRAME_SPACE   &&   point.y   <   rect.bottom+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENS);  
  SetCursor(hCursor);  
  SetCapture();  
  m_bChangeSize   =   TRUE;  
  m_nMyHitTest   =   HTBOTTOM;  
  }  
  else   if(point.y   >   rect.top   &&   point.y   <   rect.bottom   &&    
  point.x   >   rect.left-FRAME_SPACE   &&   point.x   <   rect.left+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);  
  SetCursor(hCursor);  
  SetCapture();  
  m_bChangeSize   =   TRUE;  
  m_nMyHitTest   =   HTLEFT;  
  }  
  else   if(   point.y   >   rect.top   &&   point.y   <   rect.bottom   &&    
  point.x   >   rect.right-FRAME_SPACE   &&   point.x   <   rect.right+FRAME_SPACE)  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZEWE);  
  SetCursor(hCursor);  
  SetCapture();  
  m_bChangeSize   =   TRUE;  
  m_nMyHitTest   =   HTRIGHT;  
  }  
  GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&staticRect);  
  ScreenToClient(staticRect);  
  if(staticRect.PtInRect(point))  
  {  
  hCursor   =   AfxGetApp()->LoadStandardCursor(IDC_SIZENWSE);  
  SetCursor(hCursor);  
  SetCapture();  
  m_bChangeSize   =   TRUE;  
  m_nMyHitTest   =   HTBOTTOMRIGHT;  
  }  
  CDialog::OnLButtonDown(nFlags,   point);  
  }  
   
  void   CMyDlg::OnLButtonUp(UINT   nFlags,   CPoint   point)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  BOOL   bChangeStatic   =   TRUE;  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  if(m_bChangeSize)  
  {  
  m_bChangeSize   =   FALSE;  
  TRACE("OnLButtonUp\n");  
  ::ReleaseCapture();  
  CPoint   CurPoint;  
  CRect     DlgRect;  
  GetCursorPos(&CurPoint);  
  GetWindowRect(DlgRect);  
  CRect   rectTemp,rectTemp1;  
  GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&rectTemp);    
  GetDlgItem(IDC_STATIC_SIZE)->GetWindowRect(&rectTemp1);    
  ScreenToClient(rectTemp1);  
  bChangeStatic   =   rectTemp1.PtInRect(point);  
  int   RightWidth   =   DlgRect.right   -   rectTemp.right;  
  int   BottomWidth   =   DlgRect.bottom   -   rectTemp.bottom;  
  int   Width   =   rectTemp.right   -rectTemp.left;  
  int   Hight   =   rectTemp.bottom   -   rectTemp.top;  
   
  if(m_nMyHitTest   ==   HTLEFT)  
  {  
  if(abs(DlgRect.left   -   CurPoint.x)   >   FRAME_SPACE)  
  DlgRect.left   =   CurPoint.x;  
  }  
  else   if(m_nMyHitTest   ==   HTRIGHT)  
  {  
  if(abs(DlgRect.right   -   CurPoint.x)   >   FRAME_SPACE)  
  DlgRect.right   =   CurPoint.x;  
  }  
  else   if(m_nMyHitTest   ==   HTTOP)  
  {  
  if(abs(DlgRect.top   -   CurPoint.y)   >   FRAME_SPACE)  
  DlgRect.top   =   CurPoint.y;  
  }  
  else   if(m_nMyHitTest   ==   HTTOPLEFT)  
  {  
  DlgRect.top   =   CurPoint.y;  
  DlgRect.left   =   CurPoint.x;  
  }  
  else   if(m_nMyHitTest   ==   HTTOPRIGHT)  
  {  
  DlgRect.top   =   CurPoint.y;  
  DlgRect.right   =   CurPoint.x;  
  }  
  else   if(m_nMyHitTest   ==   HTBOTTOM)  
  {  
  if(abs(DlgRect.bottom   -   CurPoint.y)   >   FRAME_SPACE)    
  DlgRect.bottom   =   CurPoint.y;  
  }  
  else   if(m_nMyHitTest   ==   HTBOTTOMLEFT)  
  {  
  DlgRect.bottom   =   CurPoint.y;  
  DlgRect.left   =   CurPoint.x;  
  }  
  else   if(m_nMyHitTest   ==   HTBOTTOMRIGHT)  
  {  
  if(!bChangeStatic)  
  {  
  DlgRect.bottom   =   CurPoint.y;  
  DlgRect.right   =   CurPoint.x;  
  }  
  }  
  MoveWindow(DlgRect);  
  SetRedrawArea(DlgRect);  
  if(!bChangeStatic)  
  {  
  rectTemp.right   =   DlgRect.right   -   RightWidth;  
  rectTemp.left   =   rectTemp.right   -   Width;  
  rectTemp.bottom   =   DlgRect.bottom   -   BottomWidth;  
  rectTemp.top   =   rectTemp.bottom   -   Hight;  
  ScreenToClient(rectTemp);  
  GetDlgItem(IDC_STATIC_SIZE)->MoveWindow(rectTemp);  
  }  
  m_nMyHitTest   =   20; //恢复鼠标为未选择拖动状态  
  }  
  CDialog::OnLButtonUp(nFlags,   point);  
  }

posted @ 2009-01-13 15:10  小奇偶  阅读(993)  评论(0编辑  收藏  举报