1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\r
9 #include "windowstool.h"
\r
17 HICON m_hCursor; ///
\r
20 static void invertFrame(HWND i_hwnd) {
\r
21 HDC hdc = GetWindowDC(i_hwnd);
\r
23 int rop2 = SetROP2(hdc, R2_XORPEN);
\r
26 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
27 int width = rcWidth(&rc);
\r
28 int height = rcHeight(&rc);
\r
30 HANDLE hpen = SelectObject(hdc, GetStockObject(WHITE_PEN));
\r
31 HANDLE hbr = SelectObject(hdc, GetStockObject(NULL_BRUSH));
\r
32 CHECK_TRUE( Rectangle(hdc, 0, 0, width , height ) );
\r
33 CHECK_TRUE( Rectangle(hdc, 1, 1, width - 1, height - 1) );
\r
34 CHECK_TRUE( Rectangle(hdc, 2, 2, width - 2, height - 2) );
\r
35 SelectObject(hdc, hpen);
\r
36 SelectObject(hdc, hbr);
\r
37 // no need to DeleteObject StockObject
\r
40 CHECK_TRUE( ReleaseDC(i_hwnd, hdc) );
\r
51 int wmCreate(CREATESTRUCT * /* i_cs */) {
\r
52 CHECK_TRUE( m_hCursor =
\r
53 LoadCursor(g_hInst, MAKEINTRESOURCE(IDC_CURSOR_target)) );
\r
60 HDC hdc = BeginPaint(m_hwnd, &ps);
\r
63 if (GetCapture() != m_hwnd) {
\r
65 CHECK_TRUE( GetClientRect(m_hwnd, &rc) );
\r
67 DrawIcon(hdc, (rcWidth(&rc) - GetSystemMetrics(SM_CXICON)) / 2,
\r
68 (rcHeight(&rc) - GetSystemMetrics(SM_CYICON)) / 2,
\r
72 EndPaint(m_hwnd, &ps);
\r
77 struct PointWindow {
\r
84 static BOOL CALLBACK childWindowFromPoint(HWND i_hwnd, LPARAM i_lParam) {
\r
85 if (IsWindowVisible(i_hwnd)) {
\r
86 PointWindow &pw = *(PointWindow *)i_lParam;
\r
88 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
89 if (PtInRect(&rc, pw.m_p))
\r
90 if (isRectInRect(&rc, &pw.m_rc)) {
\r
99 static BOOL CALLBACK windowFromPoint(HWND i_hwnd, LPARAM i_lParam) {
\r
100 if (IsWindowVisible(i_hwnd)) {
\r
101 PointWindow &pw = *(PointWindow *)i_lParam;
\r
103 CHECK_TRUE( GetWindowRect(i_hwnd, &rc) );
\r
104 if (PtInRect(&rc, pw.m_p)) {
\r
105 pw.m_hwnd = i_hwnd;
\r
114 int wmMouseMove(WORD /* i_keys */, int /* i_x */, int /* i_y */) {
\r
115 if (GetCapture() == m_hwnd) {
\r
117 CHECK_TRUE( GetCursorPos(&pw.m_p) );
\r
119 CHECK_TRUE( GetWindowRect(GetDesktopWindow(), &pw.m_rc) );
\r
120 EnumWindows(windowFromPoint, (LPARAM)&pw);
\r
122 HWND hwndParent = pw.m_hwnd;
\r
123 if (!EnumChildWindows(pw.m_hwnd, childWindowFromPoint, (LPARAM)&pw))
\r
125 if (hwndParent == pw.m_hwnd)
\r
128 if (pw.m_hwnd != m_preHwnd) {
\r
130 invertFrame(m_preHwnd);
\r
131 m_preHwnd = pw.m_hwnd;
\r
132 invertFrame(m_preHwnd);
\r
133 SendMessage(GetParent(m_hwnd), WM_APP_targetNotify, 0,
\r
134 (LPARAM)m_preHwnd);
\r
136 SetCursor(m_hCursor);
\r
142 int wmLButtonDown(WORD /* i_keys */, int /* i_x */, int /* i_y */) {
\r
143 SetCapture(m_hwnd);
\r
144 SetCursor(m_hCursor);
\r
145 CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
\r
146 CHECK_TRUE( UpdateWindow(m_hwnd) );
\r
151 int wmLButtonUp(WORD /* i_keys */, int /* i_x */, int /* i_y */) {
\r
153 invertFrame(m_preHwnd);
\r
156 CHECK_TRUE( InvalidateRect(m_hwnd, NULL, TRUE) );
\r
157 CHECK_TRUE( UpdateWindow(m_hwnd) );
\r
163 static LRESULT CALLBACK WndProc(HWND i_hwnd, UINT i_message,
\r
164 WPARAM i_wParam, LPARAM i_lParam) {
\r
166 getUserData(i_hwnd, &wc);
\r
168 switch (i_message) {
\r
170 wc = setUserData(i_hwnd, new Target(i_hwnd));
\r
171 return wc->wmCreate((CREATESTRUCT *)i_lParam);
\r
174 switch (i_message) {
\r
176 return wc->wmPaint();
\r
177 case WM_LBUTTONDOWN:
\r
178 return wc->wmLButtonDown((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
179 (short)HIWORD(i_lParam));
\r
181 return wc->wmLButtonUp((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
182 (short)HIWORD(i_lParam));
\r
184 return wc->wmMouseMove((WORD)i_wParam, (short)LOWORD(i_lParam),
\r
185 (short)HIWORD(i_lParam));
\r
190 return DefWindowProc(i_hwnd, i_message, i_wParam, i_lParam);
\r
196 ATOM Register_target()
\r
199 wc.style = CS_HREDRAW | CS_VREDRAW;
\r
200 wc.lpfnWndProc = Target::WndProc;
\r
203 wc.hInstance = g_hInst;
\r
205 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
\r
206 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
\r
207 wc.lpszMenuName = NULL;
\r
208 wc.lpszClassName = _T("mayuTarget");
\r
209 return RegisterClass(&wc);
\r