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