Capture.cpp
上传用户:connie527
上传日期:2022-04-15
资源大小:4326k
文件大小:9k
源码类别:

行业应用

开发平台:

Visual C++

  1. // Capture.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "Capture.h"
  5. #include "CaptureDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //定义按钮状态
  12. enum ButtonState  {bsNormal,bsHot,bsDown};
  13. //按钮包装类
  14. class CDrawButton  
  15. {
  16. public:
  17. ButtonState m_State;           //按钮当前状态
  18. WNDPROC     m_OldProc;         //记录按钮的窗口函数
  19. int         m_Flag;            //是否释放关联按钮的CDrawButton对象
  20. static int  m_Style;           //按钮风格
  21. public:
  22. CDrawButton( )
  23. {
  24. m_State   = bsNormal;
  25. m_OldProc = NULL;
  26. m_Flag    = 0;
  27. }
  28. virtual ~CDrawButton()
  29. {
  30. m_State   = bsNormal;
  31. m_OldProc = NULL;
  32. };
  33. LRESULT OnPaint( HWND hWnd ) 
  34. {
  35. CWnd* pWnd = CWnd::FromHandle(hWnd);
  36. CPaintDC dc(pWnd);
  37. CString Text;
  38. CRect RC;
  39. CFont Font;
  40. CFont *pOldFont;
  41. CBrush Brush;
  42. CBrush *pOldBrush;
  43. CPoint PT(2,2);
  44. dc.SetBkMode( TRANSPARENT );
  45. Font.CreateFont( 12, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, 
  46. OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
  47. VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );
  48. pOldFont = dc.SelectObject( &Font );
  49. if( m_State == bsNormal)
  50. {
  51. if (m_Style==2)
  52. {
  53. CBitmap bmp;
  54. bmp.LoadBitmap(IDB_BKBUTTON);
  55. Brush.CreatePatternBrush(&bmp); 
  56. }
  57. else
  58. Brush.CreateSolidBrush( RGB( 200, 200, 200 ) );
  59. dc.SetTextColor( RGB( 80, 80, 80) );
  60. }
  61. else if( m_State == bsDown )
  62. {
  63. Brush.CreateSolidBrush( RGB( 160, 160, 160 ) );
  64. dc.SetTextColor( RGB( 50, 50, 250 ) );
  65. }
  66. else if( m_State == bsHot )
  67. {
  68. Brush.CreateSolidBrush( RGB( 100, 100, 180 ) );
  69. dc.SetTextColor( RGB( 250, 250, 0 ) );
  70. }
  71. pOldBrush = dc.SelectObject( &Brush );
  72. pWnd->GetClientRect( &RC );
  73. dc.RoundRect( &RC, PT );
  74. HRGN hRgn = CreateRectRgn( RC.left, RC.top, RC.right, RC.bottom );
  75. pWnd->SetWindowRgn( hRgn, TRUE );
  76. DeleteObject( hRgn );
  77. pWnd->GetWindowText(Text );
  78. dc.DrawText( Text, &RC, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
  79. dc.SelectObject( pOldFont );
  80. dc.SelectObject( pOldBrush );
  81. return TRUE;
  82. }
  83. LRESULT OnLButtonDown( HWND hWnd, UINT nFlags, CPoint point )
  84. {
  85. m_State = bsDown;
  86. SetCapture(hWnd);
  87. SetFocus(hWnd);
  88. InvalidateRect(hWnd,NULL,TRUE);
  89. return TRUE;
  90. }
  91. LRESULT OnLButtonUp( HWND hWnd, UINT nFlags, CPoint point )
  92. {
  93. if( m_State != bsNormal )
  94. {
  95. m_State = bsNormal;
  96. ReleaseCapture();
  97. InvalidateRect(hWnd,NULL,TRUE);
  98. SendMessage( GetParent(hWnd), WM_COMMAND, GetDlgCtrlID(hWnd), (LPARAM) (hWnd) );
  99. }
  100. return TRUE;
  101. }
  102. LRESULT LoseFocus(HWND  hWnd)
  103. {
  104. m_State = bsNormal;
  105. InvalidateRect(hWnd,NULL,TRUE);
  106. SendMessage( hWnd, WM_KILLFOCUS, (long)hWnd, 0);
  107. return TRUE;
  108. }
  109. LRESULT OnMouseMove(HWND hWnd, UINT nFlags, CPoint point ) {
  110. HRGN hRgn = CreateRectRgn( 0, 0, 0, 0 );
  111. GetWindowRgn( hWnd,hRgn );
  112. BOOL ret = PtInRegion( hRgn, point.x, point.y );
  113. if( ret ) 
  114. {
  115. if( m_State == bsDown) 
  116. return TRUE;
  117. if( m_State != bsHot ) 
  118. {
  119. m_State = bsHot;
  120. InvalidateRect(hWnd,NULL,TRUE);
  121. UpdateWindow(hWnd);
  122. SetCapture(hWnd);
  123. }
  124. else 
  125. {
  126. m_State = bsNormal;
  127. InvalidateRect(hWnd,NULL,TRUE);
  128. ReleaseCapture();
  129. }
  130. DeleteObject( hRgn );
  131. return TRUE;
  132. }
  133. };
  134. HHOOK  hWndHook ;
  135. int CDrawButton::m_Style = 1;
  136. LRESULT __stdcall DefWindowProc1(HWND hWnd,UINT Msg,WPARAM wParam, 
  137.  LPARAM lParam )
  138. {
  139. CPoint pt;
  140. CDrawButton *pButton=(CDrawButton*)GetWindowLong(hWnd,GWL_USERDATA);
  141. switch (Msg)
  142. {
  143. case WM_LBUTTONDBLCLK:  //屏蔽双击事件
  144. {
  145. return TRUE;
  146. break;
  147. }
  148. case WM_PAINT:
  149. {
  150. if (pButton->m_Style>0)
  151. return pButton->OnPaint( hWnd);
  152. else
  153. return  CallWindowProc(pButton->m_OldProc, hWnd,Msg,wParam,lParam);
  154. break;
  155. }
  156. case WM_LBUTTONDOWN:
  157. {
  158. pt.x = LOWORD(lParam);
  159. pt.y = HIWORD(lParam);
  160. if (pButton->m_Style>0)
  161. return pButton->OnLButtonDown( hWnd, 0, pt );
  162. else
  163. return  CallWindowProc(pButton->m_OldProc, hWnd,Msg,wParam,lParam);
  164. break;
  165. }
  166. case WM_LBUTTONUP:
  167. {
  168. pt.x = LOWORD(lParam);
  169. pt.y = HIWORD(lParam);
  170. if (pButton->m_Style>0)
  171. return pButton->OnLButtonUp( hWnd, 0,pt );
  172. else
  173. return  CallWindowProc(pButton->m_OldProc, hWnd,Msg,wParam,lParam);
  174. break;
  175. }
  176. case WM_MOUSEMOVE:
  177. {
  178. pt.x = LOWORD(lParam);
  179. pt.y = HIWORD(lParam);
  180. if (pButton->m_Style>0)
  181. return pButton->OnMouseMove(hWnd,0, pt);
  182. else
  183. return  CallWindowProc(pButton->m_OldProc, hWnd,Msg,wParam,lParam);
  184. break;
  185. }
  186. case WM_DESTROY:
  187. {
  188.     WNDPROC procOld=pButton->m_OldProc;
  189.  SetWindowLong(hWnd,GWL_WNDPROC,(long)procOld); //恢复原来的窗口函数
  190.  CWnd* pWnd = ::CWnd::FromHandle(hWnd);  //将按钮对象与句柄分离
  191.  if (pWnd)
  192.  {
  193. pWnd->Detach();
  194.  }
  195.  pButton->m_Flag = 1;
  196.      //LRESULT ret = ::CallWindowProc(procOld,hWnd,Msg,wParam,lParam);
  197.  return 1;//ret;
  198. }
  199. default :
  200. {
  201. break;
  202. }
  203. }
  204. return CallWindowProc(pButton->m_OldProc, hWnd, Msg, wParam, lParam );
  205. }
  206. //定义钩子函数
  207. LRESULT CALLBACK HOOKProc( int nCode, WPARAM wParam, LPARAM lParam )
  208. {
  209. PCWPSTRUCT wc = (PCWPSTRUCT) lParam;
  210. HWND  hWnd = wc->hwnd;
  211. if( hWnd ) 
  212. {
  213. char ClassName[MAX_PATH] = "";
  214. GetClassName( hWnd, ClassName, MAX_PATH );
  215. if( strcmp( ClassName, "Button" ) == 0 )
  216. {
  217. CWnd *pWnd = CWnd::FromHandle( hWnd );
  218. if ( pWnd->GetStyle() & BS_RADIOBUTTON )
  219. {
  220. return 1;
  221. }
  222. if ( pWnd->GetStyle() & BS_CHECKBOX )
  223. {
  224. return 1;
  225. }
  226. WNDPROC WndProc;
  227. WndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );
  228. CDrawButton *pButton=(CDrawButton*)GetWindowLong(hWnd,GWL_USERDATA);
  229. if (pButton != NULL&& pButton->m_Flag==1 )
  230. {
  231. SetWindowLong(hWnd,GWL_USERDATA,0);
  232. SetWindowLong( hWnd, GWL_WNDPROC, (LONG)pButton->m_OldProc );
  233. pButton->m_OldProc = NULL;
  234. delete pButton;
  235. }
  236. else if (pButton == NULL ) 
  237. {
  238. if( WndProc !=DefWindowProc1 )
  239. {
  240. pButton = new CDrawButton;
  241. pButton->m_OldProc = WndProc;
  242. SetWindowLong(hWnd,GWL_USERDATA,(long)pButton);
  243. WndProc =  (WNDPROC) SetWindowLong( hWnd, GWL_WNDPROC, (LONG) DefWindowProc1);
  244. }
  245. }
  246. }
  247. }
  248. return CallNextHookEx( hWndHook, nCode, wParam, lParam );
  249. }
  250. //安装钩子
  251. BOOL  RunHook( HMODULE hModule, DWORD dwThreadID)
  252. {
  253. hWndHook = SetWindowsHookEx(
  254. WH_CALLWNDPROC, (HOOKPROC) HOOKProc, hModule, dwThreadID );
  255. return TRUE;
  256. }
  257. //卸载钩子
  258. BOOL  StopHook()
  259. {
  260. UnhookWindowsHookEx(hWndHook);
  261. return TRUE;
  262. }
  263. /////////////////////////////////////////////////////////////////////////////
  264. // CCaptureApp
  265. BEGIN_MESSAGE_MAP(CCaptureApp, CWinApp)
  266. //{{AFX_MSG_MAP(CCaptureApp)
  267. // NOTE - the ClassWizard will add and remove mapping macros here.
  268. //    DO NOT EDIT what you see in these blocks of generated code!
  269. //}}AFX_MSG
  270. ON_COMMAND(ID_HELP, CWinApp::OnHelp)
  271. END_MESSAGE_MAP()
  272. /////////////////////////////////////////////////////////////////////////////
  273. // CCaptureApp construction
  274. CCaptureApp::CCaptureApp()
  275. {
  276. // TODO: add construction code here,
  277. // Place all significant initialization in InitInstance
  278. }
  279. /////////////////////////////////////////////////////////////////////////////
  280. // The one and only CCaptureApp object
  281. CCaptureApp theApp;
  282. /////////////////////////////////////////////////////////////////////////////
  283. // CCaptureApp initialization
  284. BOOL CCaptureApp::InitInstance()
  285. {
  286. AfxEnableControlContainer();
  287. ::CoInitialize(NULL);
  288. // Standard initialization
  289. // If you are not using these features and wish to reduce the size
  290. //  of your final executable, you should remove from the following
  291. //  the specific initialization routines you do not need.
  292. #ifdef _AFXDLL
  293. Enable3dControls(); // Call this when using MFC in a shared DLL
  294. #else
  295. Enable3dControlsStatic(); // Call this when linking to MFC statically
  296. #endif
  297. //换肤
  298. HINSTANCE hModule = GetModuleHandle( NULL );
  299. RunHook( hModule, GetCurrentThreadId() );
  300. CCaptureDlg dlg;
  301. m_pMainWnd = &dlg;
  302. int nResponse = dlg.DoModal();
  303. if (nResponse == IDOK)
  304. {
  305. // TODO: Place code here to handle when the dialog is
  306. //  dismissed with OK
  307. }
  308. else if (nResponse == IDCANCEL)
  309. {
  310. // TODO: Place code here to handle when the dialog is
  311. //  dismissed with Cancel
  312. }
  313. ::CoUninitialize();
  314. // Since the dialog has been closed, return FALSE so that we exit the
  315. //  application, rather than start the application's message pump.
  316. return FALSE;
  317. }
  318. int CCaptureApp::ExitInstance() 
  319. {
  320. StopHook();
  321. return CWinApp::ExitInstance();
  322. }