[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:
David Quintana 2015-12-14 05:03:06 +00:00
parent e30338c882
commit 2dbcc6fba0
23 changed files with 419 additions and 90 deletions

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 210, 182 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 "Настройки на увеличителя" CAPTION "Настройки на увеличителя"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Einstellungen"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Magnifier Settings"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -33,7 +33,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Configurar lupa"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Paramètres de la loupe"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -31,7 +31,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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 "הגדרות זכוכית מגדלת" CAPTION "הגדרות זכוכית מגדלת"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Impostazioni di Magnifier"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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 "拡大鏡の設定" CAPTION "拡大鏡の設定"
FONT 9, "MS UI Gothic", 400, 0, 0x1 FONT 9, "MS UI Gothic", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Forstørrelse Innstilling"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -37,7 +37,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Ustawienia"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -31,7 +31,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Configurações da Lupa"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -31,7 +31,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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ă" CAPTION "Configurare lupă"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 185, 182 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 "Параметры" CAPTION "Параметры"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -34,7 +34,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Nastavenia Lupy"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -33,7 +33,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Konfigurimet e zmadhuesit"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -29,7 +29,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Förstoringsglaset Inställning"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -37,7 +37,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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" CAPTION "Seçenekler"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -37,7 +37,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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 "Параметри екранної лупи" CAPTION "Параметри екранної лупи"
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -37,7 +37,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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 "放大镜设定" CAPTION "放大镜设定"
FONT 9, "MS Shell Dlg", 400, 0, 0x1 FONT 9, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -37,7 +37,7 @@ BEGIN
END END
IDD_DIALOGOPTIONS DIALOGEX 0, 0, 153, 182 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 "放大鏡設定" CAPTION "放大鏡設定"
FONT 9, "MS Shell Dlg", 400, 0, 0x1 FONT 9, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN

View file

@ -8,7 +8,8 @@
* David Quintana <gigaherz@gmail.com> * David Quintana <gigaherz@gmail.com>
*/ */
/* TODO: AppBar */ /* TODO: Support AppBar types other than ABE_TOP */
#include "magnifier.h" #include "magnifier.h"
#include <winbase.h> #include <winbase.h>
@ -20,14 +21,16 @@
#include "resource.h" #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 */ /* Global Variables */
HINSTANCE hInst; HINSTANCE hInst;
HWND hMainWnd; HWND hMainWnd;
#define MAX_LOADSTRING 100
TCHAR szTitle[MAX_LOADSTRING]; TCHAR szTitle[MAX_LOADSTRING];
#define TIMER_SPEED 1 #define TIMER_SPEED 1
@ -37,19 +40,19 @@ DWORD lastTicks = 0;
HWND hDesktopWindow = NULL; HWND hDesktopWindow = NULL;
#define APPMSG_NOTIFYICON (WM_APP+1)
HICON notifyIcon;
NOTIFYICONDATA nid; NOTIFYICONDATA nid;
HICON notifyIcon;
HMENU notifyMenu; HMENU notifyMenu;
HWND hOptionsDialog; HWND hOptionsDialog;
BOOL bOptionsDialog = FALSE; BOOL bOptionsDialog = FALSE;
BOOL bRecreateOffscreenDC = TRUE; BOOL bRecreateOffscreenDC = TRUE;
LONG sourceWidth = 0; LONG sourceWidth = 0;
LONG sourceHeight = 0; LONG sourceHeight = 0;
HDC hdcOffscreen = NULL; HDC hdcOffscreen = NULL;
HANDLE hbmpOld;
HBITMAP hbmpOffscreen = NULL; HBITMAP hbmpOffscreen = NULL;
HANDLE hbmpOld;
POINT ptDragOffset;
INT nearEdge;
/* Current magnified area */ /* Current magnified area */
POINT cp; POINT cp;
@ -132,23 +135,158 @@ ATOM MyRegisterClass(HINSTANCE hInstance)
return RegisterClass(&wc); 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) 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 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 */ /* Create the Window */
hMainWnd = CreateWindowEx( hMainWnd = CreateWindowEx(
WS_EX_TOPMOST | WS_EX_PALETTEWINDOW, exStyles,
szWindowClass, szWindowClass,
szTitle, szTitle,
WS_OVERLAPPEDWINDOW, dwStyles,
CW_USEDEFAULT, rc.left,
CW_USEDEFAULT, rc.top,
(rcWorkArea.right - rcWorkArea.left) * 2 / 3, rc.right-rc.left,
200, rc.bottom-rc.top,
NULL, NULL,
NULL, NULL,
hInstance, hInstance,
@ -157,12 +295,16 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
if (!hMainWnd) if (!hMainWnd)
return FALSE; return FALSE;
ShowWindow(hMainWnd, bStartMinimized ? SW_MINIMIZE : nCmdShow); if (AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_NEW);
UpdateWindow(hMainWnd); 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. // In Windows 2003's Magnifier, the "Start Minimized" setting
// Should we add a custom means to prevent opening it? // refers exclusively to the options dialog, not the main window itself.
hOptionsDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOGOPTIONS), hMainWnd, OptionsProc); hOptionsDialog = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOGOPTIONS), hMainWnd, OptionsProc);
if (bStartMinimized)
ShowWindow(hOptionsDialog, SW_HIDE);
else
ShowWindow(hOptionsDialog, SW_SHOW);
if (bShowWarning) if (bShowWarning)
DialogBox(hInstance, MAKEINTRESOURCE(IDD_WARNINGDIALOG), hMainWnd, WarningProc); 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 //Get current mouse position
GetCursorPos (&pNewMouse); GetCursorPos (&pNewMouse);
#define PointsAreEqual(pt1, pt2) (((pt1).x == (pt2).x) && ((pt1).y == (pt2).y))
//If mouse has moved ... //If mouse has moved ...
if (((pMouse.x != pNewMouse.x) || (pMouse.y != pNewMouse.y))) if (!PointsAreEqual(pMouse, pNewMouse))
{ {
//Update to new position //Update to new position
pMouse = pNewMouse; pMouse = pNewMouse;
@ -373,13 +517,17 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
} }
} }
if (bFollowCaret && guiInfo.hwndCaret) if(guiInfo.hwndActive != hMainWnd)
{
if (bFollowCaret)
{
if (guiInfo.hwndCaret)
{ {
POINT ptCaret; POINT ptCaret;
ptCaret.x = (guiInfo.rcCaret.left + guiInfo.rcCaret.right) / 2; ptCaret.x = (guiInfo.rcCaret.left + guiInfo.rcCaret.right) / 2;
ptCaret.y = (guiInfo.rcCaret.top + guiInfo.rcCaret.bottom) / 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 ((pCaretWnd != guiInfo.hwndCaret) || !PointsAreEqual(pCaret, ptCaret))
{ {
//Update to new position //Update to new position
pCaret = ptCaret; pCaret = ptCaret;
@ -388,12 +536,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{ {
ClientToScreen (guiInfo.hwndCaret, (LPPOINT) &ptCaret); ClientToScreen (guiInfo.hwndCaret, (LPPOINT) &ptCaret);
cp = ptCaret; cp = ptCaret;
}
hasMoved = TRUE; hasMoved = TRUE;
} }
} }
}
else
{
pCaretWnd = NULL;
}
}
if (bFollowFocus && guiInfo.hwndFocus) if (bFollowFocus)
{
if(guiInfo.hwndFocus && !guiInfo.hwndCaret)
{ {
POINT ptFocus; POINT ptFocus;
RECT activeRect; RECT activeRect;
@ -403,16 +558,24 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
ptFocus.x = (activeRect.left + activeRect.right) / 2; ptFocus.x = (activeRect.left + activeRect.right) / 2;
ptFocus.y = (activeRect.top + activeRect.bottom) / 2; ptFocus.y = (activeRect.top + activeRect.bottom) / 2;
if(guiInfo.hwndFocus && ((guiInfo.hwndFocus != pFocusWnd) || (pFocus.x != ptFocus.x) || (pFocus.y != ptFocus.y))) if((guiInfo.hwndFocus != pFocusWnd) || !PointsAreEqual(pFocus, ptFocus))
{ {
//Update to new position //Update to new position
pFocus = ptFocus; pFocus = ptFocus;
pFocusWnd = guiInfo.hwndFocus; pFocusWnd = guiInfo.hwndFocus;
if(!hasMoved) if(!hasMoved)
{
cp = ptFocus; cp = ptFocus;
hasMoved = TRUE; hasMoved = TRUE;
} }
} }
}
else
{
pFocusWnd = NULL;
}
}
}
if(!hasMoved) if(!hasMoved)
{ {
@ -429,8 +592,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
lastTicks = GetTickCount(); lastTicks = GetTickCount();
Refresh(); Refresh();
} }
return 0;
} }
break;
case WM_COMMAND: case WM_COMMAND:
{ {
@ -457,7 +621,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
default: default:
return DefWindowProc(hWnd, message, wParam, lParam); return DefWindowProc(hWnd, message, wParam, lParam);
} }
break; return 0;
} }
case WM_PAINT: case WM_PAINT:
@ -467,24 +631,117 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
dc = BeginPaint(hWnd, &PaintStruct); dc = BeginPaint(hWnd, &PaintStruct);
Draw(dc); Draw(dc);
EndPaint(hWnd, &PaintStruct); EndPaint(hWnd, &PaintStruct);
break; return 0;
} }
case WM_CONTEXTMENU: case WM_CONTEXTMENU:
TrackPopupMenu(notifyMenu, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL); 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; 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: case WM_SIZE:
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_SETPOS);
/* fallthrough */
case WM_DISPLAYCHANGE: case WM_DISPLAYCHANGE:
bRecreateOffscreenDC = TRUE; bRecreateOffscreenDC = TRUE;
Refresh(); Refresh();
return DefWindowProc(hWnd, message, wParam, lParam); break;
case WM_ERASEBKGND: case WM_ERASEBKGND:
// handle WM_ERASEBKGND by simply returning non-zero because we did all the drawing in WM_PAINT. // handle WM_ERASEBKGND by simply returning non-zero because we did all the drawing in WM_PAINT.
break; return 0;
case WM_DESTROY: case WM_DESTROY:
if(AppBarConfig.uEdge>=0) DoAppBarStuff(ABM_REMOVE);
/* Save settings to registry */ /* Save settings to registry */
SaveSettings(); SaveSettings();
KillTimer(hWnd , 1); KillTimer(hWnd , 1);
@ -501,15 +758,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
DestroyIcon(notifyIcon); DestroyIcon(notifyIcon);
DestroyWindow(hOptionsDialog); DestroyWindow(hOptionsDialog);
break; return 0;
case WM_CREATE: case WM_CREATE:
{ {
HMENU tempMenu; HMENU tempMenu;
/* Load settings from registry */
LoadSettings();
/* Get the desktop window */ /* Get the desktop window */
hDesktopWindow = GetDesktopWindow(); hDesktopWindow = GetDesktopWindow();
@ -531,20 +785,57 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
notifyMenu = GetSubMenu(tempMenu, 0); notifyMenu = GetSubMenu(tempMenu, 0);
RemoveMenu(tempMenu, 0, MF_BYPOSITION); RemoveMenu(tempMenu, 0, MF_BYPOSITION);
DestroyMenu(tempMenu); DestroyMenu(tempMenu);
return 0;
}
case APPMSG_APPBAR:
{
switch (wParam)
{
case ABN_STATECHANGE:
DoAppBarStuff(ABM_GETSTATE);
break; 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: case APPMSG_NOTIFYICON:
HandleNotifyIconMessage(hWnd, wParam, lParam); 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; break;
default: 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) INT_PTR CALLBACK AboutProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

View file

@ -26,6 +26,16 @@
extern int iZoom; 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 bShowWarning;
extern BOOL bFollowMouse; extern BOOL bFollowMouse;

View file

@ -24,38 +24,64 @@ BOOL bInvertColors = FALSE;
BOOL bStartMinimized = FALSE; BOOL bStartMinimized = FALSE;
BOOL bShowMagnifier = TRUE; 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() void LoadSettings()
{ {
HKEY hkey; HKEY hkey;
LONG value; LONG value;
ULONG len; ULONG len;
struct _AppBarConfig_t config_temp;
if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Magnify"), 0, KEY_READ, &hkey) == ERROR_SUCCESS) 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 (RegQueryValueEx(hkey, _T("StationaryMagLevel"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
{ {
if (value >= 0 && value <= 9) if (value >= 0 && value <= 9)
iZoom = value; iZoom = value;
} }
len = 4;
if (RegQueryValueEx(hkey, _T("ShowWarning"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("ShowWarning"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bShowWarning = (value == 0 ? FALSE : TRUE); bShowWarning = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryInvertColors"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryInvertColors"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bInvertColors = (value == 0 ? FALSE : TRUE); bInvertColors = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryStartMinimized"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryStartMinimized"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bStartMinimized = (value == 0 ? FALSE : TRUE); bStartMinimized = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryTrackCursor"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryTrackCursor"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bFollowMouse = (value == 0 ? FALSE : TRUE); bFollowMouse = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryTrackFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryTrackFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bFollowFocus = (value == 0 ? FALSE : TRUE); bFollowFocus = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryTrackSecondaryFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryTrackSecondaryFocus"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bFollowFocus = (value == 0 ? FALSE : TRUE); bFollowFocus = (value == 0 ? FALSE : TRUE);
len = 4;
if (RegQueryValueEx(hkey, _T("StationaryTrackText"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS) if (RegQueryValueEx(hkey, _T("StationaryTrackText"), 0, 0, (BYTE *)&value, &len) == ERROR_SUCCESS)
bFollowCaret = (value == 0 ? FALSE : TRUE); 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) 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; value = iZoom;
RegSetValueEx(hkey, _T("StationaryMagLevel"), 0, REG_DWORD, (BYTE *)&value, sizeof(value)); RegSetValueEx(hkey, _T("StationaryMagLevel"), 0, REG_DWORD, (BYTE *)&value, sizeof(value));