mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 04:20:46 +00:00
[MAGNIFY]
* Implement AppBar docking (defaults to floating because we don't properly support AppBars yet -- works in Windows). * Implement loading and saving the AppBar settings from the registry. * Remove the minimize button from the options dialog. CORE-10691 svn path=/trunk/; revision=70344
This commit is contained in:
parent
e30338c882
commit
2dbcc6fba0
23 changed files with 419 additions and 90 deletions
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 210, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Настройки на увеличителя"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Einstellungen"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Magnifier Settings"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -33,7 +33,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Configurar lupa"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Paramètres de la loupe"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -31,7 +31,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "הגדרות זכוכית מגדלת"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Impostazioni di Magnifier"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "拡大鏡の設定"
|
||||
FONT 9, "MS UI Gothic", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Forstørrelse Innstilling"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -37,7 +37,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Ustawienia"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -31,7 +31,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Configurações da Lupa"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -31,7 +31,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Configurare lupă"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 185, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Параметры"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -34,7 +34,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Nastavenia Lupy"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -33,7 +33,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Konfigurimet e zmadhuesit"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -29,7 +29,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Förstoringsglaset Inställning"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -37,7 +37,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Seçenekler"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -37,7 +37,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Параметри екранної лупи"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -37,7 +37,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "放大镜设定"
|
||||
FONT 9, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -37,7 +37,7 @@ BEGIN
|
|||
END
|
||||
|
||||
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "放大鏡設定"
|
||||
FONT 9, "MS Shell Dlg", 400, 0, 0x1
|
||||
BEGIN
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
* David Quintana <gigaherz@gmail.com>
|
||||
*/
|
||||
|
||||
/* TODO: AppBar */
|
||||
/* TODO: Support AppBar types other than ABE_TOP */
|
||||
|
||||
#include "magnifier.h"
|
||||
|
||||
#include <winbase.h>
|
||||
|
@ -20,14 +21,16 @@
|
|||
|
||||
#include "resource.h"
|
||||
|
||||
const TCHAR szWindowClass[] = TEXT("MAGNIFIER");
|
||||
#define APPMSG_NOTIFYICON (WM_APP+1)
|
||||
#define APPMSG_APPBAR (WM_APP+2)
|
||||
|
||||
#define MAX_LOADSTRING 100
|
||||
const TCHAR szWindowClass[] = TEXT("MAGNIFIER");
|
||||
|
||||
/* Global Variables */
|
||||
HINSTANCE hInst;
|
||||
HWND hMainWnd;
|
||||
|
||||
#define MAX_LOADSTRING 100
|
||||
TCHAR szTitle[MAX_LOADSTRING];
|
||||
|
||||
#define TIMER_SPEED 1
|
||||
|
@ -37,19 +40,19 @@ DWORD lastTicks = 0;
|
|||
|
||||
HWND hDesktopWindow = NULL;
|
||||
|
||||
#define APPMSG_NOTIFYICON (WM_APP+1)
|
||||
HICON notifyIcon;
|
||||
NOTIFYICONDATA nid;
|
||||
HICON notifyIcon;
|
||||
HMENU notifyMenu;
|
||||
HWND hOptionsDialog;
|
||||
BOOL bOptionsDialog = FALSE;
|
||||
|
||||
BOOL bRecreateOffscreenDC = TRUE;
|
||||
LONG sourceWidth = 0;
|
||||
LONG sourceHeight = 0;
|
||||
HDC hdcOffscreen = NULL;
|
||||
HANDLE hbmpOld;
|
||||
HWND hOptionsDialog;
|
||||
BOOL bOptionsDialog = FALSE;
|
||||
BOOL bRecreateOffscreenDC = TRUE;
|
||||
LONG sourceWidth = 0;
|
||||
LONG sourceHeight = 0;
|
||||
HDC hdcOffscreen = NULL;
|
||||
HBITMAP hbmpOffscreen = NULL;
|
||||
HANDLE hbmpOld;
|
||||
POINT ptDragOffset;
|
||||
INT nearEdge;
|
||||
|
||||
/* Current magnified area */
|
||||
POINT cp;
|
||||
|
@ -132,23 +135,158 @@ ATOM MyRegisterClass(HINSTANCE hInstance)
|
|||
return RegisterClass(&wc);
|
||||
}
|
||||
|
||||
void DoAppBarStuff(DWORD mode)
|
||||
{
|
||||
UINT uState;
|
||||
APPBARDATA data = {0};
|
||||
data.cbSize = sizeof(data);
|
||||
data.hWnd = hMainWnd;
|
||||
data.uCallbackMessage = APPMSG_APPBAR;
|
||||
|
||||
if (mode == ABM_NEW || mode == ABM_SETPOS)
|
||||
{
|
||||
HWND hWndOrder = HWND_BOTTOM;
|
||||
int rcw, rch;
|
||||
RECT rcWorkArea;
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
||||
|
||||
if(mode == ABM_NEW)
|
||||
{
|
||||
SHAppBarMessage(ABM_NEW, &data);
|
||||
|
||||
switch(AppBarConfig.uEdge)
|
||||
{
|
||||
case ABE_LEFT:
|
||||
data.rc.top = rcWorkArea.top;
|
||||
data.rc.bottom = rcWorkArea.bottom;
|
||||
data.rc.left = rcWorkArea.left;
|
||||
data.rc.right = data.rc.left + AppBarConfig.appBarSizes.left;
|
||||
break;
|
||||
case ABE_TOP:
|
||||
data.rc.left = rcWorkArea.left;
|
||||
data.rc.right = rcWorkArea.right;
|
||||
data.rc.top = rcWorkArea.top;
|
||||
data.rc.bottom = data.rc.top + AppBarConfig.appBarSizes.top;
|
||||
break;
|
||||
case ABE_RIGHT:
|
||||
data.rc.top = rcWorkArea.top;
|
||||
data.rc.bottom = rcWorkArea.bottom;
|
||||
data.rc.right = rcWorkArea.left;
|
||||
data.rc.left = data.rc.right - AppBarConfig.appBarSizes.right;
|
||||
break;
|
||||
case ABE_BOTTOM:
|
||||
data.rc.left = rcWorkArea.left;
|
||||
data.rc.right = rcWorkArea.right;
|
||||
data.rc.bottom = rcWorkArea.bottom;
|
||||
data.rc.top = data.rc.bottom - AppBarConfig.appBarSizes.bottom;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GetWindowRect(hMainWnd, &data.rc);
|
||||
}
|
||||
|
||||
data.uEdge = AppBarConfig.uEdge;
|
||||
uState = SHAppBarMessage(ABM_QUERYPOS, &data);
|
||||
|
||||
uState = SHAppBarMessage(ABM_SETPOS, &data);
|
||||
|
||||
rcw = data.rc.right-data.rc.left;
|
||||
rch = data.rc.bottom-data.rc.top;
|
||||
|
||||
uState = SHAppBarMessage(ABM_GETSTATE, &data);
|
||||
if(uState & ABS_ALWAYSONTOP)
|
||||
hWndOrder = HWND_TOPMOST;
|
||||
|
||||
SetWindowPos(hMainWnd, hWndOrder, data.rc.left, data.rc.top, rcw, rch, SWP_SHOWWINDOW|SWP_NOCOPYBITS);
|
||||
|
||||
}
|
||||
else if(mode == ABM_GETSTATE)
|
||||
{
|
||||
HWND hWndOrder = HWND_BOTTOM;
|
||||
uState = SHAppBarMessage(ABM_GETSTATE, &data);
|
||||
if(uState & ABS_ALWAYSONTOP)
|
||||
hWndOrder = HWND_TOPMOST;
|
||||
SetWindowPos(hMainWnd, hWndOrder, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
|
||||
}
|
||||
else if(mode == ABM_ACTIVATE)
|
||||
{
|
||||
SHAppBarMessage(ABM_ACTIVATE, &data);
|
||||
}
|
||||
else if(mode == ABM_WINDOWPOSCHANGED)
|
||||
{
|
||||
SHAppBarMessage(ABM_WINDOWPOSCHANGED, &data);
|
||||
}
|
||||
else if(mode == ABM_REMOVE)
|
||||
{
|
||||
SHAppBarMessage(ABM_REMOVE, &data);
|
||||
}
|
||||
}
|
||||
|
||||
void AttachAppBar(INT uEdge)
|
||||
{
|
||||
if (AppBarConfig.uEdge == uEdge)
|
||||
return;
|
||||
|
||||
if(AppBarConfig.uEdge < 0 && uEdge >= 0)
|
||||
{
|
||||
SetWindowLongPtr(hMainWnd, GWL_STYLE, GetWindowLongPtr(hMainWnd, GWL_STYLE) & (~WS_CAPTION));
|
||||
}
|
||||
else if(uEdge < 0 && AppBarConfig.uEdge>=0)
|
||||
{
|
||||
SetWindowLongPtr(hMainWnd, GWL_STYLE, GetWindowLongPtr(hMainWnd, GWL_STYLE) | WS_CAPTION);
|
||||
SetWindowPos(hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
|
||||
}
|
||||
|
||||
if(AppBarConfig.uEdge >= 0)
|
||||
{
|
||||
DoAppBarStuff(ABM_REMOVE);
|
||||
}
|
||||
|
||||
if (uEdge >=0)
|
||||
{
|
||||
AppBarConfig.uEdge = uEdge;
|
||||
DoAppBarStuff(ABM_NEW);
|
||||
}
|
||||
else
|
||||
{
|
||||
RECT rc = AppBarConfig.rcFloating;
|
||||
SetWindowPos(hMainWnd, HWND_TOPMOST, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, 0);
|
||||
}
|
||||
|
||||
AppBarConfig.uEdge = uEdge;
|
||||
}
|
||||
|
||||
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
||||
{
|
||||
RECT rcWorkArea;
|
||||
RECT rc;
|
||||
DWORD exStyles = WS_EX_TOOLWINDOW | WS_EX_CONTROLPARENT;
|
||||
DWORD dwStyles = WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP;
|
||||
|
||||
/* Load settings from registry */
|
||||
LoadSettings();
|
||||
|
||||
rc = AppBarConfig.rcFloating;
|
||||
|
||||
hInst = hInstance; // Store instance handle in our global variable
|
||||
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
||||
if (AppBarConfig.uEdge<0)
|
||||
{
|
||||
dwStyles |= WS_CAPTION;
|
||||
exStyles |= WS_EX_TOPMOST;
|
||||
}
|
||||
|
||||
/* Create the Window */
|
||||
hMainWnd = CreateWindowEx(
|
||||
WS_EX_TOPMOST | WS_EX_PALETTEWINDOW,
|
||||
exStyles,
|
||||
szWindowClass,
|
||||
szTitle,
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
(rcWorkArea.right - rcWorkArea.left) * 2 / 3,
|
||||
200,
|
||||
dwStyles,
|
||||
rc.left,
|
||||
rc.top,
|
||||
rc.right-rc.left,
|
||||
rc.bottom-rc.top,
|
||||
NULL,
|
||||
NULL,
|
||||
hInstance,
|
||||
|
@ -157,12 +295,16 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
|
|||
if (!hMainWnd)
|
||||
return FALSE;
|
||||
|
||||
ShowWindow(hMainWnd, bStartMinimized ? SW_MINIMIZE : nCmdShow);
|
||||
UpdateWindow(hMainWnd);
|
||||
if (AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_NEW);
|
||||
else SetWindowPos(hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);
|
||||
|
||||
// Windows 2003's Magnifier always shows this dialog, and exits when the dialog isclosed.
|
||||
// Should we add a custom means to prevent opening it?
|
||||
// In Windows 2003's Magnifier, the "Start Minimized" setting
|
||||
// refers exclusively to the options dialog, not the main window itself.
|
||||
hOptionsDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOGOPTIONS), hMainWnd, OptionsProc);
|
||||
if (bStartMinimized)
|
||||
ShowWindow(hOptionsDialog, SW_HIDE);
|
||||
else
|
||||
ShowWindow(hOptionsDialog, SW_SHOW);
|
||||
|
||||
if (bShowWarning)
|
||||
DialogBox(hInstance, MAKEINTRESOURCE(IDD_WARNINGDIALOG), hMainWnd, WarningProc);
|
||||
|
@ -363,8 +505,10 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
//Get current mouse position
|
||||
GetCursorPos (&pNewMouse);
|
||||
|
||||
#define PointsAreEqual(pt1, pt2) (((pt1).x == (pt2).x) && ((pt1).y == (pt2).y))
|
||||
|
||||
//If mouse has moved ...
|
||||
if (((pMouse.x != pNewMouse.x) || (pMouse.y != pNewMouse.y)))
|
||||
if (!PointsAreEqual(pMouse, pNewMouse))
|
||||
{
|
||||
//Update to new position
|
||||
pMouse = pNewMouse;
|
||||
|
@ -373,44 +517,63 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
}
|
||||
}
|
||||
|
||||
if (bFollowCaret && guiInfo.hwndCaret)
|
||||
if(guiInfo.hwndActive != hMainWnd)
|
||||
{
|
||||
POINT ptCaret;
|
||||
ptCaret.x = (guiInfo.rcCaret.left + guiInfo.rcCaret.right) / 2;
|
||||
ptCaret.y = (guiInfo.rcCaret.top + guiInfo.rcCaret.bottom) / 2;
|
||||
|
||||
if (guiInfo.hwndCaret && ((pCaretWnd != guiInfo.hwndCaret) || (pCaret.x != ptCaret.x) || (pCaret.y != ptCaret.y)))
|
||||
if (bFollowCaret)
|
||||
{
|
||||
//Update to new position
|
||||
pCaret = ptCaret;
|
||||
pCaretWnd = guiInfo.hwndCaret;
|
||||
if(!hasMoved)
|
||||
if (guiInfo.hwndCaret)
|
||||
{
|
||||
ClientToScreen (guiInfo.hwndCaret, (LPPOINT) &ptCaret);
|
||||
cp = ptCaret;
|
||||
POINT ptCaret;
|
||||
ptCaret.x = (guiInfo.rcCaret.left + guiInfo.rcCaret.right) / 2;
|
||||
ptCaret.y = (guiInfo.rcCaret.top + guiInfo.rcCaret.bottom) / 2;
|
||||
|
||||
if ((pCaretWnd != guiInfo.hwndCaret) || !PointsAreEqual(pCaret, ptCaret))
|
||||
{
|
||||
//Update to new position
|
||||
pCaret = ptCaret;
|
||||
pCaretWnd = guiInfo.hwndCaret;
|
||||
if(!hasMoved)
|
||||
{
|
||||
ClientToScreen (guiInfo.hwndCaret, (LPPOINT) &ptCaret);
|
||||
cp = ptCaret;
|
||||
hasMoved = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pCaretWnd = NULL;
|
||||
}
|
||||
hasMoved = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (bFollowFocus && guiInfo.hwndFocus)
|
||||
{
|
||||
POINT ptFocus;
|
||||
RECT activeRect;
|
||||
|
||||
//Get current control focus
|
||||
GetWindowRect (guiInfo.hwndFocus, &activeRect);
|
||||
ptFocus.x = (activeRect.left + activeRect.right) / 2;
|
||||
ptFocus.y = (activeRect.top + activeRect.bottom) / 2;
|
||||
|
||||
if(guiInfo.hwndFocus && ((guiInfo.hwndFocus != pFocusWnd) || (pFocus.x != ptFocus.x) || (pFocus.y != ptFocus.y)))
|
||||
if (bFollowFocus)
|
||||
{
|
||||
//Update to new position
|
||||
pFocus = ptFocus;
|
||||
pFocusWnd = guiInfo.hwndFocus;
|
||||
if(!hasMoved)
|
||||
cp = ptFocus;
|
||||
hasMoved = TRUE;
|
||||
if(guiInfo.hwndFocus && !guiInfo.hwndCaret)
|
||||
{
|
||||
POINT ptFocus;
|
||||
RECT activeRect;
|
||||
|
||||
//Get current control focus
|
||||
GetWindowRect(guiInfo.hwndFocus, &activeRect);
|
||||
ptFocus.x = (activeRect.left + activeRect.right) / 2;
|
||||
ptFocus.y = (activeRect.top + activeRect.bottom) / 2;
|
||||
|
||||
if((guiInfo.hwndFocus != pFocusWnd) || !PointsAreEqual(pFocus, ptFocus))
|
||||
{
|
||||
//Update to new position
|
||||
pFocus = ptFocus;
|
||||
pFocusWnd = guiInfo.hwndFocus;
|
||||
if(!hasMoved)
|
||||
{
|
||||
cp = ptFocus;
|
||||
hasMoved = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pFocusWnd = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -429,8 +592,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
lastTicks = GetTickCount();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_COMMAND:
|
||||
{
|
||||
|
@ -457,7 +621,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
break;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case WM_PAINT:
|
||||
|
@ -467,24 +631,117 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
dc = BeginPaint(hWnd, &PaintStruct);
|
||||
Draw(dc);
|
||||
EndPaint(hWnd, &PaintStruct);
|
||||
break;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case WM_CONTEXTMENU:
|
||||
TrackPopupMenu(notifyMenu, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL);
|
||||
return 0;
|
||||
|
||||
case WM_LBUTTONDOWN:
|
||||
{
|
||||
RECT rc;
|
||||
POINT pt;
|
||||
SetCapture(hWnd);
|
||||
|
||||
GetCursorPos(&pt);
|
||||
GetWindowRect(hWnd, &rc);
|
||||
ptDragOffset.x = pt.x - rc.left;
|
||||
ptDragOffset.y = pt.y - rc.top;
|
||||
|
||||
nearEdge = AppBarConfig.uEdge;
|
||||
|
||||
break;
|
||||
}
|
||||
case WM_MOUSEMOVE:
|
||||
if(GetCapture() == hWnd)
|
||||
{
|
||||
RECT rc;
|
||||
POINT pt;
|
||||
RECT rcWorkArea;
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0);
|
||||
GetCursorPos(&pt);
|
||||
GetWindowRect(hWnd, &rc);
|
||||
|
||||
if(AppBarConfig.uEdge>=0)
|
||||
{
|
||||
if (pt.x >= rcWorkArea.left && pt.x <= rcWorkArea.right &&
|
||||
pt.y >= rcWorkArea.top && pt.y <= rcWorkArea.bottom)
|
||||
{
|
||||
AttachAppBar(-2);
|
||||
|
||||
// Fixup offset
|
||||
GetWindowRect(hWnd, &rc);
|
||||
ptDragOffset.x = (rc.right-rc.left)/2;
|
||||
ptDragOffset.y = 2;
|
||||
|
||||
rc.left = pt.x - ptDragOffset.x;
|
||||
rc.top = pt.y - ptDragOffset.y;
|
||||
|
||||
SetWindowPos(hWnd, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(pt.x <= rcWorkArea.left+8 && nearEdge != ABE_LEFT)
|
||||
{
|
||||
AttachAppBar(ABE_LEFT);
|
||||
nearEdge = ABE_LEFT;
|
||||
}
|
||||
else if(pt.y <= rcWorkArea.top+8 && nearEdge != ABE_TOP)
|
||||
{
|
||||
AttachAppBar(ABE_TOP);
|
||||
nearEdge = ABE_TOP;
|
||||
}
|
||||
else if(pt.x >= rcWorkArea.right-8 && nearEdge != ABE_RIGHT)
|
||||
{
|
||||
AttachAppBar(ABE_RIGHT);
|
||||
nearEdge = ABE_RIGHT;
|
||||
}
|
||||
else if(pt.y >= rcWorkArea.bottom-8 && nearEdge != ABE_BOTTOM)
|
||||
{
|
||||
AttachAppBar(ABE_BOTTOM);
|
||||
nearEdge = ABE_BOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
rc.left = pt.x - ptDragOffset.x;
|
||||
rc.top = pt.y - ptDragOffset.y;
|
||||
|
||||
SetWindowPos(hWnd, HWND_TOPMOST, rc.left, rc.top, 0, 0, SWP_NOSIZE);
|
||||
nearEdge = -1;
|
||||
}
|
||||
}
|
||||
|
||||
pMouse = pt;
|
||||
Refresh();
|
||||
}
|
||||
break;
|
||||
case WM_LBUTTONUP:
|
||||
if(GetCapture() == hWnd)
|
||||
{
|
||||
if (AppBarConfig.uEdge>=0)
|
||||
DoAppBarStuff(ABM_GETSTATE);
|
||||
else
|
||||
SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
|
||||
ReleaseCapture();
|
||||
}
|
||||
|
||||
case WM_SIZE:
|
||||
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_SETPOS);
|
||||
/* fallthrough */
|
||||
case WM_DISPLAYCHANGE:
|
||||
bRecreateOffscreenDC = TRUE;
|
||||
Refresh();
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
break;
|
||||
|
||||
case WM_ERASEBKGND:
|
||||
// handle WM_ERASEBKGND by simply returning non-zero because we did all the drawing in WM_PAINT.
|
||||
break;
|
||||
return 0;
|
||||
|
||||
case WM_DESTROY:
|
||||
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_REMOVE);
|
||||
|
||||
/* Save settings to registry */
|
||||
SaveSettings();
|
||||
KillTimer(hWnd , 1);
|
||||
|
@ -501,15 +758,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
DestroyIcon(notifyIcon);
|
||||
|
||||
DestroyWindow(hOptionsDialog);
|
||||
break;
|
||||
return 0;
|
||||
|
||||
case WM_CREATE:
|
||||
{
|
||||
HMENU tempMenu;
|
||||
|
||||
/* Load settings from registry */
|
||||
LoadSettings();
|
||||
|
||||
/* Get the desktop window */
|
||||
hDesktopWindow = GetDesktopWindow();
|
||||
|
||||
|
@ -531,20 +785,57 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
notifyMenu = GetSubMenu(tempMenu, 0);
|
||||
RemoveMenu(tempMenu, 0, MF_BYPOSITION);
|
||||
DestroyMenu(tempMenu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
case APPMSG_APPBAR:
|
||||
{
|
||||
switch (wParam)
|
||||
{
|
||||
case ABN_STATECHANGE:
|
||||
DoAppBarStuff(ABM_GETSTATE);
|
||||
break;
|
||||
case ABN_POSCHANGED:
|
||||
DoAppBarStuff(ABM_SETPOS);
|
||||
break;
|
||||
case ABN_FULLSCREENAPP:
|
||||
{
|
||||
if(!lParam)
|
||||
{
|
||||
DoAppBarStuff(ABM_GETSTATE);
|
||||
break;
|
||||
}
|
||||
|
||||
SetWindowPos(hMainWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
|
||||
break;
|
||||
}
|
||||
case ABN_WINDOWARRANGE:
|
||||
if(lParam)
|
||||
ShowWindow(hMainWnd, SW_HIDE);
|
||||
else
|
||||
ShowWindow(hMainWnd, SW_SHOW);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
case APPMSG_NOTIFYICON:
|
||||
HandleNotifyIconMessage(hWnd, wParam, lParam);
|
||||
return 0;
|
||||
|
||||
case WM_ACTIVATE:
|
||||
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_ACTIVATE);
|
||||
break;
|
||||
|
||||
case WM_WINDOWPOSCHANGED:
|
||||
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_WINDOWPOSCHANGED);
|
||||
Refresh();
|
||||
break;
|
||||
|
||||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||||
|
|
|
@ -26,6 +26,16 @@
|
|||
|
||||
extern int iZoom;
|
||||
|
||||
struct _AppBarConfig_t {
|
||||
DWORD cbSize;
|
||||
INT uEdge;
|
||||
DWORD value3;
|
||||
DWORD value4;
|
||||
RECT appBarSizes;
|
||||
RECT rcFloating;
|
||||
};
|
||||
extern struct _AppBarConfig_t AppBarConfig;
|
||||
|
||||
extern BOOL bShowWarning;
|
||||
|
||||
extern BOOL bFollowMouse;
|
||||
|
|
|
@ -24,38 +24,64 @@ BOOL bInvertColors = FALSE;
|
|||
BOOL bStartMinimized = FALSE;
|
||||
BOOL bShowMagnifier = TRUE;
|
||||
|
||||
struct _AppBarConfig_t AppBarConfig = {
|
||||
sizeof(struct _AppBarConfig_t),
|
||||
-2 /* ABE_TOP */,
|
||||
0, 1, /* unknown */
|
||||
{ 101,101,101,101 }, /* edge sizes */
|
||||
{ 20, 20, 600, 200 }, /* floating window rect */
|
||||
};
|
||||
|
||||
void LoadSettings()
|
||||
{
|
||||
HKEY hkey;
|
||||
LONG value;
|
||||
ULONG len;
|
||||
struct _AppBarConfig_t config_temp;
|
||||
|
||||
if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Magnify"), 0, KEY_READ, &hkey) == ERROR_SUCCESS)
|
||||
{
|
||||
len = sizeof(AppBarConfig);
|
||||
if (RegQueryValueEx(hkey, _T("AppBar"), 0, 0, (BYTE *)&config_temp, &len) == ERROR_SUCCESS)
|
||||
{
|
||||
if(config_temp.cbSize == sizeof(AppBarConfig))
|
||||
{
|
||||
AppBarConfig = config_temp;
|
||||
}
|
||||
}
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryMagLevel"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
{
|
||||
if (value >= 0 && value <= 9)
|
||||
iZoom = value;
|
||||
}
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("ShowWarning"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bShowWarning = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryInvertColors"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bInvertColors = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryStartMinimized"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bStartMinimized = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryTrackCursor"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bFollowMouse = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryTrackFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bFollowFocus = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryTrackSecondaryFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bFollowFocus = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
len = 4;
|
||||
if (RegQueryValueEx(hkey, _T("StationaryTrackText"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
|
||||
bFollowCaret = (value == 0 ? FALSE : TRUE);
|
||||
|
||||
|
@ -70,6 +96,8 @@ void SaveSettings()
|
|||
|
||||
if (RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Magnify"), 0, _T(""), 0, KEY_WRITE, NULL, &hkey, NULL) == ERROR_SUCCESS)
|
||||
{
|
||||
RegSetValueEx(hkey, _T("AppBar"), 0, REG_BINARY, (BYTE *)&AppBarConfig, sizeof(AppBarConfig));
|
||||
|
||||
value = iZoom;
|
||||
RegSetValueEx(hkey, _T("StationaryMagLevel"), 0, REG_DWORD, (BYTE *)&value, sizeof(value));
|
||||
|
||||
|
|
Loading…
Reference in a new issue