XTPWnd.cpp
上传用户:wangdan
上传日期:2022-06-30
资源大小:739k
文件大小:5k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. // XTPWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "XTPWnd.h"
  5. #include "../test1.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. //(CDC *pDC) => (CDC *pMemDC)
  13. int XDC2MemDC(CDC *pDC, CDC *pMemDC)
  14. {
  15. if (pDC && pMemDC && !pMemDC->m_hDC)
  16. {
  17. int cx, cy;
  18. cx = GetSystemMetrics(SM_CXSCREEN);
  19. cy = GetSystemMetrics(SM_CYSCREEN);
  20. CWnd *pWnd = pDC->GetWindow();
  21. if (pWnd)
  22. {
  23. CRect rect;
  24. pWnd->GetWindowRect(rect);
  25. cx = rect.Width();//GetSystemMetrics(SM_CXSCREEN);
  26. cy = rect.Height();//GetSystemMetrics(SM_CYSCREEN);
  27. }
  28. //CDC *pDC;
  29. pMemDC->CreateCompatibleDC(pDC);
  30. CBitmap bmp;
  31. bmp.CreateCompatibleBitmap(pDC, cx, cy);
  32. pMemDC->SelectObject(&bmp);
  33. pMemDC->BitBlt(0, 0, cx, cy, pDC, 0, 0, SRCCOPY);
  34. ::DeleteObject(bmp.m_hObject);
  35. return 1;
  36. }
  37. return 0;
  38. }
  39. //(CWnd *pWnd) => (CDC *pMemDC)
  40. // need: XDC2MemDC(...)
  41. int XCWnd2MemDC(CWnd *pWnd, CDC *pMemDC)
  42. {
  43. if (pWnd)
  44. return XDC2MemDC(pWnd->GetDC(), pMemDC);
  45. return 0;
  46. }
  47. CDC *XSaveCWnd(CWnd *pWnd)
  48. {
  49. if (pWnd)
  50. {
  51. CDC *pMemDC = new CDC;
  52. XCWnd2MemDC(pWnd, pMemDC);
  53. return pMemDC;
  54. }
  55. return NULL;
  56. }
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CXTPWnd
  59. CXTPWnd::CXTPWnd()
  60. {
  61. m_zoom = 1;
  62. m_pMemDC = NULL;
  63. }
  64. CXTPWnd::~CXTPWnd()
  65. {
  66. if (m_pMemDC)
  67. {
  68. m_pMemDC->DeleteDC();
  69. delete m_pMemDC;
  70. m_pMemDC = NULL;
  71. }
  72. }
  73. BEGIN_MESSAGE_MAP(CXTPWnd, CWnd)
  74. //{{AFX_MSG_MAP(CXTPWnd)
  75. ON_WM_LBUTTONDOWN()
  76. ON_WM_WINDOWPOSCHANGED()
  77. ON_WM_ACTIVATE()
  78. ON_WM_PAINT()
  79. //}}AFX_MSG_MAP
  80. END_MESSAGE_MAP()
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CXTPWnd message handlers
  83. void CXTPWnd::XCreate(LPCTSTR lpszWindowName)
  84. {
  85. if (m_hWnd) return;
  86. CreateEx(
  87. 0,//WS_EX_TOPMOST,
  88. AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),
  89. lpszWindowName,
  90. WS_POPUP,//|WS_BORDER,//WS_OVERLAPPEDWINDOW,
  91. 0, 0, 300, 180,
  92. NULL,
  93. NULL,
  94. NULL
  95. );
  96. CenterWindow();
  97. SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); 
  98. ShowWindow(SW_SHOW);
  99. }
  100. void CXTPWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  101. {
  102. // TODO: Add your message handler code here and/or call default
  103. PostMessage (WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
  104. CWnd::OnLButtonDown(nFlags, point);
  105. }
  106. //#include "TPWndDlg.h"
  107. //DEL void CXTPWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  108. //DEL {
  109. //DEL  // TODO: Add your message handler code here and/or call default
  110. //DEL 
  111. //DEL  //CTPWndDlg dlg;
  112. //DEL  //if (dlg.DoModal() == IDOK)
  113. //DEL  DestroyWindow();
  114. //DEL 
  115. //DEL  CWnd::OnRButtonDown(nFlags, point);
  116. //DEL }
  117. void CXTPWnd::XSaveScreen()
  118. {
  119. ShowWindow(SW_HIDE);
  120. //DeskTopWnd
  121. CWnd *pDeskTopWnd = new CWnd;
  122. pDeskTopWnd->Attach(::GetDesktopWindow());
  123. CDC *pMemDC = XSaveCWnd(pDeskTopWnd);
  124. if (m_pMemDC && pMemDC)
  125. {
  126. m_pMemDC->DeleteDC();
  127. delete m_pMemDC;
  128. }
  129. if (pMemDC)
  130. m_pMemDC = pMemDC;
  131. pDeskTopWnd->Detach();
  132. delete pDeskTopWnd;
  133. ShowWindow(SW_SHOW);
  134. }
  135. void CXTPWnd::XOwnerDraw()
  136. {
  137. CDC *pDC = GetDC();
  138. if (pDC && m_pMemDC)
  139. {
  140. CRect clientRect;
  141. CRect windowRect;
  142. GetClientRect(clientRect);
  143. GetWindowRect(windowRect);
  144. //放大镜
  145. {
  146. int cx, cy, cw, ch;
  147. cx = clientRect.left;
  148. cy = clientRect.top;
  149. cw = clientRect.Width();
  150. ch = clientRect.Height();
  151. int wx, wy, ww, wh;
  152. wx = windowRect.left;
  153. wy = windowRect.top;
  154. ww = windowRect.Width();
  155. wh = windowRect.Height();
  156. if (wx < 0)
  157. {
  158. ww += wx;
  159. cx = wx*(-1);
  160. cw += wx;
  161. wx *= -1;
  162. }
  163. if (wy < 0)
  164. {
  165. wh += wy;
  166. cy = wy*(-1);
  167. ch += wy;
  168. wy *= -1;
  169. }
  170. StretchBlt(
  171. pDC->m_hDC, cx, cy, cw, ch,
  172. m_pMemDC->m_hDC, wx, wy, ww/3, wh/3,
  173. SRCCOPY
  174. );
  175. }
  176. //画放大镜边
  177. CPen *pen = new CPen(PS_SOLID,1,GRAY);
  178. CPen *pOldPen = pDC->SelectObject(pen);
  179. pDC->MoveTo(clientRect.left, clientRect.top);
  180. pDC->LineTo(clientRect.right - 1, clientRect.top);
  181. pDC->LineTo(clientRect.right - 1, clientRect.bottom - 1);
  182. pDC->LineTo(clientRect.left, clientRect.bottom - 1);
  183. pDC->LineTo(clientRect.left, clientRect.top);
  184. delete pen;
  185. }
  186. }
  187. void CXTPWnd::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) 
  188. {
  189. CWnd::OnWindowPosChanged(lpwndpos);
  190. // TODO: Add your message handler code here
  191. XOwnerDraw();
  192. }
  193. void CXTPWnd::OnPaint() 
  194. {
  195. CPaintDC dc(this); // device context for painting
  196. XOwnerDraw();
  197. }
  198. void CXTPWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
  199. {
  200. CWnd::OnActivate(nState, pWndOther, bMinimized);
  201. // TODO: Add your message handler code here
  202. if (WA_ACTIVE == nState)
  203. XSaveScreen();
  204. }