ReactOS  0.4.14-dev-52-g6116262
magnifier.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Magnify
3  * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE: Magnification of parts of the screen.
5  * COPYRIGHT: Copyright 2007-2019 Marc Piulachs <marc.piulachs@codexchange.net>
6  * Copyright 2015-2019 David Quintana <gigaherz@gmail.com>
7  */
8 
9 /* TODO: Support AppBar types other than ABE_TOP */
10 
11 #include "magnifier.h"
12 
13 #include <winbase.h>
14 #include <winuser.h>
15 #include <wingdi.h>
16 #include <winnls.h>
17 #include <commctrl.h>
18 #include <shellapi.h>
19 #include <windowsx.h>
20 #include <stdlib.h>
21 #include <tchar.h>
22 
23 #include "resource.h"
24 
25 #define APPMSG_NOTIFYICON (WM_APP+1)
26 #define APPMSG_APPBAR (WM_APP+2)
27 
28 const TCHAR szWindowClass[] = TEXT("MAGNIFIER");
29 
30 /* Global Variables */
33 
34 #define MAX_LOADSTRING 100
36 
37 #define TIMER_SPEED 1
38 #define REPAINT_SPEED 100
39 
41 
43 
57 
58 /* Current magnified area */
60 
61 /* Last positions */
67 
74 
75 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
76 {
77  MSG msg;
78  HACCEL hAccelTable;
80 
81  UNREFERENCED_PARAMETER(hPrevInstance);
82  UNREFERENCED_PARAMETER(lpCmdLine);
83 
84  switch (GetUserDefaultUILanguage())
85  {
88  break;
89 
90  default:
91  break;
92  }
93 
94  /* Initialize global strings */
97 
98  /* Perform application initialization */
99  if (!InitInstance(hInstance, nCmdShow))
100  return FALSE;
101 
103 
104  /* Main message loop */
105  while (GetMessage(&msg, NULL, 0, 0))
106  {
107  if (!TranslateAccelerator(hMainWnd, hAccelTable, &msg))
108  {
111  }
112  }
113 
114  /* Load the common controls */
115  iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
117  InitCommonControlsEx(&iccex);
118 
122 
123  return (int) msg.wParam;
124 }
125 
127 {
128  WNDCLASS wc;
129 
130  wc.style = CS_HREDRAW | CS_VREDRAW;
131  wc.lpfnWndProc = WndProc;
132  wc.cbClsExtra = 0;
133  wc.cbWndExtra = 0;
134  wc.hInstance = hInstance;
137  wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
138  wc.lpszMenuName = NULL; //MAKEINTRESOURCE(IDC_MAGNIFIER);
140 
141  return RegisterClass(&wc);
142 }
143 
145 {
146  UINT uState;
147  APPBARDATA data = {0};
148  data.cbSize = sizeof(data);
149  data.hWnd = hMainWnd;
150  data.uCallbackMessage = APPMSG_APPBAR;
151 
152  if (mode == ABM_NEW || mode == ABM_SETPOS)
153  {
154  HWND hWndOrder = HWND_BOTTOM;
155  int rcw, rch;
156  RECT rcWorkArea;
157  SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
158 
159  if (mode == ABM_NEW)
160  {
162 
163  switch(AppBarConfig.uEdge)
164  {
165  case ABE_LEFT:
166  data.rc.top = rcWorkArea.top;
167  data.rc.bottom = rcWorkArea.bottom;
168  data.rc.left = rcWorkArea.left;
169  data.rc.right = data.rc.left + AppBarConfig.appBarSizes.left;
170  break;
171  case ABE_TOP:
172  data.rc.left = rcWorkArea.left;
173  data.rc.right = rcWorkArea.right;
174  data.rc.top = rcWorkArea.top;
175  data.rc.bottom = data.rc.top + AppBarConfig.appBarSizes.top;
176  break;
177  case ABE_RIGHT:
178  data.rc.top = rcWorkArea.top;
179  data.rc.bottom = rcWorkArea.bottom;
180  data.rc.right = rcWorkArea.left;
181  data.rc.left = data.rc.right - AppBarConfig.appBarSizes.right;
182  break;
183  case ABE_BOTTOM:
184  data.rc.left = rcWorkArea.left;
185  data.rc.right = rcWorkArea.right;
186  data.rc.bottom = rcWorkArea.bottom;
187  data.rc.top = data.rc.bottom - AppBarConfig.appBarSizes.bottom;
188  break;
189  }
190  }
191  else
192  {
194  }
195 
196  data.uEdge = AppBarConfig.uEdge;
197  uState = SHAppBarMessage(ABM_QUERYPOS, &data);
198  uState = SHAppBarMessage(ABM_SETPOS, &data);
199 
200  rcw = data.rc.right-data.rc.left;
201  rch = data.rc.bottom-data.rc.top;
202 
203  uState = SHAppBarMessage(ABM_GETSTATE, &data);
204  if (uState & ABS_ALWAYSONTOP)
205  hWndOrder = HWND_TOPMOST;
206 
207  SetWindowPos(hMainWnd, hWndOrder, data.rc.left, data.rc.top, rcw, rch, SWP_SHOWWINDOW | SWP_NOCOPYBITS);
208 
209  }
210  else if (mode == ABM_GETSTATE)
211  {
212  HWND hWndOrder = HWND_BOTTOM;
213  uState = SHAppBarMessage(ABM_GETSTATE, &data);
214  if (uState & ABS_ALWAYSONTOP)
215  hWndOrder = HWND_TOPMOST;
216  SetWindowPos(hMainWnd, hWndOrder, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
217  }
218  else if (mode == ABM_ACTIVATE)
219  {
221  }
222  else if (mode == ABM_WINDOWPOSCHANGED)
223  {
225  }
226  else if (mode == ABM_REMOVE)
227  {
229  }
230 }
231 
232 void AttachAppBar(INT uEdge)
233 {
234  if (AppBarConfig.uEdge == uEdge)
235  return;
236 
237  if (AppBarConfig.uEdge < 0 && uEdge >= 0)
238  {
240  }
241  else if (uEdge < 0 && AppBarConfig.uEdge >= 0)
242  {
245  }
246 
247  if (AppBarConfig.uEdge >= 0)
248  {
250  }
251 
252  if (uEdge >= 0)
253  {
254  AppBarConfig.uEdge = uEdge;
256  }
257  else
258  {
259  RECT rc = AppBarConfig.rcFloating;
260  SetWindowPos(hMainWnd, HWND_TOPMOST, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0);
261  }
262 
263  AppBarConfig.uEdge = uEdge;
264 }
265 
267 {
268  RECT rc;
271 
272  /* Load settings from registry */
273  LoadSettings();
274 
275  rc = AppBarConfig.rcFloating;
276 
277  hInst = hInstance; // Store instance handle in our global variable
278 
279  if (AppBarConfig.uEdge <0 )
280  {
281  dwStyles |= WS_CAPTION;
282  exStyles |= WS_EX_TOPMOST;
283  }
284 
285  /* Create the Window */
286  hMainWnd = CreateWindowEx(exStyles,
288  szTitle,
289  dwStyles,
290  rc.left,
291  rc.top,
292  rc.right-rc.left,
293  rc.bottom-rc.top,
294  NULL,
295  NULL,
296  hInstance,
297  NULL);
298  if (!hMainWnd)
299  return FALSE;
300 
301  if (AppBarConfig.uEdge >= 0)
303  else
305 
306  // In Windows 2003's Magnifier, the "Start Minimized" setting
307  // refers exclusively to the options dialog, not the main window itself.
310 
311  if (bShowWarning)
313 
314  return TRUE;
315 }
316 
317 void Refresh(void)
318 {
319  if (!IsIconic(hMainWnd))
320  {
321  /* Invalidate the client area forcing a WM_PAINT message */
323  }
324 }
325 
327 {
328  int rcLeft, rcTop;
329  int rcWidth, rcHeight;
330  RECT rcMon;
331  HMONITOR hMon = MonitorFromRect(rect, MONITOR_DEFAULTTONEAREST);
333  info.cbSize = sizeof(info);
334 
335  GetMonitorInfo(hMon, &info);
336 
337  rcMon = info.rcMonitor;
338 
339  rcLeft = rect->left;
340  rcTop = rect->top;
341  rcWidth = (rect->right - rect->left);
342  rcHeight = (rect->bottom - rect->top);
343 
344  if (rcLeft < rcMon.left)
345  rcLeft = rcMon.left;
346 
347  if (rcTop < rcMon.top)
348  rcTop = rcMon.top;
349 
350  if (rcLeft > (rcMon.right - rcWidth))
351  rcLeft = (rcMon.right - rcWidth);
352 
353  if (rcTop > (rcMon.bottom - rcHeight))
354  rcTop = (rcMon.bottom - rcHeight);
355 
356  OffsetRect(rect, (rcLeft-rect->left), (rcTop-rect->top));
357 }
358 
359 void Draw(HDC aDc)
360 {
361  HDC desktopHdc = NULL;
362 
363  RECT sourceRect, intersectedRect;
364  RECT targetRect, appRect;
365  DWORD rop = SRCCOPY;
366  CURSORINFO cinfo;
367  ICONINFO iinfo;
368 
369  int AppWidth, AppHeight;
370 
371  if (bInvertColors)
372  rop = NOTSRCCOPY;
373 
374  desktopHdc = GetDC(0);
375 
376  GetClientRect(hMainWnd, &appRect);
377  AppWidth = (appRect.right - appRect.left);
378  AppHeight = (appRect.bottom - appRect.top);
379 
380  ZeroMemory(&cinfo, sizeof(cinfo));
381  ZeroMemory(&iinfo, sizeof(iinfo));
382  cinfo.cbSize = sizeof(cinfo);
383  GetCursorInfo(&cinfo);
384  GetIconInfo(cinfo.hCursor, &iinfo);
385 
386  targetRect = appRect;
387  ClientToScreen(hMainWnd, (POINT*)&targetRect.left);
388  ClientToScreen(hMainWnd, (POINT*)&targetRect.right);
389 
391  {
393 
394  if (hdcOffscreen)
395  {
399  }
400 
401  sourceWidth = AppWidth / uiZoom;
402  sourceHeight = AppHeight / uiZoom;
403 
404  /* Create a memory DC compatible with client area DC */
405  hdcOffscreen = CreateCompatibleDC(desktopHdc);
406 
407  /* Create a bitmap compatible with the client area DC */
409  sourceWidth,
410  sourceHeight);
411 
412  /* Select our bitmap in memory DC and save the old one */
414  }
415 
416  GetWindowRect(hDesktopWindow, &sourceRect);
417  sourceRect.left = (cp.x) - (sourceWidth /2);
418  sourceRect.top = (cp.y) - (sourceHeight /2);
419  sourceRect.right = sourceRect.left + sourceWidth;
420  sourceRect.bottom = sourceRect.top + sourceHeight;
421 
422  GetBestOverlapWithMonitors(&sourceRect);
423 
424  /* Paint the screen bitmap to our in memory DC */
426  0,
427  0,
428  sourceWidth,
429  sourceHeight,
430  desktopHdc,
431  sourceRect.left,
432  sourceRect.top,
433  rop);
434 
435  if (IntersectRect(&intersectedRect, &sourceRect, &targetRect))
436  {
437  OffsetRect(&intersectedRect, -sourceRect.left, -sourceRect.top);
438  FillRect(hdcOffscreen, &intersectedRect, GetStockObject(DC_BRUSH));
439  }
440 
441  /* Draw the mouse pointer in the right position */
443  pMouse.x - iinfo.xHotspot - sourceRect.left, // - 10,
444  pMouse.y - iinfo.yHotspot - sourceRect.top, // - 10,
445  cinfo.hCursor);
446 
447  /* Blast the stretched image from memory DC to window DC */
448  StretchBlt(aDc,
449  0,
450  0,
451  AppWidth,
452  AppHeight,
453  hdcOffscreen,
454  0,
455  0,
456  sourceWidth,
457  sourceHeight,
459 
460  /* Cleanup */
461  if (iinfo.hbmMask)
462  DeleteObject(iinfo.hbmMask);
463  if (iinfo.hbmColor)
464  DeleteObject(iinfo.hbmColor);
465  ReleaseDC(hDesktopWindow, desktopHdc);
466 }
467 
469 {
470  POINT pt;
471 
472  switch(lParam)
473  {
474  case WM_LBUTTONUP:
476  break;
477  case WM_RBUTTONUP:
478  GetCursorPos(&pt);
479  TrackPopupMenu(notifyMenu, 0, pt.x, pt.y, 0, hWnd, NULL);
480  break;
481  }
482 }
483 
485 {
486  int wmId;
487 
488  switch (message)
489  {
490  case WM_TIMER:
491  {
492  BOOL hasMoved = FALSE;
493 
494  GUITHREADINFO guiInfo;
495  guiInfo.cbSize = sizeof(guiInfo);
496 
497  GetGUIThreadInfo(0, &guiInfo);
498 
499  if (bFollowMouse)
500  {
501  POINT pNewMouse;
502 
503  //Get current mouse position
504  GetCursorPos (&pNewMouse);
505 
506 #define PointsAreEqual(pt1, pt2) (((pt1).x == (pt2).x) && ((pt1).y == (pt2).y))
507 
508  //If mouse has moved ...
509  if (!PointsAreEqual(pMouse, pNewMouse))
510  {
511  //Update to new position
512  pMouse = pNewMouse;
513  cp = pNewMouse;
514  hasMoved = TRUE;
515  }
516  }
517 
518  if (guiInfo.hwndActive != hMainWnd)
519  {
520  if (bFollowCaret)
521  {
522  if (guiInfo.hwndCaret)
523  {
524  POINT ptCaret;
525  ptCaret.x = (guiInfo.rcCaret.left + guiInfo.rcCaret.right) / 2;
526  ptCaret.y = (guiInfo.rcCaret.top + guiInfo.rcCaret.bottom) / 2;
527 
528  if ((pCaretWnd != guiInfo.hwndCaret) || !PointsAreEqual(pCaret, ptCaret))
529  {
530  //Update to new position
531  pCaret = ptCaret;
532  pCaretWnd = guiInfo.hwndCaret;
533  if (!hasMoved)
534  {
535  ClientToScreen (guiInfo.hwndCaret, (LPPOINT) &ptCaret);
536  cp = ptCaret;
537  hasMoved = TRUE;
538  }
539  }
540  }
541  else
542  {
543  pCaretWnd = NULL;
544  }
545  }
546 
547  if (bFollowFocus)
548  {
549  if (guiInfo.hwndFocus && !guiInfo.hwndCaret)
550  {
551  POINT ptFocus;
552  RECT activeRect;
553 
554  //Get current control focus
555  GetWindowRect(guiInfo.hwndFocus, &activeRect);
556  ptFocus.x = (activeRect.left + activeRect.right) / 2;
557  ptFocus.y = (activeRect.top + activeRect.bottom) / 2;
558 
559  if ((guiInfo.hwndFocus != pFocusWnd) || !PointsAreEqual(pFocus, ptFocus))
560  {
561  //Update to new position
562  pFocus = ptFocus;
563  pFocusWnd = guiInfo.hwndFocus;
564  if (!hasMoved)
565  {
566  cp = ptFocus;
567  hasMoved = TRUE;
568  }
569  }
570  }
571  else
572  {
573  pFocusWnd = NULL;
574  }
575  }
576  }
577 
578  if (!hasMoved)
579  {
580  DWORD newTicks = GetTickCount();
581  DWORD elapsed = (newTicks - lastTicks);
582  if (elapsed > REPAINT_SPEED)
583  {
584  hasMoved = TRUE;
585  }
586  }
587 
588  if (hasMoved)
589  {
591  Refresh();
592  }
593 
594  return 0;
595  }
596 
597  case WM_COMMAND:
598  {
599  wmId = LOWORD(wParam);
600  /* Parse the menu selections */
601  switch (wmId)
602  {
603  case IDM_OPTIONS:
605  break;
606  case IDM_ABOUT:
608  break;
609  case IDM_EXIT:
611  break;
612  default:
614  }
615  return 0;
616  }
617 
618  case WM_PAINT:
619  {
620  PAINTSTRUCT PaintStruct;
621  HDC dc;
622  dc = BeginPaint(hWnd, &PaintStruct);
623  Draw(dc);
624  EndPaint(hWnd, &PaintStruct);
625  return 0;
626  }
627 
628  case WM_CONTEXTMENU:
630  return 0;
631 
632  case WM_LBUTTONDOWN:
633  {
634  RECT rc;
635  POINT pt;
636  SetCapture(hWnd);
637 
638  GetCursorPos(&pt);
639  GetWindowRect(hWnd, &rc);
640  ptDragOffset.x = pt.x - rc.left;
641  ptDragOffset.y = pt.y - rc.top;
642 
643  nearEdge = AppBarConfig.uEdge;
644 
645  break;
646  }
647 
648  case WM_MOUSEMOVE:
649  if (GetCapture() == hWnd)
650  {
651  RECT rc;
652  POINT pt;
653  RECT rcWorkArea;
654  SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
655  GetCursorPos(&pt);
656  GetWindowRect(hWnd, &rc);
657 
658  if (AppBarConfig.uEdge >= 0)
659  {
660  if (pt.x >= rcWorkArea.left && pt.x <= rcWorkArea.right &&
661  pt.y >= rcWorkArea.top && pt.y <= rcWorkArea.bottom)
662  {
663  AttachAppBar(-2);
664 
665  // Fixup offset
666  GetWindowRect(hWnd, &rc);
667  ptDragOffset.x = (rc.right-rc.left)/2;
668  ptDragOffset.y = 2;
669 
670  rc.left = pt.x - ptDragOffset.x;
671  rc.top = pt.y - ptDragOffset.y;
672 
673  SetWindowPos(hWnd, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE);
674  }
675  }
676  else
677  {
678  if (pt.x <= rcWorkArea.left+8 && nearEdge != ABE_LEFT)
679  {
681  nearEdge = ABE_LEFT;
682  }
683  else if (pt.y <= rcWorkArea.top+8 && nearEdge != ABE_TOP)
684  {
686  nearEdge = ABE_TOP;
687  }
688  else if (pt.x >= rcWorkArea.right-8 && nearEdge != ABE_RIGHT)
689  {
692  }
693  else if (pt.y >= rcWorkArea.bottom-8 && nearEdge != ABE_BOTTOM)
694  {
697  }
698  else
699  {
700  rc.left = pt.x - ptDragOffset.x;
701  rc.top = pt.y - ptDragOffset.y;
702 
703  SetWindowPos(hWnd, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE);
704  nearEdge = -1;
705  }
706  }
707 
708  pMouse = pt;
709  Refresh();
710  }
711  break;
712 
713  case WM_LBUTTONUP:
714  if (GetCapture() == hWnd)
715  {
716  if (AppBarConfig.uEdge >= 0)
718  else
720  ReleaseCapture();
721  }
722  break;
723 
724  case WM_SIZE:
725  if (AppBarConfig.uEdge >= 0)
727  /* fallthrough */
728  case WM_DISPLAYCHANGE:
730  Refresh();
731  break;
732 
733  case WM_ERASEBKGND:
734  // handle WM_ERASEBKGND by simply returning non-zero because we did all the drawing in WM_PAINT.
735  return 0;
736 
737  case WM_DESTROY:
738  {
739  if (AppBarConfig.uEdge >= 0)
741 
742  KillTimer(hWnd, 1);
743 
744  /* Save settings to registry */
745  SaveSettings();
746 
747  /* Cleanup notification icon */
748  ZeroMemory(&nid, sizeof(nid));
749  nid.cbSize = sizeof(nid);
751  nid.hWnd = hWnd;
755 
757 
758  PostQuitMessage(0);
759  return 0;
760  }
761 
762  case WM_CREATE:
763  {
764  HMENU tempMenu;
765 
766  /* Get the desktop window */
768 
769  /* Set the timer */
771 
772  /* Notification icon */
774 
775  ZeroMemory(&nid, sizeof(nid));
776  nid.cbSize = sizeof(nid);
778  nid.hWnd = hWnd;
780  nid.hIcon = notifyIcon;
782 
784  notifyMenu = GetSubMenu(tempMenu, 0);
785  RemoveMenu(tempMenu, 0, MF_BYPOSITION);
786  DestroyMenu(tempMenu);
787  return 0;
788  }
789 
790  case APPMSG_APPBAR:
791  {
792  switch (wParam)
793  {
794  case ABN_STATECHANGE:
796  break;
797  case ABN_POSCHANGED:
799  break;
800  case ABN_FULLSCREENAPP:
801  {
802  if (!lParam)
803  {
805  break;
806  }
807 
809  break;
810  }
811  case ABN_WINDOWARRANGE:
813  break;
814  }
815  return 0;
816  }
817 
818  case APPMSG_NOTIFYICON:
820  return 0;
821 
822  case WM_ACTIVATE:
823  if (AppBarConfig.uEdge >= 0)
825  break;
826 
827  case WM_WINDOWPOSCHANGED:
828  if (AppBarConfig.uEdge >= 0)
830  Refresh();
831  break;
832 
833  default:
834  break;
835  }
836 
838 }
839 
841 {
843  switch (message)
844  {
845  case WM_INITDIALOG:
846  return (INT_PTR)TRUE;
847 
848  case WM_COMMAND:
849  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
850  {
851  EndDialog(hDlg, LOWORD(wParam));
852  return (INT_PTR)TRUE;
853  }
854  break;
855  }
856 
857  return (INT_PTR)FALSE;
858 }
859 
861 {
863 
864  switch (message)
865  {
866  case WM_INITDIALOG:
867  {
868  /* Add the zoom items */
869  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("1"));
870  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("2"));
871  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("3"));
872  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("4"));
873  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("5"));
874  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("6"));
875  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("7"));
876  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("8"));
877  SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("9"));
878 
879  if (uiZoom >= 1 && uiZoom <= 9)
881 
882  if (bFollowMouse)
884 
885  if (bFollowFocus)
887 
888  if (bFollowCaret)
890 
891  if (bInvertColors)
893 
894  if (bStartMinimized)
896 
897  if (bShowMagnifier)
899 
900  return (INT_PTR)TRUE;
901  }
902 
903  case WM_SHOWWINDOW:
905  break;
906 
907  case WM_COMMAND:
908  switch (LOWORD(wParam))
909  {
910  case IDOK:
911  case IDCANCEL:
912  ShowWindow(hDlg, SW_HIDE);
913  return (INT_PTR)TRUE;
914 
915  case IDC_BUTTON_HELP:
916  /* Unimplemented */
917  MessageBox(hDlg, TEXT("Magnifier help not available yet!"), TEXT("Help"), MB_OK);
918  break;
919 
920  case IDC_ZOOM:
921  if (HIWORD(wParam) == CBN_SELCHANGE)
922  {
923  HWND hCombo = GetDlgItem(hDlg,IDC_ZOOM);
924  TCHAR currentZoomValue[2] = TEXT("");
925 
926  /* Get index of current selection and the text of that selection */
927  int currentSelectionIndex = ComboBox_GetCurSel(hCombo);
928  ComboBox_GetLBText(hCombo, currentSelectionIndex, currentZoomValue);
929  uiZoom = (UINT)_ttoi(currentZoomValue);
930  /* The zoom factor cannot be smaller than 1 (and not zero) or greater than 9 */
931  if (uiZoom < 1 || uiZoom > 9)
932  uiZoom = 1;
933 
934  /* Trigger the Draw function to rezoom (which will be set false automatically after rezooming) */
936 
937  /* Update the magnifier UI */
938  Refresh();
939  }
940  break;
941 
944  Refresh();
945  break;
948  break;
951  break;
954  break;
957  break;
958  case IDC_SHOWMAGNIFIER:
961  break;
962  }
963  }
964 
965  return (INT_PTR)FALSE;
966 }
967 
969 {
971 
972  switch (message)
973  {
974  case WM_INITDIALOG:
975  return (INT_PTR)TRUE;
976 
977  case WM_COMMAND:
978  switch (LOWORD(wParam))
979  {
982  break;
983  }
984  if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
985  {
986  EndDialog(hDlg, LOWORD(wParam));
987  return (INT_PTR)TRUE;
988  }
989  break;
990  }
991 
992  return (INT_PTR)FALSE;
993 }
#define IDM_OPTIONS
Definition: resource.h:28
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define IDC_FOLLOWKEYBOARDCHECK
Definition: resource.h:17
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define IDI_ICON
Definition: resource.h:5
#define TranslateAccelerator
Definition: winuser.h:5761
#define IDD_DIALOGOPTIONS
Definition: resource.h:14
BOOL bShowMagnifier
Definition: settings.c:24
HINSTANCE hInst
Definition: magnifier.c:31
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define ABE_TOP
Definition: shellapi.h:18
#define NIF_MESSAGE
Definition: shellapi.h:102
#define DispatchMessage
Definition: winuser.h:5666
LANGID WINAPI GetUserDefaultUILanguage(void)
Definition: lang.c:806
#define IDC_ZOOM
Definition: resource.h:16
#define NOMIRRORBITMAP
Definition: wingdi.h:1376
BOOL WINAPI TranslateMessage(_In_ const MSG *)
INT_PTR CALLBACK AboutProc(HWND, UINT, WPARAM, LPARAM)
Definition: magnifier.c:840
Definition: tftpd.h:59
static HICON
Definition: imagelist.c:84
#define TRUE
Definition: types.h:120
#define IDOK
Definition: winuser.h:824
#define IMAGE_ICON
Definition: winuser.h:212
#define IDC_FOLLOWTEXTEDITINGCHECK
Definition: resource.h:18
long y
Definition: polytest.cpp:48
#define LAYOUT_RTL
Definition: wingdi.h:1370
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define ABN_WINDOWARRANGE
Definition: shellapi.h:72
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define WM_LBUTTONDOWN
Definition: winuser.h:1758
#define IDM_ABOUT
Definition: resource.h:29
#define rch(ap)
Definition: match.c:407
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
HWND pCaretWnd
Definition: magnifier.c:65
#define ComboBox_GetLBText(hwndCtl, index, lpszBuffer)
Definition: windowsx.h:31
long x
Definition: polytest.cpp:48
#define IDC_SHOWMAGNIFIERCHECK
Definition: resource.h:22
void AttachAppBar(INT uEdge)
Definition: magnifier.c:232
HDC WINAPI GetDC(_In_opt_ HWND)
NOTIFYICONDATA nid
Definition: magnifier.c:44
HBITMAP WINAPI CreateCompatibleBitmap(_In_ HDC hdc, _In_ INT cx, _In_ INT cy)
WORD ATOM
Definition: dimm.idl:113
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
#define pt(x, y)
Definition: drawing.c:79
#define SW_HIDE
Definition: winuser.h:762
DWORD yHotspot
Definition: winuser.h:3099
DWORD cbSize
Definition: winable.h:70
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
HWND hOptionsDialog
Definition: magnifier.c:47
#define SUBLANG_DEFAULT
Definition: nls.h:168
#define IDD_WARNINGDIALOG
Definition: resource.h:15
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
void Draw(HDC aDc)
Definition: magnifier.c:359
HWND hWnd
Definition: settings.c:17
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:445
#define SystemParametersInfo
Definition: winuser.h:5759
LONG top
Definition: windef.h:292
#define REPAINT_SPEED
Definition: magnifier.c:38
LONG sourceWidth
Definition: magnifier.c:50
#define GET_X_LPARAM(lp)
Definition: windowsx.h:274
struct _AppBarConfig_t AppBarConfig
Definition: settings.c:26
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1497
int cbClsExtra
Definition: winuser.h:3139
#define WM_SHOWWINDOW
Definition: winuser.h:1610
#define ZeroMemory
Definition: winbase.h:1635
#define CS_HREDRAW
Definition: winuser.h:648
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
#define WS_SIZEBOX
Definition: pedump.c:642
LPCSTR lpszMenuName
Definition: winuser.h:3145
#define HWND_TOPMOST
Definition: winuser.h:1194
#define HWND_TOP
Definition: winuser.h:1193
HWND hwndActive
Definition: winable.h:72
#define ComboBox_GetCurSel(hwndCtl)
Definition: windowsx.h:24
#define IDC_SHOWWARNINGCHECK
Definition: resource.h:25
#define IDC_MAGNIFIER
Definition: resource.h:12
HDC dc
Definition: cylfrac.c:34
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
HWND hDesktopWindow
Definition: magnifier.c:42
UINT_PTR WPARAM
Definition: windef.h:207
HBRUSH hbrBackground
Definition: winuser.h:3144
#define SendDlgItemMessage
Definition: winuser.h:5743
LONG left
Definition: windef.h:291
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT *)
int32_t INT_PTR
Definition: typedefs.h:62
void DoAppBarStuff(DWORD mode)
Definition: magnifier.c:144
char * LPSTR
Definition: xmlstorage.h:182
#define WS_CLIPCHILDREN
Definition: pedump.c:619
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2635
BOOL InitInstance(HINSTANCE, int)
Definition: magnifier.c:266
LONG right
Definition: windef.h:293
BOOL WINAPI IsIconic(_In_ HWND)
#define ABE_LEFT
Definition: shellapi.h:17
BOOL WINAPI DestroyWindow(_In_ HWND)
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
static VOID NTAPI BitBlt(IN ULONG Left, IN ULONG Top, IN ULONG Width, IN ULONG Height, IN PUCHAR Buffer, IN ULONG BitsPerPixel, IN ULONG Delta)
Definition: vga.c:410
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
#define COLOR_WINDOW
Definition: winuser.h:908
int32_t INT
Definition: typedefs.h:56
#define LANG_HEBREW
Definition: nls.h:67
BOOL WINAPI GetIconInfo(_In_ HICON, _Out_ PICONINFO)
Definition: cursoricon.c:2014
#define SetWindowLongPtr
Definition: treelist.c:70
BOOL WINAPI StretchBlt(_In_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HDC, _In_ int, _In_ int, _In_ int, _In_ int, _In_ DWORD)
& rect
Definition: startmenu.cpp:1413
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define IDC_STARTMINIMIZEDCHECK
Definition: resource.h:20
#define APPMSG_APPBAR
Definition: magnifier.c:26
HWND hwndCaret
Definition: winable.h:77
struct _test_info info[]
Definition: SetCursorPos.c:19
#define ABM_ACTIVATE
Definition: shellapi.h:65
void SaveSettings(void)
Definition: settings.c:113
#define DialogBox
Definition: winuser.h:5662
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
Definition: magnifier.c:75
int cbWndExtra
Definition: winuser.h:3140
#define LoadAccelerators
Definition: winuser.h:5711
const TCHAR szWindowClass[]
Definition: magnifier.c:28
HINSTANCE hInstance
Definition: charmap.c:20
#define ICC_WIN95_CLASSES
Definition: commctrl.h:66
#define WS_EX_CONTROLPARENT
Definition: winuser.h:387
void LoadSettings(void)
Definition: settings.c:53
unsigned int BOOL
Definition: ntddk_ex.h:94
HANDLE hbmpOld
Definition: magnifier.c:54
long LONG
Definition: pedump.c:60
#define IDD_ABOUTBOX
Definition: resource.h:8
#define MF_BYPOSITION
Definition: winuser.h:203
HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT)
UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data)
Definition: shell32_main.c:974
#define ABM_GETSTATE
Definition: shellapi.h:63
BOOL bOptionsDialog
Definition: magnifier.c:48
HBITMAP hbmMask
Definition: winuser.h:3100
static int rop(int rop, int src, int dst)
Definition: nanoxwin.c:124
HWND WINAPI GetCapture(void)
Definition: message.c:2879
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
HCURSOR hCursor
Definition: winuser.h:3143
HWND hwndFocus
Definition: winable.h:73
#define CreateWindowEx
Definition: winuser.h:5656
#define CB_ADDSTRING
Definition: winuser.h:1918
smooth NULL
Definition: ftsmooth.c:416
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:652
#define IDC_SHOWMAGNIFIER
Definition: resource.h:21
#define ABE_RIGHT
Definition: shellapi.h:19
LONG_PTR LPARAM
Definition: windef.h:208
#define NOTSRCCOPY
Definition: wingdi.h:324
HBITMAP hbmColor
Definition: winuser.h:3101
DWORD cbSize
Definition: shellapi.h:215
#define ABS_ALWAYSONTOP
Definition: shellapi.h:22
#define SW_SHOW
Definition: winuser.h:769
#define NIF_ICON
Definition: shellapi.h:103
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
BOOL WINAPI InvalidateRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL)
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
#define GetMonitorInfo
Definition: winuser.h:5692
#define DefWindowProc
Definition: ros2win.h:31
#define WM_DESTROY
Definition: winuser.h:1591
BOOL WINAPI GetCursorInfo(_Inout_ PCURSORINFO)
#define PostMessage
Definition: winuser.h:5733
BOOL WINAPI SetProcessDefaultLayout(DWORD dwDefaultLayout)
Definition: window.c:1716
HDC hdcOffscreen
Definition: magnifier.c:52
#define WS_CAPTION
Definition: pedump.c:624
#define CS_VREDRAW
Definition: winuser.h:653
char TCHAR
Definition: xmlstorage.h:189
#define HWND_BOTTOM
Definition: winuser.h:1191
#define BM_SETCHECK
Definition: winuser.h:1903
INT_PTR CALLBACK OptionsProc(HWND, UINT, WPARAM, LPARAM)
Definition: magnifier.c:860
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define WM_SIZE
Definition: winuser.h:1593
DWORD xHotspot
Definition: winuser.h:3098
#define WM_TIMER
Definition: winuser.h:1724
POINT pMouse
Definition: magnifier.c:62
#define WINAPI
Definition: msvc.h:8
#define ABM_NEW
Definition: shellapi.h:59
INT nearEdge
Definition: magnifier.c:56
unsigned long DWORD
Definition: ntddk_ex.h:95
LONG sourceHeight
Definition: magnifier.c:51
ATOM MyRegisterClass(HINSTANCE hInstance)
Definition: magnifier.c:126
#define NIM_DELETE
Definition: shellapi.h:93
#define WM_RBUTTONUP
Definition: winuser.h:1762
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
#define WM_PAINT
Definition: winuser.h:1602
HICON notifyIcon
Definition: magnifier.c:45
HBITMAP hbmpOffscreen
Definition: magnifier.c:53
#define PointsAreEqual(pt1, pt2)
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
HWND hMainWnd
Definition: magnifier.c:32
BOOL bRecreateOffscreenDC
Definition: magnifier.c:49
POINT pFocus
Definition: magnifier.c:64
BOOL bFollowMouse
Definition: settings.c:18
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define MessageBox
Definition: winuser.h:5723
#define CB_SETCURSEL
Definition: winuser.h:1943
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define WM_COMMAND
Definition: winuser.h:1722
LPCSTR lpszClassName
Definition: winuser.h:3146
GLenum mode
Definition: glext.h:6217
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
#define TIMER_SPEED
Definition: magnifier.c:37
#define LoadCursor
Definition: winuser.h:5713
#define ABN_FULLSCREENAPP
Definition: shellapi.h:71
BOOL WINAPI DestroyMenu(_In_ HMENU)
UINT uCallbackMessage
Definition: shellapi.h:229
HCURSOR hCursor
Definition: winuser.h:3695
UINT style
Definition: winuser.h:3137
#define ABN_POSCHANGED
Definition: shellapi.h:70
#define SWP_NOSIZE
Definition: winuser.h:1230
#define GWL_STYLE
Definition: winuser.h:846
#define ABE_BOTTOM
Definition: shellapi.h:20
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
UINT uiZoom
Definition: settings.c:14
HWND WINAPI SetCapture(_In_ HWND hWnd)
#define TEXT(s)
Definition: k32.h:26
BOOL WINAPI DrawIcon(_In_ HDC, _In_ int, _In_ int, _In_ HICON)
Definition: cursoricon.c:1987
#define WM_ACTIVATE
Definition: winuser.h:1594
#define IDC_BUTTON_HELP
Definition: resource.h:17
#define LoadMenu
Definition: winuser.h:5718
BOOL WINAPI DeleteDC(_In_ HDC)
HINSTANCE hInstance
Definition: winuser.h:3141
BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define WM_LBUTTONUP
Definition: winuser.h:1759
int CDECL _ttoi(const _TCHAR *str)
Definition: atoi.c:10
void GetBestOverlapWithMonitors(LPRECT rect)
Definition: magnifier.c:326
BOOL bFollowCaret
Definition: settings.c:20
HWND pFocusWnd
Definition: magnifier.c:66
#define ABM_WINDOWPOSCHANGED
Definition: shellapi.h:68
POINT pCaret
Definition: magnifier.c:63
#define WS_POPUP
Definition: pedump.c:616
unsigned int UINT
Definition: ndis.h:50
#define WM_MOUSEMOVE
Definition: winuser.h:1757
#define MB_OK
Definition: winuser.h:784
#define IDS_APP_TITLE
Definition: resource.h:10
#define GetMessage
Definition: winuser.h:5691
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define IDM_EXIT
Definition: resource.h:27
POINT ptDragOffset
Definition: magnifier.c:55
#define CBN_SELCHANGE
Definition: winuser.h:1961
INT_PTR CALLBACK WarningProc(HWND, UINT, WPARAM, LPARAM)
Definition: magnifier.c:968
DWORD cbSize
Definition: winuser.h:3693
WNDPROC lpfnWndProc
Definition: winuser.h:3138
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:275
#define NIM_ADD
Definition: shellapi.h:91
DWORD lastTicks
Definition: magnifier.c:40
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1644
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2888
POINT cp
Definition: magnifier.c:59
#define Shell_NotifyIcon
Definition: shellapi.h:687
#define APPMSG_NOTIFYICON
Definition: magnifier.c:25
#define WM_CREATE
Definition: winuser.h:1590
void Refresh(void)
Definition: magnifier.c:317
BOOL bShowWarning
Definition: settings.c:16
#define ABM_QUERYPOS
Definition: shellapi.h:61
#define IDC_FOLLOWMOUSECHECK
Definition: resource.h:23
#define HIWORD(l)
Definition: typedefs.h:246
#define ABM_REMOVE
Definition: shellapi.h:60
#define MAKELANGID(p, s)
Definition: nls.h:15
void HandleNotifyIconMessage(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: magnifier.c:468
HMONITOR WINAPI MonitorFromRect(LPCRECT, DWORD)
LONG bottom
Definition: windef.h:294
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ICC_STANDARD_CLASSES
Definition: commctrl.h:73
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define LoadImage
Definition: winuser.h:5716
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
static HBITMAP
Definition: button.c:44
#define RegisterClass
Definition: winuser.h:5737
#define LoadIcon
Definition: winuser.h:5714
#define GetWindowLongPtr
Definition: treelist.c:73
#define WM_ERASEBKGND
Definition: winuser.h:1607
#define ABM_SETPOS
Definition: shellapi.h:62
#define IDCANCEL
Definition: winuser.h:825
LONG_PTR LRESULT
Definition: windef.h:209
BOOL bStartMinimized
Definition: settings.c:23
#define ABN_STATECHANGE
Definition: shellapi.h:69
int WINAPI FillRect(HDC, LPCRECT, HBRUSH)
#define WS_SYSMENU
Definition: pedump.c:629
HMENU notifyMenu
Definition: magnifier.c:46
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define LOWORD(l)
Definition: pedump.c:82
#define IDC_INVERTCOLORSCHECK
Definition: resource.h:19
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define SRCCOPY
Definition: wingdi.h:332
#define LoadString
Definition: winuser.h:5720
BOOL bInvertColors
Definition: settings.c:22
BOOL bFollowFocus
Definition: settings.c:19
#define CreateDialog
Definition: winuser.h:5650
#define MAX_LOADSTRING
Definition: magnifier.c:34
BOOL WINAPI GetGUIThreadInfo(DWORD, LPGUITHREADINFO)
Definition: ntwrapper.h:398
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)
Definition: magnifier.c:484
HICON hIcon
Definition: winuser.h:3142