Add a "magnify" application developed by Marc Piulachs (marc.piulachs AT codexchange...
authorColin Finck <colin@reactos.org>
Wed, 25 Jul 2007 18:00:56 +0000 (18:00 +0000)
committerColin Finck <colin@reactos.org>
Wed, 25 Jul 2007 18:00:56 +0000 (18:00 +0000)
Isn't finished and lights up some bugs in ReactOS, but at least it's a start
See issue #2463 for more details.

svn path=/trunk/; revision=27811

rosapps/directory.rbuild
rosapps/magnify/lang/en-US.rc [new file with mode: 0644]
rosapps/magnify/magnifier.c [new file with mode: 0644]
rosapps/magnify/magnifier.h [new file with mode: 0644]
rosapps/magnify/magnify.rbuild [new file with mode: 0644]
rosapps/magnify/magnify.rc [new file with mode: 0644]
rosapps/magnify/res/magnify.ico [new file with mode: 0644]
rosapps/magnify/resource.h [new file with mode: 0644]
rosapps/magnify/settings.c [new file with mode: 0644]

index 21d2688..76fc677 100644 (file)
        <xi:include href="lib/directory.rbuild" />
 </directory>
 -->
+
+<directory name="magnify">
+       <xi:include href="magnify/magnify.rbuild" />
+</directory>
+
 <directory name="mc">
        <xi:include href="mc/mc.rbuild" />
 </directory>
diff --git a/rosapps/magnify/lang/en-US.rc b/rosapps/magnify/lang/en-US.rc
new file mode 100644 (file)
index 0000000..2b924b2
--- /dev/null
@@ -0,0 +1,213 @@
+// Microsoft Visual C++ generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#define APSTUDIO_HIDDEN_SYMBOLS\r
+#include "windows.h"\r
+#undef APSTUDIO_HIDDEN_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Neutral resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDI_ICON                ICON                    "res/magnify.ico"\r
+#endif    // Neutral resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// English (U.S.) resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
+#pragma code_page(1252)\r
+#endif //_WIN32\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Icon\r
+//\r
+\r
+// Icon with lowest ID value placed first to ensure application icon\r
+// remains consistent on all systems.\r
+IDI_MAGNIFIER           ICON                    "res/Magnify.ico"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Menu\r
+//\r
+\r
+IDC_MAGNIFIER MENU \r
+BEGIN\r
+    POPUP "&File"\r
+    BEGIN\r
+        MENUITEM "E&xit",                       IDM_EXIT\r
+        MENUITEM "&Options",                    IDM_OPTIONS\r
+        MENUITEM SEPARATOR\r
+        MENUITEM "&About ...",                  IDM_ABOUT\r
+    END\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Accelerator\r
+//\r
+\r
+IDC_MAGNIFIER ACCELERATORS \r
+BEGIN\r
+    "?",            IDM_ABOUT,              ASCII,  ALT\r
+    "/",            IDM_ABOUT,              ASCII,  ALT\r
+END\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Dialog\r
+//\r
+\r
+IDD_ABOUTBOX DIALOGEX 22, 17, 220, 75\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_CAPTION | WS_SYSMENU\r
+CAPTION "About"\r
+FONT 8, "MS Shell Dlg", 0, 0, 0x0\r
+BEGIN\r
+    ICON            IDI_MAGNIFIER,IDC_MYICON,14,9,20,20\r
+    LTEXT           "Magnifier Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX\r
+    LTEXT           "Copyright (C) 2007 Marc Piulachs (marc.piulachs@codexchange.net)",IDC_STATIC,48,24,125,22\r
+    PUSHBUTTON      "Ok",IDOK,162,48,50,14\r
+END\r
+\r
+IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU\r
+CAPTION "Magnifier Settings"\r
+FONT 8, "MS Shell Dlg", 400, 0, 0x1\r
+BEGIN\r
+    DEFPUSHBUTTON   "Exit",IDOK,96,161,50,14\r
+    PUSHBUTTON      "Help",IDOK,38,161,50,14\r
+    LTEXT           "Magnification level :",IDC_STATIC,6,12,68,8\r
+    COMBOBOX        IDC_ZOOM,72,6,63,66,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP\r
+    GROUPBOX        "Tracking",IDC_STATIC,7,25,139,59\r
+    GROUPBOX        "Presentation",IDC_STATIC,7,87,139,57\r
+    CONTROL         "Follow mouse cursor",IDC_FOLLOWMOUSECHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,42,114,10\r
+    CONTROL         "Follow keyboard focus",IDC_FOLOWKEYBOARDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,54,114,10\r
+    CONTROL         "Follow text editing",IDC_FOLLOWTEXTEDITINGCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,66,114,10\r
+    CONTROL         "Invert colors",IDC_INVERTCOLORSCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,102,114,10\r
+    CONTROL         "Start Minimized",IDC_STARTMINIMIZEDCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,114,114,10\r
+    CONTROL         "Show Magnifier",IDC_SHOWMAGNIFIERCHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,126,114,10\r
+END\r
+\r
+IDD_WARNINGDIALOG DIALOGEX 0, 0, 250, 97\r
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION\r
+CAPTION "ReactOS Magnifier"\r
+FONT 8, "MS Shell Dlg", 400, 0, 0x1\r
+BEGIN\r
+    DEFPUSHBUTTON   "OK",IDOK,193,76,50,14\r
+    ICON            IDI_MAGNIFIER,IDC_STATIC,7,17,20,20\r
+    LTEXT           "Magnifier is intended to provide a minium level of funcionality for users with slight visual impairments. Most users with visual impairments will need a magnigication utility with higher funcionality for deily use.",IDC_STATIC,36,7,207,33\r
+    CONTROL         "Do not show this message again",IDC_SHOWWARNINGCHECK,\r
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,43,80,137,10\r
+END\r
+\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE \r
+BEGIN\r
+    "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE \r
+BEGIN\r
+    "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "#include ""windows.h""\r\n"\r
+    "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"\r
+    "\0"\r
+END\r
+\r
+3 TEXTINCLUDE \r
+BEGIN\r
+    "\r\n"\r
+    "\0"\r
+END\r
+\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// DESIGNINFO\r
+//\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+GUIDELINES DESIGNINFO \r
+BEGIN\r
+    IDD_DIALOGOPTIONS, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 146\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 175\r
+    END\r
+\r
+    IDD_WARNINGDIALOG, DIALOG\r
+    BEGIN\r
+        LEFTMARGIN, 7\r
+        RIGHTMARGIN, 243\r
+        TOPMARGIN, 7\r
+        BOTTOMMARGIN, 90\r
+    END\r
+END\r
+#endif    // APSTUDIO_INVOKED\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// String Table\r
+//\r
+\r
+STRINGTABLE \r
+BEGIN\r
+    IDS_APP_TITLE           "Magnifier"\r
+    IDC_MAGNIFIER           "MAGNIFIER"\r
+END\r
+\r
+#endif    // English (U.S.) resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif    // not APSTUDIO_INVOKED\r
+\r
diff --git a/rosapps/magnify/magnifier.c b/rosapps/magnify/magnifier.c
new file mode 100644 (file)
index 0000000..b64b34a
--- /dev/null
@@ -0,0 +1,562 @@
+/*\r
+ * PROJECT:     ReactOS Magnify\r
+ * LICENSE:     GPL - See COPYING in the top level directory\r
+ * FILE:        base/applications/magnify/magnifier.c\r
+ * PURPOSE:     \r
+ * COPYRIGHT:   Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>\r
+ *\r
+ */\r
+\r
+#include <windows.h>\r
+//#include <stdio.h>\r
+#include <shellapi.h>\r
+\r
+#include "shellapi.h"\r
+#include "windows.h"\r
+\r
+#include "magnifier.h"\r
+#include "resource.h"\r
+\r
+#define MAX_LOADSTRING 100\r
+\r
+// Global Variables:\r
+HINSTANCE hInst;                                                               // current instance\r
+HWND hMainWnd;\r
+\r
+TCHAR szTitle[MAX_LOADSTRING];                                 // The title bar text\r
+TCHAR szWindowClass[MAX_LOADSTRING];                   // the main window class name\r
+\r
+#define REPAINT_SPEED  100\r
+\r
+HWND hDesktopWindow = NULL;\r
+\r
+//Current magnified area\r
+POINT cp;\r
+\r
+//Last positions\r
+POINT pMouse;\r
+POINT pCaret;\r
+POINT pFocus;\r
+\r
+// Forward declarations of functions included in this code module:\r
+ATOM                           MyRegisterClass(HINSTANCE hInstance);\r
+BOOL                           InitInstance(HINSTANCE, int);\r
+LRESULT CALLBACK       WndProc(HWND, UINT, WPARAM, LPARAM);\r
+INT_PTR CALLBACK       AboutProc(HWND, UINT, WPARAM, LPARAM);\r
+INT_PTR CALLBACK       OptionsProc(HWND, UINT, WPARAM, LPARAM);\r
+INT_PTR CALLBACK       WarningProc(HWND, UINT, WPARAM, LPARAM);\r
+\r
+int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\r
+{\r
+       UNREFERENCED_PARAMETER(hPrevInstance);\r
+       UNREFERENCED_PARAMETER(lpCmdLine);\r
+\r
+       // TODO: Place code here.\r
+       MSG msg;\r
+       HACCEL hAccelTable;\r
+\r
+       // Initialize global strings\r
+       LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);\r
+       LoadString(hInstance, IDC_MAGNIFIER, szWindowClass, MAX_LOADSTRING);\r
+       MyRegisterClass(hInstance);\r
+\r
+       // Perform application initialization:\r
+       if (!InitInstance (hInstance, nCmdShow))\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MAGNIFIER));\r
+\r
+       // Main message loop:\r
+       while (GetMessage(&msg, NULL, 0, 0))\r
+       {\r
+               if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))\r
+               {\r
+                       TranslateMessage(&msg);\r
+                       DispatchMessage(&msg);\r
+               }\r
+       }\r
+\r
+       return (int) msg.wParam;\r
+}\r
+\r
+\r
+\r
+//\r
+//  FUNCTION: MyRegisterClass()\r
+//\r
+//  PURPOSE: Registers the window class.\r
+//\r
+//  COMMENTS:\r
+//\r
+//    This function and its usage are only necessary if you want this code\r
+//    to be compatible with Win32 systems prior to the 'RegisterClassEx'\r
+//    function that was added to Windows 95. It is important to call this function\r
+//    so that the application will get 'well formed' small icons associated\r
+//    with it.\r
+//\r
+ATOM MyRegisterClass(HINSTANCE hInstance)\r
+{\r
+       WNDCLASSEX wcex;\r
+\r
+       wcex.cbSize = sizeof(WNDCLASSEX);\r
+\r
+       wcex.style                      = CS_HREDRAW | CS_VREDRAW; \r
+       wcex.lpfnWndProc        = WndProc;\r
+       wcex.cbClsExtra         = 0;\r
+       wcex.cbWndExtra         = 0;\r
+       wcex.hInstance          = hInstance;\r
+       wcex.hIcon                      = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAGNIFIER));\r
+       wcex.hCursor            = LoadCursor(NULL, IDC_ARROW);\r
+       wcex.hbrBackground      = (HBRUSH)(COLOR_WINDOW+1);\r
+       wcex.lpszMenuName       = MAKEINTRESOURCE(IDC_MAGNIFIER);\r
+       wcex.lpszClassName      = szWindowClass;\r
+       wcex.hIconSm            = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));\r
+\r
+       return RegisterClassEx(&wcex);\r
+}\r
+\r
+//\r
+//   FUNCTION: InitInstance(HINSTANCE, int)\r
+//\r
+//   PURPOSE: Saves instance handle and creates main window\r
+//\r
+//   COMMENTS:\r
+//\r
+//        In this function, we save the instance handle in a global variable and\r
+//        create and display the main program window.\r
+//\r
+BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)\r
+{\r
+   hInst = hInstance; // Store instance handle in our global variable\r
+\r
+       // Create the Window\r
+   hMainWnd = CreateWindowEx(\r
+           WS_EX_TOPMOST,\r
+               szWindowClass, \r
+               szTitle, \r
+               WS_OVERLAPPEDWINDOW,\r
+               CW_USEDEFAULT, \r
+               CW_USEDEFAULT, \r
+               CW_USEDEFAULT, \r
+               CW_USEDEFAULT, \r
+               NULL, \r
+               NULL, \r
+               hInstance, \r
+               NULL);\r
+\r
+   if (!hMainWnd)\r
+   {\r
+      return FALSE;\r
+   }\r
+\r
+   ShowWindow(hMainWnd, nCmdShow);\r
+   UpdateWindow(hMainWnd);\r
+\r
+   return TRUE;\r
+}\r
+\r
+void Refresh ()\r
+{\r
+       if (!IsIconic(hMainWnd))\r
+       {\r
+               // Invalidate the client area forcing a WM_PAINT message \r
+               InvalidateRgn(hMainWnd, NULL, TRUE); \r
+       }\r
+}\r
+\r
+void Draw(HDC aDc)\r
+{\r
+       HDC desktopHdc = NULL;\r
+       HDC HdcStrech;\r
+       HANDLE hOld;\r
+       HBITMAP HbmpStrech;\r
+\r
+       RECT R;\r
+       RECT appRect;\r
+       DWORD rop = SRCCOPY;\r
+       HCURSOR hCursor;\r
+       CURSORINFO info;\r
+\r
+       desktopHdc = GetWindowDC (hDesktopWindow);\r
+\r
+       GetClientRect(hMainWnd, &appRect);\r
+       GetWindowRect(hDesktopWindow, &R);\r
+\r
+    memset(&info, 0, sizeof(info));\r
+    info.cbSize = sizeof(info);\r
+    GetCursorInfo(&info);\r
+    hCursor = info.hCursor;\r
+\r
+        /* Create a memory DC compatible with client area DC.*/ \r
+       HdcStrech = CreateCompatibleDC(desktopHdc); \r
+          \r
+       /* Create a bitmap compatible with the client area DC.*/ \r
+       HbmpStrech = CreateCompatibleBitmap(\r
+               desktopHdc,\r
+               R.right,\r
+               R.bottom); \r
+\r
+       /* Select our bitmap in memory DC and save the old one.*/ \r
+       hOld = SelectObject (HdcStrech , HbmpStrech);\r
+\r
+       /* Paint the screen bitmap to our in memory DC */\r
+       BitBlt(\r
+               HdcStrech,\r
+               0,\r
+               0,\r
+               R.right,\r
+               R.bottom,\r
+               desktopHdc,\r
+               0,\r
+               0,\r
+               SRCCOPY);\r
+\r
+       /* Draw the mouse pointer in the right position */\r
+       DrawIcon(\r
+               HdcStrech , \r
+               pMouse.x - 10, \r
+               pMouse.y - 10, \r
+               hCursor);\r
+\r
+       int Width = (R.right - R.left);\r
+       int Height = (R.bottom - R.top);\r
+\r
+       int AppWidth = (appRect.right - appRect.left);\r
+       int AppHeight = (appRect.bottom - appRect.top);\r
+\r
+       LONG blitAreaWidth = AppWidth / iZoom;\r
+       LONG blitAreaHeight = AppHeight / iZoom;\r
+\r
+       LONG blitAreaX = (cp.x) - (blitAreaWidth /2);\r
+       LONG blitAreaY = (cp.y) - (blitAreaHeight /2);\r
+\r
+       if (blitAreaX < 0)\r
+       {\r
+          blitAreaX = 0;\r
+       }\r
+\r
+       if (blitAreaY < 0)\r
+       {\r
+          blitAreaY = 0;\r
+       }\r
+\r
+       if (blitAreaX > (Width - blitAreaWidth))\r
+       {\r
+               blitAreaX = (Width - blitAreaWidth);\r
+       }\r
+\r
+       if (blitAreaY > (Height - blitAreaHeight))\r
+       {\r
+               blitAreaY = (Height - blitAreaHeight);\r
+       }\r
+\r
+       if (bInvertColors)\r
+       {\r
+               rop = NOTSRCCOPY;\r
+       }\r
+\r
+       StretchBlt(\r
+               HdcStrech,\r
+               0,\r
+               0,\r
+               AppWidth,\r
+               AppHeight,\r
+               HdcStrech,\r
+               blitAreaX,\r
+               blitAreaY,\r
+               blitAreaWidth,\r
+               blitAreaHeight,\r
+               rop);\r
+\r
+       /* Blast the image from memory DC to client DC.*/ \r
+       BitBlt (\r
+               aDc,\r
+               0 , \r
+               0 , \r
+               AppWidth ,\r
+               AppHeight ,\r
+               HdcStrech ,\r
+               0 ,\r
+               0 , \r
+               SRCCOPY);\r
+\r
+       /* Cleanup.*/ \r
+       SelectObject (HdcStrech, hOld);\r
+       DeleteObject (HbmpStrech);\r
+       DeleteDC (HdcStrech);\r
+}\r
+\r
+//\r
+//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)\r
+//\r
+//  PURPOSE:  Processes messages for the main window.\r
+//\r
+//  WM_COMMAND - process the application menu\r
+//  WM_PAINT   - Paint the main window\r
+//  WM_DESTROY - post a quit message and return\r
+//\r
+//\r
+LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       int wmId, wmEvent;\r
+\r
+       switch (message)\r
+       {\r
+               case WM_TIMER:\r
+               {\r
+                       POINT pNewMouse;\r
+                       POINT pNewCaret;\r
+                       POINT pNewFocus;\r
+\r
+                       //Get current mouse position \r
+                       GetCursorPos (&pNewMouse);\r
+\r
+                       //Get caret position\r
+                       HWND hwnd1 = GetForegroundWindow (); \r
+                       DWORD a = GetWindowThreadProcessId(hwnd1, NULL); \r
+                       DWORD b = GetCurrentThreadId(); \r
+                       AttachThreadInput (a, b, TRUE); \r
+                       HWND hwnd2 = GetFocus(); \r
+\r
+                       GetCaretPos( &pNewCaret); \r
+                       ClientToScreen (hwnd2, (LPPOINT) &pNewCaret); \r
+                       AttachThreadInput (a, b, FALSE); \r
+\r
+                       //Get current control focus\r
+                       HWND hwnd3 = GetFocus ();\r
+                       RECT controlRect;\r
+                       GetWindowRect (hwnd3 , &controlRect);\r
+                       pNewFocus.x = controlRect.left;\r
+                       pNewFocus.y = controlRect.top;\r
+\r
+                       //If mouse has moved ....\r
+                       if (((pMouse.x != pNewMouse.x) || (pMouse.y != pNewMouse.y)) && bFollowMouse)\r
+                       {\r
+                               //Update to new position\r
+                               pMouse = pNewMouse;\r
+                               cp = pNewMouse;\r
+                               Refresh();\r
+                       }\r
+                       else if (((pCaret.x != pNewCaret.x) || (pCaret.y != pNewCaret.y)) && bFollowCaret)\r
+                       {\r
+                               //Update to new position\r
+                               pCaret = pNewCaret;\r
+                               cp = pNewCaret;\r
+                               Refresh();\r
+                       }\r
+                       else if (((pFocus.x != pNewFocus.x) || (pFocus.y != pNewFocus.y)) && bFollowFocus)\r
+                       {\r
+                               //Update to new position\r
+                               pFocus = pNewFocus;\r
+                               cp = pNewFocus;\r
+                               Refresh();\r
+                       }\r
+               }\r
+               break;\r
+       case WM_COMMAND:\r
+               wmId    = LOWORD(wParam);\r
+               wmEvent = HIWORD(wParam);\r
+               // Parse the menu selections:\r
+               switch (wmId)\r
+               {\r
+                       case IDM_OPTIONS:\r
+                               DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOGOPTIONS), hWnd, (DLGPROC)OptionsProc);\r
+                               break;\r
+                       case IDM_ABOUT:\r
+                               DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, (DLGPROC)AboutProc);\r
+                               break;\r
+                       case IDM_EXIT:\r
+                               DestroyWindow(hWnd);\r
+                               break;\r
+                       default:\r
+                               return DefWindowProc(hWnd, message, wParam, lParam);\r
+               }\r
+               break;\r
+   case WM_PAINT:\r
+               {\r
+                       PAINTSTRUCT PaintStruct;\r
+                       HDC dc;\r
+                       dc = BeginPaint(hWnd, &PaintStruct);\r
+                       Draw(dc);\r
+                       EndPaint(hWnd, &PaintStruct);\r
+               }\r
+      break;\r
+   case WM_ERASEBKGND:\r
+               //handle WM_ERASEBKGND by simply returning non-zero because we did all the drawing in WM_PAINT. \r
+          break;\r
+       case WM_DESTROY:\r
+               //Save settings to registry\r
+               SaveSettings ();\r
+               KillTimer (hWnd , 1);\r
+               PostQuitMessage(0);\r
+               break;\r
+       case WM_CREATE:\r
+                       //Load settings from registry\r
+                       LoadSettings ();\r
+\r
+                       //Get the desktop window\r
+                       hDesktopWindow = GetDesktopWindow();\r
+                       \r
+                       if (bShowWarning)\r
+                       {\r
+                               DialogBox (hInst, MAKEINTRESOURCE(IDD_WARNINGDIALOG), hWnd, (DLGPROC)WarningProc);\r
+                       }\r
+\r
+                       if (bStartMinimized)\r
+                       {\r
+                               ShowWindow (hMainWnd, SW_MINIMIZE );\r
+                       }\r
+                       \r
+                       //Set the timer \r
+                       SetTimer (hWnd , 1, REPAINT_SPEED , NULL);\r
+                       break;\r
+       default:\r
+               return DefWindowProc(hWnd, message, wParam, lParam);\r
+       }\r
+       return 0;\r
+}\r
+\r
+// Message handler for about box.\r
+INT_PTR CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       UNREFERENCED_PARAMETER(lParam);\r
+       switch (message)\r
+       {\r
+       case WM_INITDIALOG:\r
+               return (INT_PTR)TRUE;\r
+\r
+       case WM_COMMAND:\r
+               if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)\r
+               {\r
+                       EndDialog(hDlg, LOWORD(wParam));\r
+                       return (INT_PTR)TRUE;\r
+               }\r
+               break;\r
+       }\r
+       return (INT_PTR)FALSE;\r
+}\r
+\r
+// Message handler for options box.\r
+INT_PTR CALLBACK OptionsProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       UNREFERENCED_PARAMETER(lParam);\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG:\r
+               {\r
+                       //Add the zoom items....\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("1"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("2"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("3"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("4"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("5"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("6"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("7"));\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_ADDSTRING, 0, (LPARAM)("8"));\r
+\r
+                       //\r
+                       SendDlgItemMessage(hDlg, IDC_ZOOM, CB_SETCURSEL, iZoom - 1, 0);\r
+\r
+                       if (bFollowMouse)\r
+                               SendDlgItemMessage(hDlg,IDC_FOLLOWMOUSECHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       if (bFollowFocus)\r
+                               SendDlgItemMessage(hDlg,IDC_FOLOWKEYBOARDCHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       if (bFollowCaret)\r
+                               SendDlgItemMessage(hDlg,IDC_FOLLOWTEXTEDITINGCHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       if (bInvertColors)\r
+                               SendDlgItemMessage(hDlg,IDC_INVERTCOLORSCHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       if (bStartMinimized)\r
+                               SendDlgItemMessage(hDlg,IDC_STARTMINIMIZEDCHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       if (bShowMagnifier)\r
+                               SendDlgItemMessage(hDlg,IDC_SHOWMAGNIFIERCHECK,BM_SETCHECK , wParam ,0);\r
+\r
+                       return (INT_PTR)TRUE;\r
+               }\r
+       case WM_COMMAND:\r
+               if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)\r
+               {\r
+                       EndDialog(hDlg, LOWORD(wParam));\r
+                       return (INT_PTR)TRUE;\r
+               }\r
+               if (LOWORD(wParam) == IDOK)\r
+               {\r
+               }\r
+               if (LOWORD(wParam) == IDHELP)\r
+               {\r
+                       MessageBox(hDlg , TEXT("Magnifier help not available yet!") , TEXT("Help") , MB_OK);\r
+               }\r
+               switch(LOWORD(wParam))\r
+               {\r
+            case IDC_ZOOM:\r
+                               if(HIWORD(wParam) == CBN_SELCHANGE) \r
+                               { \r
+                                       HWND hCombo = GetDlgItem(hDlg,IDC_ZOOM);\r
+\r
+                                       /* Get index of current selection and the text of that selection. */ \r
+                                       iZoom = SendMessage( hCombo, CB_GETCURSEL, (WPARAM) wParam, (LPARAM) lParam ) + 1;\r
+\r
+                                       //Update the magnigier UI\r
+                                       Refresh ();\r
+                               }\r
+                               break;\r
+                       case IDC_INVERTCOLORSCHECK:\r
+                               bInvertColors = IsDlgButtonChecked (hDlg, IDC_INVERTCOLORSCHECK);\r
+                               Refresh ();\r
+                               break;\r
+                       case IDC_FOLLOWMOUSECHECK:\r
+                               bFollowMouse = IsDlgButtonChecked (hDlg, IDC_FOLLOWMOUSECHECK);\r
+                               break;\r
+                       case IDC_FOLOWKEYBOARDCHECK:\r
+                               bFollowFocus = IsDlgButtonChecked (hDlg, IDC_FOLOWKEYBOARDCHECK);\r
+                               break;\r
+                       case IDC_FOLLOWTEXTEDITINGCHECK:\r
+                               bFollowCaret = IsDlgButtonChecked (hDlg, IDC_FOLLOWTEXTEDITINGCHECK);\r
+                               break;\r
+                       case IDC_STARTMINIMIZEDCHECK:\r
+                               bStartMinimized = IsDlgButtonChecked (hDlg, IDC_STARTMINIMIZEDCHECK);\r
+                               break;\r
+                       case IDC_SHOWMAGNIFIER:\r
+                               bShowMagnifier = IsDlgButtonChecked (hDlg, IDC_SHOWMAGNIFIERCHECK);\r
+                               if (bShowMagnifier){\r
+                                       ShowWindow (hMainWnd , SW_SHOW);\r
+                               }else{\r
+                                       ShowWindow (hMainWnd , SW_HIDE);\r
+                               }\r
+                               break;\r
+               }\r
+       }\r
+       return (INT_PTR)FALSE;\r
+}\r
+\r
+// Message handler for warning box.\r
+INT_PTR CALLBACK WarningProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+{\r
+       UNREFERENCED_PARAMETER(lParam);\r
+\r
+       switch (message)\r
+       {\r
+               case WM_INITDIALOG:\r
+                       return (INT_PTR)TRUE;\r
+               case WM_COMMAND:\r
+                       switch(LOWORD(wParam))\r
+                       {\r
+                               case IDC_SHOWWARNINGCHECK:\r
+                                       bShowWarning = !IsDlgButtonChecked (hDlg, IDC_SHOWWARNINGCHECK);\r
+                                       break;\r
+                       }\r
+                       if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)\r
+                       {\r
+                               EndDialog(hDlg, LOWORD(wParam));\r
+                               return (INT_PTR)TRUE;\r
+                       }\r
+                       break;\r
+       }\r
+       return (INT_PTR)FALSE;\r
+}\r
diff --git a/rosapps/magnify/magnifier.h b/rosapps/magnify/magnifier.h
new file mode 100644 (file)
index 0000000..c44b417
--- /dev/null
@@ -0,0 +1,36 @@
+/*\r
+ * WineCalc (magnifier.h)\r
+ *\r
+ * Copyright 2007 Marc Piulachs\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Lesser General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Lesser General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; if not, write to the Free Software\r
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ */\r
+\r
+//////////////////////////////////////////////////////////////////\r
+\r
+int iZoom;\r
+\r
+BOOL bShowWarning;\r
+\r
+BOOL bFollowMouse;\r
+BOOL bFollowFocus;\r
+BOOL bFollowCaret;\r
+\r
+BOOL bInvertColors;\r
+BOOL bStartMinimized;\r
+BOOL bShowMagnifier;\r
+\r
+void LoadSettings();\r
+void SaveSettings();\r
diff --git a/rosapps/magnify/magnify.rbuild b/rosapps/magnify/magnify.rbuild
new file mode 100644 (file)
index 0000000..64b8e1d
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>\r
+<!DOCTYPE project SYSTEM "tools/rbuild/project.dtd">\r
+<module name="magnify" type="win32gui" installbase="system32" installname="magnify.exe">\r
+       <include base="magnify">.</include>\r
+       <define name="__USE_W32API" />\r
+       <define name="_WIN32_IE">0x0600</define>\r
+       <define name="_WIN32_WINNT">0x0501</define>\r
+       <library>user32</library>\r
+       <library>gdi32</library>\r
+       <library>advapi32</library>\r
+       <library>shell32</library>\r
+       <library>kernel32</library>\r
+       <file>magnifier.c</file>\r
+       <file>settings.c</file>\r
+       <file>magnify.rc</file>\r
+</module>\r
diff --git a/rosapps/magnify/magnify.rc b/rosapps/magnify/magnify.rc
new file mode 100644 (file)
index 0000000..013ee38
--- /dev/null
@@ -0,0 +1,11 @@
+#include <windows.h>\r
+#include <commctrl.h>\r
+#include "resource.h"\r
+\r
+#define REACTOS_STR_FILE_DESCRIPTION    "ReactOS Magnifier\0"\r
+#define REACTOS_STR_INTERNAL_NAME       "magnify\0"\r
+#define REACTOS_STR_ORIGINAL_FILENAME   "magnify.exe\0"\r
+\r
+#include <reactos/version.rc>\r
+\r
+#include "lang/en-US.rc"\r
diff --git a/rosapps/magnify/res/magnify.ico b/rosapps/magnify/res/magnify.ico
new file mode 100644 (file)
index 0000000..95a8ed6
Binary files /dev/null and b/rosapps/magnify/res/magnify.ico differ
diff --git a/rosapps/magnify/resource.h b/rosapps/magnify/resource.h
new file mode 100644 (file)
index 0000000..7877193
--- /dev/null
@@ -0,0 +1,43 @@
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Visual C++ generated include file.\r
+// Used by Magnifier.rc\r
+//\r
+#define IDC_MYICON                      2\r
+#define IDD_MAGNIFIER_DIALOG            102\r
+#define IDS_APP_TITLE                   103\r
+#define IDD_ABOUTBOX                    103\r
+#define IDM_ABOUT                       104\r
+#define IDM_EXIT                        105\r
+#define IDI_MAGNIFIER                   107\r
+#define IDI_SMALL                       108\r
+#define IDC_MAGNIFIER                   109\r
+#define IDR_MAINFRAME                   128\r
+#define IDD_DIALOGOPTIONS               129\r
+#define IDD_WARNINGDIALOG               130\r
+#define IDC_ZOOM                        1000\r
+#define IDC_CHECK1                      1001\r
+#define IDC_FOLOWKEYBOARDCHECK          1002\r
+#define IDC_FOLLOWTEXTEDITINGCHECK      1003\r
+#define IDC_INVERTCOLORSCHECK           1004\r
+#define IDC_STARTMINIMIZEDCHECK         1005\r
+#define IDC_SHOWMAGNIFIER               1006\r
+#define IDC_SHOWMAGNIFIERCHECK          1006\r
+#define IDC_FOLLOWMOUSECHECK            1007\r
+#define IDC_SHOWWARNINGCHECK            1009\r
+#define IDC_BUTTON1                     1008\r
+#define ID_FILE_OPTIONS                 32771\r
+#define ID_OPTIONS                      32772\r
+#define IDM_OPTIONS                     32773\r
+#define IDC_STATIC                      -1\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NO_MFC                     1\r
+#define _APS_NEXT_RESOURCE_VALUE        131\r
+#define _APS_NEXT_COMMAND_VALUE         32774\r
+#define _APS_NEXT_CONTROL_VALUE         1009\r
+#define _APS_NEXT_SYMED_VALUE           110\r
+#endif\r
+#endif\r
diff --git a/rosapps/magnify/settings.c b/rosapps/magnify/settings.c
new file mode 100644 (file)
index 0000000..a6019f8
--- /dev/null
@@ -0,0 +1,89 @@
+#include <windows.h>\r
+#include <tchar.h>\r
+#include "magnifier.h"\r
+\r
+int iZoom = 3;\r
+\r
+BOOL bShowWarning = TRUE;\r
+\r
+BOOL bFollowMouse = TRUE;\r
+BOOL bFollowFocus = TRUE;\r
+BOOL bFollowCaret = TRUE;\r
+\r
+BOOL bInvertColors = FALSE;\r
+BOOL bStartMinimized = FALSE;\r
+BOOL bShowMagnifier = TRUE;\r
+\r
+void LoadSettings()\r
+{\r
+       HKEY hkey;\r
+       LONG value;\r
+       ULONG len;\r
+\r
+       RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Magnify"), 0,\r
+               _T(""), 0, KEY_READ, NULL, &hkey, NULL);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryMagLevel"),  0, 0, (BYTE *)&value, &len))\r
+       {\r
+               if(value >= 0 && value <= 9)\r
+                       iZoom  = value;\r
+       }\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("ShowWarning"), 0, 0, (BYTE *)&value, &len))\r
+               bShowWarning = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryInvertColors"), 0, 0, (BYTE *)&value, &len))\r
+               bInvertColors = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryStartMinimized"), 0, 0, (BYTE *)&value, &len))\r
+               bStartMinimized = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryTrackCursor"), 0, 0, (BYTE *)&value, &len))\r
+               bFollowMouse = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryTrackFocus"), 0, 0, (BYTE *)&value, &len))\r
+               bFollowFocus = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryTrackSecondaryFocus"), 0, 0, (BYTE *)&value, &len))\r
+               bFollowFocus = (value == 0 ? FALSE : TRUE);\r
+\r
+       if(ERROR_SUCCESS == RegQueryValueEx(hkey, _T("StationaryTrackText"), 0, 0, (BYTE *)&value, &len))\r
+               bFollowCaret = (value == 0 ? FALSE : TRUE);\r
+\r
+       RegCloseKey(hkey);\r
+}\r
+\r
+void SaveSettings()\r
+{\r
+       HKEY hkey;\r
+       LONG value;\r
+\r
+       RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Magnify"), 0,\r
+               _T(""), 0, KEY_WRITE, NULL, &hkey, NULL);\r
+\r
+       value = iZoom;\r
+       RegSetValueEx(hkey, _T("StationaryMagLevel"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bShowWarning;\r
+       RegSetValueEx(hkey, _T("ShowWarning"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bInvertColors;\r
+       RegSetValueEx(hkey, _T("StationaryInvertColors"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bStartMinimized;\r
+       RegSetValueEx(hkey, _T("StationaryStartMinimized"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bFollowMouse;\r
+       RegSetValueEx(hkey, _T("StationaryTrackCursor"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bFollowFocus;\r
+       RegSetValueEx(hkey, _T("StationaryTrackFocus"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bFollowFocus;\r
+       RegSetValueEx(hkey, _T("StationaryTrackSecondaryFocus"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       value = bFollowCaret;\r
+       RegSetValueEx(hkey, _T("StationaryTrackText"), 0, REG_DWORD, (BYTE *)&value, sizeof value);\r
+\r
+       RegCloseKey(hkey);\r
+}\r