MFC 对话框Border属性为none时通过鼠标自由拉伸窗口大小

来源:互联网 发布:nba2013 14总决赛数据 编辑:程序博客网 时间:2024/05/01 21:51

原文链接:http://blog.csdn.net/yuzhenxiong0823/article/details/8215326


在编写基于对话框的程序的时候,很喜欢将Border的属性设置为none,这样整个对话框看起来什么也没有(没有棱角也没有非客户区),这样你可以用一些好看的图片自己设置绘制非客户区和对话框边缘。但唯一不爽的是,对话框不能跟随鼠标移动,也不能通过鼠标改变大小。以下的方法会实现这些功能:

在对话框类当中添加一个变量m_nHitTest,

添加WM_MOUSEMOVE消息处理函数,在处理函数中添加以下代码

[cpp] view plaincopy
  1. CRect rect;   
  2. GetClientRect(&rect);   
  3. if(point.x <= rect.left+3)   
  4. {   
  5. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));   
  6. m_nHitTest = HTLEFT;   
  7. }   
  8. else if(point.x >= rect.right-3)   
  9. {   
  10. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));   
  11. m_nHitTest = HTRIGHT;   
  12. }   
  13. else if(point.y <= rect.top+3)   
  14. {   
  15. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));   
  16. m_nHitTest = HTTOP;   
  17. }   
  18. else if(point.y >= rect.bottom-3)   
  19. {   
  20. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));   
  21. m_nHitTest = HTBOTTOM;   
  22. }   
  23. else if(point.x <= rect.left+10 && point.y <= rect.top+10)   
  24. {   
  25. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));   
  26. m_nHitTest = HTTOPLEFT;   
  27. }   
  28. else if(point.x >= rect.right-10 && point.y <= rect.top+10)   
  29. {   
  30. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));   
  31. m_nHitTest = HTTOPRIGHT;   
  32. }   
  33. else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)   
  34. {   
  35. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));   
  36. m_nHitTest = HTBOTTOMLEFT;   
  37. }   
  38. else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)   
  39. {   
  40. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));   
  41. m_nHitTest = HTBOTTOMRIGHT;   
  42. }   
  43. else   
  44. {   
  45. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));   
  46. m_nHitTest = 0;   
  47. }  

添加WM_LBUTTONDOWN消息处理函数,在处理函数中添加以下代码

[cpp] view plaincopy
  1. if(m_nHitTest == HTTOP)   
  2. {   
  3. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));   
  4. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));   
  5. }   
  6. else if(m_nHitTest == HTBOTTOM)   
  7. {   
  8. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));   
  9. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));   
  10. }   
  11. else if(m_nHitTest == HTLEFT)   
  12. {   
  13. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));   
  14. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));   
  15. }   
  16. else if(m_nHitTest == HTRIGHT)   
  17. {   
  18. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));   
  19. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));   
  20. }   
  21. else if(m_nHitTest == HTTOPLEFT)   
  22. {   
  23. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));   
  24. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));   
  25. }   
  26. else if(m_nHitTest == HTTOPRIGHT)   
  27. {   
  28. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));   
  29. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));   
  30. }   
  31. else if(m_nHitTest == HTBOTTOMLEFT)   
  32. {   
  33. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));   
  34. SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));   
  35. }   
  36. else if(m_nHitTest == HTBOTTOMRIGHT)   
  37. {   
  38. SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));   
  39. SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));   
  40. }   
  41. else   
  42. {  
  43.   
  44. //实现对话框跟随鼠标移动  
  45.   
  46. ::SendMessage (GetSafeHwnd(), WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);   
  47. }  

0 0
原创粉丝点击