1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
9 #include "windowstool.h"
\r
17 HICON m_hCursor; ///
\r
20 static void invertFrame(HWND i_hwnd)
\r
22 HDC hdc = GetWindowDC(i_hwnd);
\r
24 int rop2 = SetROP2(hdc, R2_XORPEN);
\r
28 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
29 int width = rcWidth(&rc);
\r
30 int height = rcHeight(&rc);
\r
32 HANDLE hpen = SelectObject(hdc, GetStockObject(WHITE_PEN));
\r
33 HANDLE hbr = SelectObject(hdc, GetStockObject(NULL_BRUSH));
\r
34 CHECK_TRUE( Rectangle(hdc, 0, 0, width , height ) );
\r
35 CHECK_TRUE( Rectangle(hdc, 1, 1, width - 1, height - 1) );
\r
36 CHECK_TRUE( Rectangle(hdc, 2, 2, width - 2, height - 2) );
\r
37 SelectObject(hdc, hpen);
\r
38 SelectObject(hdc, hbr);
\r
39 // no need to DeleteObject StockObject
\r
42 CHECK_TRUE( ReleaseDC(i_hwnd, hdc) );
\r
54 int wmCreate(CREATESTRUCT * /* i_cs */)
\r
56 CHECK_TRUE( m_hCursor =
\r
57 LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_CURSOR_target)) );
\r
65 HDC hdc = BeginPaint(m_hwnd, &ps);
\r
68 if (GetCapture() != m_hwnd)
\r
71 CHECK_TRUE( GetClientRect(m_hwnd, &rc) );
\r
73 DrawIcon(hdc, (rcWidth(&rc) - GetSystemMetrics(SM_CXICON)) / 2,
\r
74 (rcHeight(&rc) - GetSystemMetrics(SM_CYICON)) / 2,
\r
78 EndPaint(m_hwnd, &ps);
\r
91 static BOOL CALLBACK childWindowFromPoint(HWND i_hwnd, LPARAM i_lParam)
\r
93 if (IsWindowVisible(i_hwnd))
\r
95 PointWindow &pw = *(PointWindow *)i_lParam;
\r
97 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
98 if (PtInRect(&rc, pw.m_p))
\r
99 if (isRectInRect(&rc, &pw.m_rc))
\r
101 pw.m_hwnd = i_hwnd;
\r
109 static BOOL CALLBACK windowFromPoint(HWND i_hwnd, LPARAM i_lParam)
\r
111 if (IsWindowVisible(i_hwnd))
\r
113 PointWindow &pw = *(PointWindow *)i_lParam;
\r
115 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
116 if (PtInRect(&rc, pw.m_p))
\r
118 pw.m_hwnd = i_hwnd;
\r
127 int wmMouseMove(WORD /* i_keys */, int /* i_x */, int /* i_y */)
\r
129 if (GetCapture() == m_hwnd)
\r
132 CHECK_TRUE( GetCursorPos(&pw.m_p) );
\r
134 CHECK_TRUE( GetWindowRect(GetDesktopWindow(), &pw.m_rc) );
\r
135 EnumWindows(windowFromPoint, (LPARAM)&pw);
\r
138 HWND hwndParent = pw.m_hwnd;
\r
139 if (!EnumChildWindows(pw.m_hwnd, childWindowFromPoint, (LPARAM)&pw))
\r
141 if (hwndParent == pw.m_hwnd)
\r
144 if (pw.m_hwnd != m_preHwnd)
\r
147 invertFrame(m_preHwnd);
\r
148 m_preHwnd = pw.m_hwnd;
\r
149 invertFrame(m_preHwnd);
\r
150 SendMessage(GetParent(m_hwnd), WM_APP_targetNotify, 0,
\r
151 (LPARAM)m_preHwnd);
\r
153 SetCursor(m_hCursor);
\r
159 int wmLButtonDown(WORD /* i_keys */, int /* i_x */, int /* i_y */)
\r
161 SetCapture(m_hwnd);
\r
162 SetCursor(m_hCursor);
\r
163 CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
\r
164 CHECK_TRUE( UpdateWindow(m_hwnd) );
\r
169 int wmLButtonUp(WORD /* i_keys */, int /* i_x */, int /* i_y */)
\r
172 invertFrame(m_preHwnd);
\r
175 CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
\r
176 CHECK_TRUE( UpdateWindow(m_hwnd) );
\r
182 static LRESULT CALLBACK WndProc(HWND i_hwnd, UINT i_message,
\r
183 WPARAM i_wParam, LPARAM i_lParam)
\r
186 getUserData(i_hwnd, &wc);
\r
191 wc = setUserData(i_hwnd, new Target(i_hwnd));
\r
192 return wc->wmCreate((CREATESTRUCT *)i_lParam);
\r
198 return wc->wmPaint();
\r
199 case WM_LBUTTONDOWN:
\r
200 return wc->wmLButtonDown((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
201 (short)HIWORD(i_lParam));
\r
203 return wc->wmLButtonUp((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
204 (short)HIWORD(i_lParam));
\r
206 return wc->wmMouseMove((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
207 (short)HIWORD(i_lParam));
\r
212 return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);
\r
218 ATOM Register_target()
\r
221 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
222 wc.lpfnWndProc = Target::WndProc;
\r
225 wc.hInstance = g_hInst;
\r
227 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
228 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
\r
229 wc.lpszMenuName = NULL;
\r
230 wc.lpszClassName = _T("mayuTarget");
\r
231 return RegisterClass(&wc);
\r