WinFinderCtl.cpp
上传用户:lwzh1970
上传日期:2007-01-01
资源大小:33k
文件大小:11k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // WinFinderCtl.cpp : Implementation of the CWinFinderCtrl OLE control class.
  2. #include "stdafx.h"
  3. #include "WinFinder.h"
  4. #include "WinFinderCtl.h"
  5. #include "WinFinderPpg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. IMPLEMENT_DYNCREATE(CWinFinderCtrl, COleControl)
  12. /////////////////////////////////////////////////////////////////////////////
  13. // Message map
  14. BEGIN_MESSAGE_MAP(CWinFinderCtrl, COleControl)
  15. //{{AFX_MSG_MAP(CWinFinderCtrl)
  16. ON_WM_LBUTTONDOWN()
  17. ON_WM_LBUTTONUP()
  18. ON_WM_MOUSEMOVE()
  19. ON_MESSAGE(WM_SETWFCALLBACK, OnSetWFCallback)
  20. //}}AFX_MSG_MAP
  21. ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)
  22. ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // Dispatch map
  26. BEGIN_DISPATCH_MAP(CWinFinderCtrl, COleControl)
  27. //{{AFX_DISPATCH_MAP(CWinFinderCtrl)
  28. DISP_PROPERTY_NOTIFY(CWinFinderCtrl, "dragging", m_bDragging, OnDraggingChanged, VT_BOOL)
  29. DISP_PROPERTY_NOTIFY(CWinFinderCtrl, "TargetWindow", m_targetWindow, OnTargetWindowChanged, VT_HANDLE)
  30. DISP_PROPERTY_EX_ID(CWinFinderCtrl, "hwnd", DISPID_HWND, GetHwnd, SetHwnd, VT_HANDLE)
  31. //}}AFX_DISPATCH_MAP
  32. DISP_FUNCTION_ID(CWinFinderCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
  33. END_DISPATCH_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // Event map
  36. BEGIN_EVENT_MAP(CWinFinderCtrl, COleControl)
  37. //{{AFX_EVENT_MAP(CWinFinderCtrl)
  38. // NOTE - ClassWizard will add and remove event map entries
  39. //    DO NOT EDIT what you see in these blocks of generated code !
  40. //}}AFX_EVENT_MAP
  41. END_EVENT_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // Property pages
  44. // TODO: Add more property pages as needed.  Remember to increase the count!
  45. BEGIN_PROPPAGEIDS(CWinFinderCtrl, 1)
  46. PROPPAGEID(CWinFinderPropPage::guid)
  47. END_PROPPAGEIDS(CWinFinderCtrl)
  48. /////////////////////////////////////////////////////////////////////////////
  49. // Initialize class factory and guid
  50. IMPLEMENT_OLECREATE_EX(CWinFinderCtrl, "WINFINDER.WinFinderCtrl.1",
  51. 0xdca2aa3, 0xc50f, 0x11d2, 0x95, 0x80, 0x20, 0xb3, 0x4e, 0xc1, 0, 0)
  52. /////////////////////////////////////////////////////////////////////////////
  53. // Type library ID and version
  54. IMPLEMENT_OLETYPELIB(CWinFinderCtrl, _tlid, _wVerMajor, _wVerMinor)
  55. /////////////////////////////////////////////////////////////////////////////
  56. // Interface IDs
  57. const IID BASED_CODE IID_DWinFinder =
  58. { 0xdca2aa1, 0xc50f, 0x11d2, { 0x95, 0x80, 0x20, 0xb3, 0x4e, 0xc1, 0, 0 } };
  59. const IID BASED_CODE IID_DWinFinderEvents =
  60. { 0xdca2aa2, 0xc50f, 0x11d2, { 0x95, 0x80, 0x20, 0xb3, 0x4e, 0xc1, 0, 0 } };
  61. /////////////////////////////////////////////////////////////////////////////
  62. // Control type information
  63. static const DWORD BASED_CODE _dwWinFinderOleMisc =
  64. OLEMISC_ACTIVATEWHENVISIBLE |
  65. OLEMISC_SETCLIENTSITEFIRST |
  66. OLEMISC_INSIDEOUT |
  67. OLEMISC_CANTLINKINSIDE |
  68. OLEMISC_RECOMPOSEONRESIZE;
  69. IMPLEMENT_OLECTLTYPE(CWinFinderCtrl, IDS_WINFINDER, _dwWinFinderOleMisc)
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CWinFinderCtrl::CWinFinderCtrlFactory::UpdateRegistry -
  72. // Adds or removes system registry entries for CWinFinderCtrl
  73. BOOL CWinFinderCtrl::CWinFinderCtrlFactory::UpdateRegistry(BOOL bRegister)
  74. {
  75. if (bRegister)
  76. return AfxOleRegisterControlClass(
  77. AfxGetInstanceHandle(),
  78. m_clsid,
  79. m_lpszProgID,
  80. IDS_WINFINDER,
  81. IDB_WINFINDER,
  82. TRUE,                       //  Insertable
  83. _dwWinFinderOleMisc,
  84. _tlid,
  85. _wVerMajor,
  86. _wVerMinor);
  87. else
  88. return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // Licensing strings
  92. static const TCHAR BASED_CODE _szLicFileName[] = _T("WinFinder.lic");
  93. static const WCHAR BASED_CODE _szLicString[] =
  94. L"Copyright (c) 1999 ";
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CWinFinderCtrl::CWinFinderCtrlFactory::VerifyUserLicense -
  97. // Checks for existence of a user license
  98. BOOL CWinFinderCtrl::CWinFinderCtrlFactory::VerifyUserLicense()
  99. {
  100. return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
  101. _szLicString);
  102. }
  103. /////////////////////////////////////////////////////////////////////////////
  104. // CWinFinderCtrl::CWinFinderCtrlFactory::GetLicenseKey -
  105. // Returns a runtime licensing key
  106. BOOL CWinFinderCtrl::CWinFinderCtrlFactory::GetLicenseKey(DWORD dwReserved,
  107. BSTR FAR* pbstrKey)
  108. {
  109. if (pbstrKey == NULL)
  110. return FALSE;
  111. *pbstrKey = SysAllocString(_szLicString);
  112. return (*pbstrKey != NULL);
  113. }
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CWinFinderCtrl::CWinFinderCtrl - Constructor
  116. // Default callback function, does nothing
  117. int DefaultWindowFinderSelectedCallback(HWND hWnd)
  118. {
  119. return 0;
  120. }
  121. CWinFinderCtrl::CWinFinderCtrl()
  122. {
  123. InitializeIIDs(&IID_DWinFinder, &IID_DWinFinderEvents);
  124. // TODO: Initialize your control's instance data here.
  125. m_bDragging = FALSE;
  126. m_targetWindow = 0;
  127. m_pfnWindowSelectedCallback = DefaultWindowFinderSelectedCallback;
  128. }
  129. /////////////////////////////////////////////////////////////////////////////
  130. // CWinFinderCtrl::~CWinFinderCtrl - Destructor
  131. CWinFinderCtrl::~CWinFinderCtrl()
  132. {
  133. // TODO: Cleanup your control's instance data here.
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. // CWinFinderCtrl::OnDraw - Drawing function
  137. void CWinFinderCtrl::OnDraw(
  138. CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
  139. {
  140. // TODO: Replace the following code with your own drawing code.
  141. // pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
  142. // pdc->Ellipse(rcBounds);
  143. HICON icon;
  144. if (!m_bDragging)
  145. icon = AfxGetApp()->LoadIcon(IDI_WINFINDER);
  146. else
  147. // If the user is dragging the wheel thingy, don't show it
  148. icon = AfxGetApp()->LoadIcon(IDI_WINFINDER_DRAG);
  149. pdc->DrawIcon(0, 0, icon);
  150. }
  151. /////////////////////////////////////////////////////////////////////////////
  152. // CWinFinderCtrl::DoPropExchange - Persistence support
  153. void CWinFinderCtrl::DoPropExchange(CPropExchange* pPX)
  154. {
  155. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  156. COleControl::DoPropExchange(pPX);
  157. // TODO: Call PX_ functions for each persistent custom property.
  158. }
  159. /////////////////////////////////////////////////////////////////////////////
  160. // CWinFinderCtrl::OnResetState - Reset control to default state
  161. void CWinFinderCtrl::OnResetState()
  162. {
  163. COleControl::OnResetState();  // Resets defaults found in DoPropExchange
  164. // TODO: Reset any other control state here.
  165. }
  166. /////////////////////////////////////////////////////////////////////////////
  167. // CWinFinderCtrl::AboutBox - Display an "About" box to the user
  168. void CWinFinderCtrl::AboutBox()
  169. {
  170. CDialog dlgAbout(IDD_ABOUTBOX_WINFINDER);
  171. dlgAbout.DoModal();
  172. }
  173. /////////////////////////////////////////////////////////////////////////////
  174. // CWinFinderCtrl message handlers
  175. void CWinFinderCtrl::OnDraggingChanged() 
  176. {
  177. SetModifiedFlag();
  178. }
  179. // Left button down, start capturing
  180. void CWinFinderCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
  181. {
  182. SetCapture();
  183. m_bDragging = TRUE;
  184. SetCursor(AfxGetApp()->LoadCursor(IDC_DRAGGING));
  185. Invalidate();
  186. COleControl::OnLButtonDown(nFlags, point);
  187. }
  188. // Left button up, stop capturing
  189. void CWinFinderCtrl::OnLButtonUp(UINT nFlags, CPoint point) 
  190. {
  191. CRect rc;
  192. ReleaseCapture();
  193. m_bDragging = FALSE;
  194. Invalidate();
  195. DrawWindowFrame((HWND)m_targetWindow);
  196. ::GetWindowRect((HWND)m_targetWindow, &rc);
  197. ::InvalidateRect((HWND)m_targetWindow, rc, TRUE);
  198. COleControl::OnLButtonUp(nFlags, point);
  199. }
  200. void CWinFinderCtrl::OnTargetWindowChanged() 
  201. {
  202. // TODO: Add notification handler code
  203. SetModifiedFlag();
  204. }
  205. void CWinFinderCtrl::OnMouseMove(UINT nFlags, CPoint point) 
  206. {
  207. if (!m_bDragging)
  208. return;         // Not dragging
  209. SetWindowText("WindowFinderCtrl");
  210. CDC dc;             // Device context of window
  211. CDC olddc;          // DC of previous window
  212. HDC hDC;            // HDC of 'dc'
  213. CRect rc;           // Rectangle of window
  214. CBrush br           // Black brush
  215. (1, RGB(0xFF,
  216. 0xFF, 0xFF));
  217. CPen pen            // Pen to draw rectangle with
  218. (PS_ALTERNATE,
  219. 10,
  220. RGB(0xFF, 0xFF, 0xFF));
  221. HWND hWnd;          // HWND of window
  222. int i;
  223. static HWND hWndOld = (HWND)-1;
  224. // Very important!  We must convert the client coordinates to
  225. // screen coordinates because ::WindowFromPoint() requires it
  226. ClientToScreen(&point);
  227. // Set 'm_targetWindow' to the window handle of the window that is
  228. // under the cursor
  229. m_targetWindow = (LONG)::WindowFromPoint(point);
  230. hWnd = (HWND)m_targetWindow;
  231. if (hWnd == m_hWnd)
  232. return;  // Why would we want to target ourselfs?
  233. // If this is the same window as it was last time, there is no need
  234. // to do anything
  235. if (hWnd == hWndOld)
  236. return;
  237. // Call the user-defined callback that means that the selected window
  238. // has changed
  239. i = m_pfnWindowSelectedCallback(hWnd);
  240. // NEW IN 1.1: Send a WM_USER + 100 message to are parent.
  241. GetParent()->SendMessage(WM_USER + 100, (UINT)hWnd, (UINT)hWnd);
  242. if (i == 1)
  243. {
  244. // A code of 1 returned from the callback function means that
  245. // the window should be ignored
  246. return;
  247. #ifdef _DEBUG
  248. // If debugging, display the window handle at the point
  249. CString str;
  250. TCHAR caption[MAX_PATH];
  251. ::GetWindowText((HWND)m_targetWindow, caption, MAX_PATH);
  252. str.Format("%X at (%d, %d) %sn", m_targetWindow, point.x, point.y,
  253. caption);
  254. TRACE0(str);
  255. #endif
  256. // Get the DC of the window
  257. hDC = ::GetDC(hWnd);
  258. dc.Attach(hDC);
  259. hDC = ::GetDC(hWndOld);
  260. olddc.Attach(hDC);
  261. // Invert the window
  262. DrawWindowFrame(hWnd);
  263. if (hWndOld != (HWND)-1)
  264. DrawWindowFrame(hWndOld);
  265. // Save the previous HWND so we can see if the window is different
  266. hWndOld = hWnd;
  267. COleControl::OnMouseMove(nFlags, point);
  268. }
  269. #pragma pack(1)
  270. typedef struct
  271. {
  272. WINFINDERCALLBACK pfn;
  273. } *LPWINFINDERCALLBACKSTRUCT;
  274. #pragma pack()
  275. // To set the callback function, post a WM_SETWFCALLBACK or WM_USER + 100
  276. // message to this control with the LPARAM being the address of the 
  277. // function and WPARAM set to zero.  Setting WPARAM to a non-zero value
  278. // will return the address of the existing callback function and not set
  279. // it (the return value is always the callback function, but if WPARAM
  280. // is non-zero the callback function will not be set).
  281. LRESULT CWinFinderCtrl::OnSetWFCallback(WPARAM wParam, LPARAM lParam)
  282. {
  283. WINFINDERCALLBACK pfn;
  284. LPWINFINDERCALLBACKSTRUCT wfcbs;
  285. wfcbs = (LPWINFINDERCALLBACKSTRUCT)lParam;
  286. pfn = wfcbs->pfn;
  287. if (wParam != 0)
  288. return (long)m_pfnWindowSelectedCallback;
  289. else
  290. m_pfnWindowSelectedCallback = pfn;
  291. return (long)m_pfnWindowSelectedCallback;
  292. }
  293. OLE_HANDLE CWinFinderCtrl::GetHwnd() 
  294. {
  295. return (unsigned int)m_hWnd;
  296. return NULL;
  297. }
  298. void CWinFinderCtrl::SetHwnd(OLE_HANDLE nNewValue) 
  299. {
  300. // TODO: Add your property handler here
  301. SetModifiedFlag();
  302. }