mirror of
https://github.com/DxWnd/DxWnd.reloaded
synced 2024-12-30 09:25:35 +01:00
v2_03_65_src
Former-commit-id: 88c8490ef419733cac9523f4d1169c87a79dd60c
This commit is contained in:
parent
ae96386781
commit
b411ad17ff
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:73656cf90cf6d5ad5a6c62da1bd48b14b7d0ff353dca4e04d87fb50445dfe178
|
oid sha256:0911330dda18c4e1fb5f3caa8c1b951a333f79a64f3fe23b3eaf9d65225391b7
|
||||||
size 646656
|
size 647680
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:41b726e8f958c18372ccc7f6fbc5b53b3a2293c2298e5933dbb0b4b0f6fe4fba
|
oid sha256:6a8148495ebac5bf9b0f2298eaaab28a3572c88cc967ecebbef876b60cf8eb95
|
||||||
size 557056
|
size 567296
|
||||||
|
97
build/dxwnd.ini
Normal file
97
build/dxwnd.ini
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
[window]
|
||||||
|
posx=950
|
||||||
|
posy=64
|
||||||
|
sizx=320
|
||||||
|
sizy=200
|
||||||
|
exportpath=D:\DxWnd\exports.ok\
|
||||||
|
exepath=D:\Games\Restricted Area\
|
||||||
|
[keymapping]
|
||||||
|
corner=0x78
|
||||||
|
fullscreen=0x0D
|
||||||
|
workarea=0x7A
|
||||||
|
desktop=0x7B
|
||||||
|
[target]
|
||||||
|
title0=Betrayal in Antara
|
||||||
|
path0=D:\Games\Betrayal in Antara\ANTARAR.EXE
|
||||||
|
launchpath0=
|
||||||
|
module0=
|
||||||
|
opengllib0=
|
||||||
|
notes0=
|
||||||
|
registry0=
|
||||||
|
ver0=0
|
||||||
|
coord0=0
|
||||||
|
flag0=681574434
|
||||||
|
flagg0=1207959552
|
||||||
|
flagh0=20
|
||||||
|
flagi0=-2011168764
|
||||||
|
flagj0=4224
|
||||||
|
flagk0=65536
|
||||||
|
flagl0=0
|
||||||
|
flagm0=0
|
||||||
|
dflag0=0
|
||||||
|
posx0=50
|
||||||
|
posy0=50
|
||||||
|
sizx0=800
|
||||||
|
sizy0=600
|
||||||
|
maxfps0=0
|
||||||
|
initts0=0
|
||||||
|
winver0=0
|
||||||
|
maxres0=-1
|
||||||
|
swapeffect0=0
|
||||||
|
maxddinterface0=7
|
||||||
|
title1=Silver
|
||||||
|
path1=D:\Games\Silver\silver.exe
|
||||||
|
launchpath1=
|
||||||
|
module1=
|
||||||
|
opengllib1=
|
||||||
|
notes1=
|
||||||
|
registry1=
|
||||||
|
ver1=0
|
||||||
|
coord1=0
|
||||||
|
flag1=136314998
|
||||||
|
flagg1=1208483856
|
||||||
|
flagh1=20
|
||||||
|
flagi1=138412036
|
||||||
|
flagj1=4224
|
||||||
|
flagk1=268500992
|
||||||
|
flagl1=0
|
||||||
|
flagm1=0
|
||||||
|
dflag1=0
|
||||||
|
posx1=-1250
|
||||||
|
posy1=50
|
||||||
|
sizx1=800
|
||||||
|
sizy1=600
|
||||||
|
maxfps1=0
|
||||||
|
initts1=0
|
||||||
|
winver1=0
|
||||||
|
maxres1=-1
|
||||||
|
swapeffect1=0
|
||||||
|
maxddinterface1=7
|
||||||
|
title2=Restricted Area
|
||||||
|
path2=D:\Games\Restricted Area\Ra.exe
|
||||||
|
launchpath2=
|
||||||
|
module2=
|
||||||
|
opengllib2=
|
||||||
|
notes2=
|
||||||
|
registry2=
|
||||||
|
ver2=0
|
||||||
|
coord2=0
|
||||||
|
flag2=681574434
|
||||||
|
flagg2=1744830464
|
||||||
|
flagh2=20
|
||||||
|
flagi2=138412038
|
||||||
|
flagj2=4224
|
||||||
|
flagk2=327680
|
||||||
|
flagl2=0
|
||||||
|
flagm2=0
|
||||||
|
dflag2=0
|
||||||
|
posx2=50
|
||||||
|
posy2=50
|
||||||
|
sizx2=800
|
||||||
|
sizy2=600
|
||||||
|
maxfps2=0
|
||||||
|
initts2=0
|
||||||
|
winver2=0
|
||||||
|
maxres2=-1
|
||||||
|
swapeffect2=0
|
||||||
|
maxddinterface2=7
|
@ -1093,4 +1093,8 @@ v2.03.64
|
|||||||
fix: completed the hook pointers separation per COM interface version: this is of growing importance on Win10 because of the system updates (shims?)
|
fix: completed the hook pointers separation per COM interface version: this is of growing importance on Win10 because of the system updates (shims?)
|
||||||
fix: fixed incoherences in task refences of the GUI
|
fix: fixed incoherences in task refences of the GUI
|
||||||
fix: recovered task kill on WinXP
|
fix: recovered task kill on WinXP
|
||||||
fix: updated RedrawWindow, now allows better handling of "Galapagos" pause screen
|
fix: updated RedrawWindow, now allows better handling of "Galapagos" pause screen
|
||||||
|
|
||||||
|
v2.03.65
|
||||||
|
fix: handling of fullscreen switching on closest monitor (in multimonitor systems)
|
||||||
|
fix: X,Y starting win position can now be negative integer (in multimonitor systems)
|
@ -5358,11 +5358,26 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
|
|||||||
return DDERR_INVALIDPARAMS;
|
return DDERR_INVALIDPARAMS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define FIXSURFACEDESCSIZE TRUE
|
||||||
|
if(FIXSURFACEDESCSIZE){
|
||||||
|
switch(dxversion){
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
case 3:
|
||||||
|
lpddsd->dwSize = sizeof(DDSURFACEDESC);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
case 7:
|
||||||
|
lpddsd->dwSize = sizeof(DDSURFACEDESC2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
res=(*pGetSurfaceDesc)(lpdds, lpddsd);
|
res=(*pGetSurfaceDesc)(lpdds, lpddsd);
|
||||||
OutTraceDDRAW("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n",
|
OutTraceDDRAW("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n",
|
||||||
res?"ERROR ":"", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res, ExplainDDError(res));
|
res?"ERROR ":"", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res, ExplainDDError(res));
|
||||||
if(res) {
|
if(res) {
|
||||||
OutTraceE("GetSurfaceDesc: ERROR err=%d(%s) at %d\n", res, ExplainDDError(res), __LINE__);
|
OutTraceE("GetSurfaceDesc: ERROR err=%x(%s) dxversion=%d s->len=%d at %d\n", res, ExplainDDError(res), dxversion, lpddsd->dwSize, __LINE__);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,16 +585,26 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// shift down-right so that the border is visible
|
// shift down-right so that the border is visible
|
||||||
// and also update the iPosX,iPosY upper-left coordinates of the client area
|
if(rect.left < dxw.VirtualDesktop.left){
|
||||||
if(rect.left < 0){
|
rect.right = dxw.VirtualDesktop.left - rect.left + rect.right;
|
||||||
rect.right -= rect.left;
|
rect.left = dxw.VirtualDesktop.left;
|
||||||
rect.left = 0;
|
|
||||||
}
|
}
|
||||||
if(rect.top < 0){
|
if(rect.top < dxw.VirtualDesktop.top){
|
||||||
rect.bottom -= rect.top;
|
rect.bottom = dxw.VirtualDesktop.top - rect.top + rect.bottom;
|
||||||
rect.top = 0;
|
rect.top = dxw.VirtualDesktop.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// shift up-left so that the windows doesn't exceed on the other side
|
||||||
|
if(rect.right > dxw.VirtualDesktop.right){
|
||||||
|
rect.left = dxw.VirtualDesktop.right - rect.right + rect.left;
|
||||||
|
rect.right = dxw.VirtualDesktop.right;
|
||||||
|
}
|
||||||
|
if(rect.bottom > dxw.VirtualDesktop.bottom){
|
||||||
|
rect.top = dxw.VirtualDesktop.bottom - rect.bottom + rect.top;
|
||||||
|
rect.bottom = dxw.VirtualDesktop.bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the arguments for the window creation
|
||||||
wp->x=rect.left;
|
wp->x=rect.left;
|
||||||
wp->y=rect.top;
|
wp->y=rect.top;
|
||||||
wp->cx=rect.right-rect.left;
|
wp->cx=rect.right-rect.left;
|
||||||
@ -1193,6 +1203,7 @@ extern HHOOK hMouseHook;
|
|||||||
|
|
||||||
void HookInit(TARGETMAP *target, HWND hwnd)
|
void HookInit(TARGETMAP *target, HWND hwnd)
|
||||||
{
|
{
|
||||||
|
static BOOL DoOnce = TRUE;
|
||||||
HMODULE base;
|
HMODULE base;
|
||||||
char *sModule;
|
char *sModule;
|
||||||
char sModuleBuf[60+1];
|
char sModuleBuf[60+1];
|
||||||
@ -1230,6 +1241,17 @@ void HookInit(TARGETMAP *target, HWND hwnd)
|
|||||||
if(dxw.dwFlags5 & GDIMODE) dxw.dwFlags1 |= EMULATESURFACE;
|
if(dxw.dwFlags5 & GDIMODE) dxw.dwFlags1 |= EMULATESURFACE;
|
||||||
if(dxw.dwFlags5 & STRESSRESOURCES) dxw.dwFlags5 |= LIMITRESOURCES;
|
if(dxw.dwFlags5 & STRESSRESOURCES) dxw.dwFlags5 |= LIMITRESOURCES;
|
||||||
|
|
||||||
|
if(DoOnce){
|
||||||
|
DoOnce = FALSE;
|
||||||
|
dxw.VirtualDesktop.left = GetSystemMetrics(SM_XVIRTUALSCREEN);
|
||||||
|
dxw.VirtualDesktop.top = GetSystemMetrics(SM_YVIRTUALSCREEN);
|
||||||
|
dxw.VirtualDesktop.right = dxw.VirtualDesktop.left + GetSystemMetrics(SM_CXVIRTUALSCREEN);
|
||||||
|
dxw.VirtualDesktop.bottom = dxw.VirtualDesktop.top + GetSystemMetrics(SM_CYVIRTUALSCREEN);
|
||||||
|
OutTraceDW("Virtual Desktop: monitors=%d area=(%d,%d)-(%d,%d)\n",
|
||||||
|
GetSystemMetrics(SM_CMONITORS),
|
||||||
|
dxw.VirtualDesktop.left, dxw.VirtualDesktop.top, dxw.VirtualDesktop.right, dxw.VirtualDesktop.bottom);
|
||||||
|
}
|
||||||
|
|
||||||
if(hwnd){ // v2.02.32: skip this when in code injection mode.
|
if(hwnd){ // v2.02.32: skip this when in code injection mode.
|
||||||
// v2.1.75: is it correct to set hWnd here?
|
// v2.1.75: is it correct to set hWnd here?
|
||||||
//dxw.SethWnd(hwnd);
|
//dxw.SethWnd(hwnd);
|
||||||
|
@ -177,6 +177,7 @@ public: // simple data variables
|
|||||||
HDC VirtualHDC;
|
HDC VirtualHDC;
|
||||||
int GDIEmulationMode;
|
int GDIEmulationMode;
|
||||||
BOOL TimeFreeze;
|
BOOL TimeFreeze;
|
||||||
|
RECT VirtualDesktop;
|
||||||
|
|
||||||
// Implementation
|
// Implementation
|
||||||
protected:
|
protected:
|
||||||
|
@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
|
|
||||||
#include "TlHelp32.h"
|
#include "TlHelp32.h"
|
||||||
|
|
||||||
#define VERSION "2.03.64"
|
#define VERSION "2.03.65"
|
||||||
|
|
||||||
#define DDTHREADLOCK 1
|
#define DDTHREADLOCK 1
|
||||||
//#define LOCKTHREADS
|
//#define LOCKTHREADS
|
||||||
|
Binary file not shown.
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="9,00"
|
Version="9.00"
|
||||||
Name="dxwnd"
|
Name="dxwnd"
|
||||||
ProjectGUID="{579E7FE7-2745-4100-A802-23511711FCDE}"
|
ProjectGUID="{579E7FE7-2745-4100-A802-23511711FCDE}"
|
||||||
RootNamespace="dxwnd"
|
RootNamespace="dxwnd"
|
||||||
@ -485,6 +485,10 @@
|
|||||||
RelativePath=".\supmodes.cpp"
|
RelativePath=".\supmodes.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\toggle_fs.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\user32.cpp"
|
RelativePath=".\user32.cpp"
|
||||||
>
|
>
|
||||||
|
169
dll/toggle_fs.cpp
Normal file
169
dll/toggle_fs.cpp
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
#define _WIN32_WINNT 0x0600
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define _CRT_SECURE_NO_DEPRECATE 1
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include "dxwnd.h"
|
||||||
|
#include "dxwcore.hpp"
|
||||||
|
#include "dxhelper.h"
|
||||||
|
|
||||||
|
extern void RecoverScreenMode();
|
||||||
|
extern void RestoreDDrawSurfaces();
|
||||||
|
extern void RestoreD3DSurfaces(BOOL);
|
||||||
|
|
||||||
|
void dx_FullScreenToggle(HWND hwnd)
|
||||||
|
{
|
||||||
|
static BOOL bFullScreen = FALSE;
|
||||||
|
static RECT WinRect = {0, 0, 0, 0};
|
||||||
|
static DWORD OldStyle, OldExtStyle;
|
||||||
|
static DEVMODE oldDisplayMode;
|
||||||
|
static DWORD OrigFlags;
|
||||||
|
static char szDevice[32];
|
||||||
|
|
||||||
|
// toggle ....
|
||||||
|
if (bFullScreen){
|
||||||
|
OutTraceDW("DxWnd: exiting fullscreen mode: style=%x extstyle=%x pos=(%d,%d)-(%d,%d)\n",
|
||||||
|
OldStyle, OldExtStyle, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom);
|
||||||
|
int ChangeDisplayResult = (*pChangeDisplaySettingsExA)(szDevice, &oldDisplayMode, NULL, CDS_FULLSCREEN, NULL);
|
||||||
|
if(ChangeDisplayResult != DISP_CHANGE_SUCCESSFUL){
|
||||||
|
OutTraceE("ChangeDisplaySettingsEx ERROR: res=%d at %d\n", ChangeDisplayResult, __LINE__);
|
||||||
|
MessageBox(NULL,"Error: Failed to recover display mode.", "Error", 0);
|
||||||
|
}
|
||||||
|
// MoveWindow doesn't recover the exact position!!!
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
||||||
|
(*pSetWindowPos)(hwnd, HWND_TOP,
|
||||||
|
WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top),
|
||||||
|
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
||||||
|
memset(&WinRect, 0, sizeof(WinRect));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
OutTraceDW("DxWnd: entering fullscreen mode\n");
|
||||||
|
int BestIndex, iCost, iBestCost;
|
||||||
|
(*pGetWindowRect)(hwnd, &WinRect);
|
||||||
|
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
||||||
|
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0);
|
||||||
|
|
||||||
|
DEVMODE DisplayMode;
|
||||||
|
HMONITOR hBestMonitor;
|
||||||
|
hBestMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
||||||
|
MONITORINFOEX mi;
|
||||||
|
memset(&mi, 0, sizeof(mi));
|
||||||
|
mi.cbSize=sizeof(mi);
|
||||||
|
GetMonitorInfo(hBestMonitor, &mi);
|
||||||
|
OutTraceDW("Using monitor=\"%s\", rect=(%d,%d)-(%d,%d) type=%s\n",
|
||||||
|
mi.szDevice,
|
||||||
|
mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right, mi.rcMonitor.bottom,
|
||||||
|
(mi.dwFlags & MONITORINFOF_PRIMARY) ? "PRIMARY" : "SECONDARY");
|
||||||
|
memset(&oldDisplayMode, 0, sizeof(DEVMODE));
|
||||||
|
if(!(*pEnumDisplaySettings)(mi.szDevice, ENUM_CURRENT_SETTINGS, &oldDisplayMode)){
|
||||||
|
MessageBox(NULL, "EnumDisplaySettings Failed ???", "Error!", 0);
|
||||||
|
}
|
||||||
|
iBestCost=1000000; // huge
|
||||||
|
for (int i=0; ;i++){
|
||||||
|
iCost=0;
|
||||||
|
memset(&DisplayMode, 0, sizeof(DEVMODE));
|
||||||
|
DisplayMode.dmSize = sizeof(DEVMODE);
|
||||||
|
if(!(*pEnumDisplaySettings)(mi.szDevice, i, &DisplayMode))break; // no more modes
|
||||||
|
if(DisplayMode.dmPelsWidth < dxw.GetScreenWidth()) continue; // bad: too narrow
|
||||||
|
if(DisplayMode.dmPelsHeight < dxw.GetScreenHeight()) continue; // bad: too low
|
||||||
|
if (DisplayMode.dmBitsPerPel != oldDisplayMode.dmBitsPerPel) continue; // bad: different color depth
|
||||||
|
iCost =
|
||||||
|
(DisplayMode.dmPelsWidth - dxw.GetScreenWidth()) +
|
||||||
|
(DisplayMode.dmPelsHeight - dxw.GetScreenHeight()) +
|
||||||
|
(DisplayMode.dmDisplayFrequency == oldDisplayMode.dmDisplayFrequency) ? 1 : 0;
|
||||||
|
if(iCost < iBestCost){
|
||||||
|
iBestCost = iCost;
|
||||||
|
BestIndex = i;
|
||||||
|
}
|
||||||
|
if(iBestCost == 0) break; // got the perfect one!
|
||||||
|
}
|
||||||
|
memset(&DisplayMode, 0, sizeof(DEVMODE));
|
||||||
|
strncpy(szDevice, mi.szDevice, 32);
|
||||||
|
(*pEnumDisplaySettings)(mi.szDevice, BestIndex, &DisplayMode);
|
||||||
|
OutTraceDW("DxWnd: selected mode bpp=%d size=(%dx%d) freq=%d\n",
|
||||||
|
DisplayMode.dmBitsPerPel, DisplayMode.dmPelsWidth, DisplayMode.dmPelsHeight, DisplayMode.dmDisplayFrequency);
|
||||||
|
DisplayMode.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFLAGS|DM_DISPLAYFREQUENCY|DM_POSITION;
|
||||||
|
int ChangeDisplayResult = (*pChangeDisplaySettingsExA)(mi.szDevice, &DisplayMode, NULL, CDS_FULLSCREEN, NULL);
|
||||||
|
if(ChangeDisplayResult != DISP_CHANGE_SUCCESSFUL){
|
||||||
|
OutTraceE("ChangeDisplaySettingsEx ERROR: res=%d at %d\n", ChangeDisplayResult, __LINE__);
|
||||||
|
MessageBox(NULL,"Error: Failed to change display mode.", "Error", 0);
|
||||||
|
}
|
||||||
|
// query again the NEW screen coordinates ....
|
||||||
|
memset(&mi, 0, sizeof(mi));
|
||||||
|
mi.cbSize=sizeof(mi);
|
||||||
|
GetMonitorInfo(hBestMonitor, &mi);
|
||||||
|
OutTraceDW("Updated monitor=\"%s\", rect=(%d,%d)-(%d,%d) type=%s\n",
|
||||||
|
mi.szDevice,
|
||||||
|
mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right, mi.rcMonitor.bottom,
|
||||||
|
(mi.dwFlags & MONITORINFOF_PRIMARY) ? "PRIMARY" : "SECONDARY");
|
||||||
|
(*pMoveWindow)(hwnd,
|
||||||
|
mi.rcMonitor.left, mi.rcMonitor.top, // x, y
|
||||||
|
DisplayMode.dmPelsWidth, // width
|
||||||
|
DisplayMode.dmPelsHeight, // height
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
(*pUpdateWindow)(hwnd);
|
||||||
|
RestoreDDrawSurfaces();
|
||||||
|
RestoreD3DSurfaces(bFullScreen);
|
||||||
|
bFullScreen = !bFullScreen; // switch toggle
|
||||||
|
}
|
||||||
|
|
||||||
|
void dx_DesktopToggle(HWND hwnd, BOOL bWorkArea)
|
||||||
|
{
|
||||||
|
static BOOL bDesktopToggle = FALSE;
|
||||||
|
static RECT WinRect = {0, 0, 0, 0};
|
||||||
|
static DWORD OldStyle, OldExtStyle;
|
||||||
|
|
||||||
|
if (bDesktopToggle){ // toggle ....
|
||||||
|
OutTraceDW("DxWnd: exiting desktop mode: style=%x extstyle=%x pos=(%d,%d)-(%d,%d)\n",
|
||||||
|
OldStyle, OldExtStyle, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
||||||
|
// MoveWindow doesn't recover the exact position!!!
|
||||||
|
(*pSetWindowPos)(hwnd, HWND_TOP,
|
||||||
|
WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top),
|
||||||
|
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
||||||
|
memset(&WinRect, 0, sizeof(WinRect));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
RECT DesktopRect;
|
||||||
|
HWND DesktopWnd;
|
||||||
|
HDC hClientDC;
|
||||||
|
OutTraceDW("DxWnd: entering desktop mode\n");
|
||||||
|
if((WinRect.left==0) && (WinRect.right==0) && (WinRect.top==0) && (WinRect.bottom==0)) (*pGetWindowRect)(hwnd, &WinRect);
|
||||||
|
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
||||||
|
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
||||||
|
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0);
|
||||||
|
(*pUpdateWindow)(hwnd);
|
||||||
|
DesktopWnd = (*pGetDesktopWindow)();
|
||||||
|
hClientDC=(*pGDIGetDC)(hwnd);
|
||||||
|
|
||||||
|
HMONITOR hBestMonitor;
|
||||||
|
hBestMonitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST);
|
||||||
|
MONITORINFOEX mi;
|
||||||
|
memset(&mi, 0, sizeof(mi));
|
||||||
|
mi.cbSize=sizeof(mi);
|
||||||
|
GetMonitorInfo(hBestMonitor, &mi);
|
||||||
|
OutTraceDW("Using monitor=\"%s\", rect=(%d,%d)-(%d,%d) type=%s\n",
|
||||||
|
mi.szDevice,
|
||||||
|
mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right, mi.rcMonitor.bottom,
|
||||||
|
(mi.dwFlags & MONITORINFOF_PRIMARY) ? "PRIMARY" : "SECONDARY");
|
||||||
|
|
||||||
|
DesktopRect = bWorkArea ? mi.rcWork : mi.rcMonitor;
|
||||||
|
OutTraceDW("DxWnd: desktop=(%d,%d)-(%d,%d)\n");
|
||||||
|
(*pSetWindowPos)(hwnd, HWND_TOP,
|
||||||
|
DesktopRect.left, DesktopRect.top, (DesktopRect.right-DesktopRect.left), (DesktopRect.bottom-DesktopRect.top),
|
||||||
|
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
||||||
|
(*pGDIBitBlt)(hClientDC, DesktopRect.left, DesktopRect.top, DesktopRect.right, DesktopRect.bottom, NULL, 0, 0, BLACKNESS);
|
||||||
|
}
|
||||||
|
bDesktopToggle = !bDesktopToggle; // switch toggle
|
||||||
|
(*pUpdateWindow)(hwnd);
|
||||||
|
dxw.ScreenRefresh();
|
||||||
|
(*pInvalidateRect)(hwnd, NULL, FALSE); // force window update
|
||||||
|
}
|
125
dll/winproc.cpp
125
dll/winproc.cpp
@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
extern void SuppressIMEWindow();
|
extern void SuppressIMEWindow();
|
||||||
extern void RecoverScreenMode();
|
extern void RecoverScreenMode();
|
||||||
extern void RestoreDDrawSurfaces();
|
extern void dx_FullScreenToggle(HWND);
|
||||||
extern void RestoreD3DSurfaces(BOOL);
|
extern void dx_DesktopToggle(HWND, BOOL);
|
||||||
|
|
||||||
static void dx_ToggleLogging()
|
static void dx_ToggleLogging()
|
||||||
{
|
{
|
||||||
@ -194,127 +194,6 @@ static void dx_Cornerize(HWND hwnd)
|
|||||||
dxw.ScreenRefresh();
|
dxw.ScreenRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void dx_FullScreenToggle(HWND hwnd)
|
|
||||||
{
|
|
||||||
static BOOL bFullScreen = FALSE;
|
|
||||||
static RECT WinRect = {0, 0, 0, 0};
|
|
||||||
static DWORD OldStyle, OldExtStyle;
|
|
||||||
static DEVMODE oldDisplayMode;
|
|
||||||
static DWORD OrigFlags;
|
|
||||||
|
|
||||||
// toggle ....
|
|
||||||
if (bFullScreen){
|
|
||||||
OutTraceDW("DxWnd: exiting fullscreen mode: style=%x extstyle=%x pos=(%d,%d)-(%d,%d)\n",
|
|
||||||
OldStyle, OldExtStyle, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom);
|
|
||||||
int ChangeDisplayResult = (*pChangeDisplaySettingsA)(&oldDisplayMode, CDS_FULLSCREEN);
|
|
||||||
if(ChangeDisplayResult != DISP_CHANGE_SUCCESSFUL){
|
|
||||||
MessageBox(NULL,"Error: Failed to recover display mode.", "Error", 0);
|
|
||||||
}
|
|
||||||
// MoveWindow doesn't recover the exact position!!!
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
|
||||||
(*pSetWindowPos)(hwnd, HWND_TOP,
|
|
||||||
WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top),
|
|
||||||
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
|
||||||
memset(&WinRect, 0, sizeof(WinRect));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
OutTraceDW("DxWnd: entering fullscreen mode\n");
|
|
||||||
int BestIndex, iCost, iBestCost;
|
|
||||||
if((WinRect.left==0) && (WinRect.right==0) && (WinRect.top==0) && (WinRect.bottom==0)) (*pGetWindowRect)(hwnd, &WinRect);
|
|
||||||
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
|
||||||
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0);
|
|
||||||
(*pMoveWindow)(hwnd, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), TRUE);
|
|
||||||
(*pUpdateWindow)(hwnd);
|
|
||||||
|
|
||||||
DEVMODE DisplayMode;
|
|
||||||
memset(&oldDisplayMode, 0, sizeof(DEVMODE));
|
|
||||||
if(!(*pEnumDisplaySettings)(NULL, ENUM_CURRENT_SETTINGS, &oldDisplayMode)){
|
|
||||||
MessageBox(NULL, "EnumDisplaySettings Failed ???", "Error!", 0);
|
|
||||||
}
|
|
||||||
iBestCost=1000000; // huge
|
|
||||||
for (int i=0; ;i++){
|
|
||||||
iCost=0;
|
|
||||||
memset(&DisplayMode, 0, sizeof(DEVMODE));
|
|
||||||
DisplayMode.dmSize = sizeof(DEVMODE);
|
|
||||||
if(!(*pEnumDisplaySettings)(NULL, i, &DisplayMode))break; // no more modes
|
|
||||||
if(DisplayMode.dmPelsWidth < dxw.GetScreenWidth()) continue; // bad: too narrow
|
|
||||||
if(DisplayMode.dmPelsHeight < dxw.GetScreenHeight()) continue; // bad: too low
|
|
||||||
if (DisplayMode.dmBitsPerPel != oldDisplayMode.dmBitsPerPel) continue; // bad: different color depth
|
|
||||||
iCost =
|
|
||||||
(DisplayMode.dmPelsWidth - dxw.GetScreenWidth()) +
|
|
||||||
(DisplayMode.dmPelsHeight - dxw.GetScreenHeight()) +
|
|
||||||
(DisplayMode.dmDisplayFrequency == oldDisplayMode.dmDisplayFrequency) ? 1 : 0;
|
|
||||||
if(iCost < iBestCost){
|
|
||||||
iBestCost = iCost;
|
|
||||||
BestIndex = i;
|
|
||||||
}
|
|
||||||
if(iBestCost == 0) break; // got the perfect one!
|
|
||||||
}
|
|
||||||
memset(&DisplayMode, 0, sizeof(DEVMODE));
|
|
||||||
(*pEnumDisplaySettings)(NULL, BestIndex, &DisplayMode);
|
|
||||||
OutTraceDW("DxWnd: selected mode bpp=%d size=(%dx%d) freq=%d\n",
|
|
||||||
DisplayMode.dmBitsPerPel, DisplayMode.dmPelsWidth, DisplayMode.dmPelsHeight, DisplayMode.dmDisplayFrequency);
|
|
||||||
DisplayMode.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFLAGS|DM_DISPLAYFREQUENCY|DM_POSITION;
|
|
||||||
int ChangeDisplayResult = (*pChangeDisplaySettingsA)(&DisplayMode, CDS_FULLSCREEN);
|
|
||||||
if(ChangeDisplayResult != DISP_CHANGE_SUCCESSFUL){
|
|
||||||
MessageBox(NULL,"Error: Failed to change display mode.", "Error", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(*pUpdateWindow)(hwnd);
|
|
||||||
RestoreDDrawSurfaces();
|
|
||||||
RestoreD3DSurfaces(bFullScreen);
|
|
||||||
bFullScreen = !bFullScreen; // switch toggle
|
|
||||||
}
|
|
||||||
|
|
||||||
static void dx_DesktopToggle(HWND hwnd, BOOL bWorkArea)
|
|
||||||
{
|
|
||||||
static BOOL bDesktopToggle = FALSE;
|
|
||||||
static RECT WinRect = {0, 0, 0, 0};
|
|
||||||
static DWORD OldStyle, OldExtStyle;
|
|
||||||
|
|
||||||
if (bDesktopToggle){ // toggle ....
|
|
||||||
OutTraceDW("DxWnd: exiting desktop mode: style=%x extstyle=%x pos=(%d,%d)-(%d,%d)\n",
|
|
||||||
OldStyle, OldExtStyle, WinRect.left, WinRect.top, WinRect.right, WinRect.bottom);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_STYLE, OldStyle);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, OldExtStyle);
|
|
||||||
// MoveWindow doesn't recover the exact position!!!
|
|
||||||
(*pSetWindowPos)(hwnd, HWND_TOP,
|
|
||||||
WinRect.left, WinRect.top, (WinRect.right-WinRect.left), (WinRect.bottom-WinRect.top),
|
|
||||||
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
|
||||||
memset(&WinRect, 0, sizeof(WinRect));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
RECT DesktopRect;
|
|
||||||
HWND DesktopWnd;
|
|
||||||
HDC hClientDC;
|
|
||||||
OutTraceDW("DxWnd: entering desktop mode\n");
|
|
||||||
if((WinRect.left==0) && (WinRect.right==0) && (WinRect.top==0) && (WinRect.bottom==0)) (*pGetWindowRect)(hwnd, &WinRect);
|
|
||||||
OldStyle = (*pGetWindowLongA)(hwnd, GWL_STYLE);
|
|
||||||
OldExtStyle = (*pGetWindowLongA)(hwnd, GWL_EXSTYLE);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_STYLE, WS_VISIBLE|WS_CLIPSIBLINGS|WS_OVERLAPPED);
|
|
||||||
(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0);
|
|
||||||
(*pUpdateWindow)(hwnd);
|
|
||||||
DesktopWnd = (*pGetDesktopWindow)();
|
|
||||||
hClientDC=(*pGDIGetDC)(hwnd);
|
|
||||||
if(bWorkArea)
|
|
||||||
(*pSystemParametersInfoA)(SPI_GETWORKAREA, NULL, &DesktopRect, 0);
|
|
||||||
else
|
|
||||||
(*pGetClientRect)(DesktopWnd, &DesktopRect);
|
|
||||||
OutTraceDW("DxWnd: desktop=(%d,%d)-(%d,%d)\n");
|
|
||||||
(*pSetWindowPos)(hwnd, HWND_TOP,
|
|
||||||
DesktopRect.left, DesktopRect.top, (DesktopRect.right-DesktopRect.left), (DesktopRect.bottom-DesktopRect.top),
|
|
||||||
SWP_DRAWFRAME|SWP_FRAMECHANGED|SWP_SHOWWINDOW);
|
|
||||||
(*pGDIBitBlt)(hClientDC, DesktopRect.left, DesktopRect.top, DesktopRect.right, DesktopRect.bottom, NULL, 0, 0, BLACKNESS);
|
|
||||||
}
|
|
||||||
bDesktopToggle = !bDesktopToggle; // switch toggle
|
|
||||||
(*pUpdateWindow)(hwnd);
|
|
||||||
dxw.ScreenRefresh();
|
|
||||||
(*pInvalidateRect)(hwnd, NULL, FALSE); // force window update
|
|
||||||
}
|
|
||||||
|
|
||||||
LRESULT LastCursorPos;
|
LRESULT LastCursorPos;
|
||||||
|
|
||||||
LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
|
||||||
|
182
host/SpecialEdit.cpp
Normal file
182
host/SpecialEdit.cpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
#include "stdafx.h"
|
||||||
|
#include "SpecialEdit.h"
|
||||||
|
|
||||||
|
#include <afxole.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
#ifdef _DEBUG
|
||||||
|
#define new DEBUG_NEW
|
||||||
|
#undef THIS_FILE
|
||||||
|
static char THIS_FILE[] = __FILE__;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
BaseFormat::BaseFormat()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseFormat::~BaseFormat()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseFormat::SetAllowedChars(std::vector<TCHAR> chars)
|
||||||
|
{
|
||||||
|
m_listChars = chars;
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseFormat::SetAllowedChars(LPCTSTR chars, int size)
|
||||||
|
{
|
||||||
|
m_listChars.erase(m_listChars.begin(), m_listChars.end());
|
||||||
|
m_listChars.reserve(size);
|
||||||
|
m_listChars.assign(chars, chars+size);
|
||||||
|
}
|
||||||
|
|
||||||
|
RelIntegerFormat::RelIntegerFormat()
|
||||||
|
{
|
||||||
|
LPCTSTR format = _T("-+0123456789");
|
||||||
|
SetAllowedChars(format, _tcslen(format));
|
||||||
|
}
|
||||||
|
|
||||||
|
RelIntegerFormat::~RelIntegerFormat()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BaseFormat::IsCharAllowed(TCHAR nChar)
|
||||||
|
{
|
||||||
|
std::vector<TCHAR>::iterator pos = std::find(m_listChars.begin(), m_listChars.end(), nChar);
|
||||||
|
return (pos != m_listChars.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
CSpecialEdit::CSpecialEdit()
|
||||||
|
{
|
||||||
|
m_formatter = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CSpecialEdit::~CSpecialEdit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_MESSAGE_MAP(CSpecialEdit, CEdit)
|
||||||
|
//{{AFX_MSG_MAP(CSpecialEdit)
|
||||||
|
ON_WM_CHAR()
|
||||||
|
//}}AFX_MSG_MAP
|
||||||
|
END_MESSAGE_MAP()
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
// CSpecialEdit message handlers
|
||||||
|
|
||||||
|
void CSpecialEdit::SetFormatter(IFormat *formatter)
|
||||||
|
{
|
||||||
|
ASSERT(formatter != NULL);
|
||||||
|
m_formatter = formatter;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSpecialEdit::IsCharAllowed(TCHAR nChar)
|
||||||
|
{
|
||||||
|
switch(nChar){
|
||||||
|
case _T('\b'):
|
||||||
|
case 10:
|
||||||
|
case 13:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(m_formatter != NULL);
|
||||||
|
return m_formatter->IsCharAllowed(nChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSpecialEdit::IsClipboardOK()
|
||||||
|
{
|
||||||
|
bool isOK = true;
|
||||||
|
COleDataObject obj;
|
||||||
|
|
||||||
|
if (obj.AttachClipboard()) {
|
||||||
|
HGLOBAL hmem = NULL;
|
||||||
|
TCHAR *pUniText = NULL;
|
||||||
|
DWORD dwLen = 0;
|
||||||
|
bool bText = false;
|
||||||
|
|
||||||
|
if (obj.IsDataAvailable(CF_TEXT)){
|
||||||
|
hmem = obj.GetGlobalData(CF_TEXT);
|
||||||
|
|
||||||
|
char *pCharText = (char*)::GlobalLock(hmem);
|
||||||
|
#ifdef UNICODE
|
||||||
|
int lenA = strlen(pCharText);
|
||||||
|
int lenW = MultiByteToWideChar(CP_ACP, 0, pCharText, lenA, 0, 0);
|
||||||
|
if (lenW > 0){
|
||||||
|
pUniText = ::SysAllocStringLen(0, lenW);
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, pCharText, lenA, pUniText, lenW);
|
||||||
|
bText = true;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
::GlobalUnlock(hmem);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
pUniText = pCharText;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef UNICODE
|
||||||
|
else if(obj.IsDataAvailable(CF_UNICODETEXT)){
|
||||||
|
hmem = obj.GetGlobalData(CF_UNICODETEXT);
|
||||||
|
pUniText = (TCHAR*)::GlobalLock(hmem);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if(hmem){
|
||||||
|
DWORD dwLen = _tcslen(pUniText);
|
||||||
|
for(DWORD i=0; i<dwLen && isOK; i++)
|
||||||
|
isOK = IsCharAllowed(pUniText[i]);
|
||||||
|
::GlobalUnlock(hmem);
|
||||||
|
#ifdef UNICODE
|
||||||
|
if(bText)
|
||||||
|
::SysFreeString(pUniText);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return isOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
LRESULT CSpecialEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch(message){
|
||||||
|
case WM_PASTE:
|
||||||
|
if(!IsClipboardOK()){
|
||||||
|
MessageBeep(-1);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CEdit::WindowProc(message, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSpecialEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
|
||||||
|
{
|
||||||
|
if(GetKeyState(VK_CONTROL) & 0x80000000){
|
||||||
|
switch(nChar){
|
||||||
|
case 0x03:
|
||||||
|
Copy();
|
||||||
|
return;
|
||||||
|
case 0x16:
|
||||||
|
Paste();
|
||||||
|
return;
|
||||||
|
case 0x18:
|
||||||
|
Cut();
|
||||||
|
return;
|
||||||
|
case 0x1a:
|
||||||
|
Undo();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!IsCharAllowed(nChar)){
|
||||||
|
MessageBeep(-1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CEdit::OnChar(nChar, nRepCnt, nFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
IFormat::~IFormat()
|
||||||
|
{
|
||||||
|
}
|
52
host/SpecialEdit.h
Normal file
52
host/SpecialEdit.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class IFormat
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~IFormat();
|
||||||
|
virtual bool IsCharAllowed(TCHAR nChar) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
class BaseFormat : public IFormat
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
std::vector<TCHAR> m_listChars;
|
||||||
|
BaseFormat();
|
||||||
|
virtual ~BaseFormat();
|
||||||
|
public:
|
||||||
|
void SetAllowedChars(std::vector<TCHAR> chars);
|
||||||
|
void SetAllowedChars(LPCTSTR chars, int size);
|
||||||
|
virtual bool IsCharAllowed(TCHAR nChar);
|
||||||
|
};
|
||||||
|
|
||||||
|
class RelIntegerFormat : public BaseFormat
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RelIntegerFormat();
|
||||||
|
virtual ~RelIntegerFormat();
|
||||||
|
};
|
||||||
|
|
||||||
|
class CSpecialEdit : public CEdit
|
||||||
|
{
|
||||||
|
IFormat *m_formatter;
|
||||||
|
bool IsClipboardOK();
|
||||||
|
bool IsCharAllowed(TCHAR nChar);
|
||||||
|
|
||||||
|
public:
|
||||||
|
CSpecialEdit();
|
||||||
|
virtual ~CSpecialEdit();
|
||||||
|
void SetFormatter(IFormat *formatter);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// ClassWizard generated virtual function overrides
|
||||||
|
//{{AFX_VIRTUAL(CSpecialEdit)
|
||||||
|
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
|
||||||
|
//}}AFX_VIRTUAL
|
||||||
|
|
||||||
|
//{{AFX_MSG(CSpecialEdit)
|
||||||
|
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
|
||||||
|
//}}AFX_MSG
|
||||||
|
|
||||||
|
DECLARE_MESSAGE_MAP()
|
||||||
|
};
|
@ -5,6 +5,7 @@
|
|||||||
#include "TargetDlg.h"
|
#include "TargetDlg.h"
|
||||||
#include "TabProgram.h"
|
#include "TabProgram.h"
|
||||||
#include "dxwndhost.h"
|
#include "dxwndhost.h"
|
||||||
|
#include "specialedit.h"
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
#define new DEBUG_NEW
|
#define new DEBUG_NEW
|
||||||
@ -33,8 +34,11 @@ CTabProgram::CTabProgram(CWnd* pParent /*=NULL*/)
|
|||||||
|
|
||||||
void CTabProgram::DoDataExchange(CDataExchange* pDX)
|
void CTabProgram::DoDataExchange(CDataExchange* pDX)
|
||||||
{
|
{
|
||||||
|
CString sPosX, sPosY;
|
||||||
CDialog::DoDataExchange(pDX);
|
CDialog::DoDataExchange(pDX);
|
||||||
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
||||||
|
sPosX.Format("%d", cTarget->m_PosX);
|
||||||
|
sPosY.Format("%d", cTarget->m_PosY);
|
||||||
DDX_Radio(pDX, IDC_COORDINATES, cTarget->m_Coordinates);
|
DDX_Radio(pDX, IDC_COORDINATES, cTarget->m_Coordinates);
|
||||||
DDX_Control(pDX, IDC_FILE, cTarget->m_File);
|
DDX_Control(pDX, IDC_FILE, cTarget->m_File);
|
||||||
DDX_Control(pDX, IDC_LAUNCH, cTarget->m_Launch);
|
DDX_Control(pDX, IDC_LAUNCH, cTarget->m_Launch);
|
||||||
@ -50,10 +54,14 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX)
|
|||||||
DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad);
|
DDX_Check(pDX, IDC_SAVELOAD, cTarget->m_SaveLoad);
|
||||||
DDX_Check(pDX, IDC_KEEPASPECTRATIO, cTarget->m_KeepAspectRatio);
|
DDX_Check(pDX, IDC_KEEPASPECTRATIO, cTarget->m_KeepAspectRatio);
|
||||||
DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);
|
DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);
|
||||||
DDX_Text(pDX, IDC_POSX, cTarget->m_PosX);
|
//DDX_Text(pDX, IDC_POSX, cTarget->m_PosX);
|
||||||
DDX_Text(pDX, IDC_POSY, cTarget->m_PosY);
|
//DDX_Text(pDX, IDC_POSY, cTarget->m_PosY);
|
||||||
|
DDX_Text(pDX, IDC_POSX, sPosX);
|
||||||
|
DDX_Text(pDX, IDC_POSY, sPosY);
|
||||||
DDX_Text(pDX, IDC_SIZX, cTarget->m_SizX);
|
DDX_Text(pDX, IDC_SIZX, cTarget->m_SizX);
|
||||||
DDX_Text(pDX, IDC_SIZY, cTarget->m_SizY);
|
DDX_Text(pDX, IDC_SIZY, cTarget->m_SizY);
|
||||||
|
cTarget->m_PosX = atoi(sPosX);
|
||||||
|
cTarget->m_PosY = atoi(sPosY);
|
||||||
}
|
}
|
||||||
|
|
||||||
BEGIN_MESSAGE_MAP(CTabProgram, CDialog)
|
BEGIN_MESSAGE_MAP(CTabProgram, CDialog)
|
||||||
@ -147,6 +155,7 @@ BOOL CTabProgram::OnInitDialog()
|
|||||||
HINSTANCE Hinst;
|
HINSTANCE Hinst;
|
||||||
HICON Icon, PrevIcon;
|
HICON Icon, PrevIcon;
|
||||||
CStatic *IconBox;
|
CStatic *IconBox;
|
||||||
|
IFormat *m_pRelIntegerFormat = new(RelIntegerFormat);
|
||||||
|
|
||||||
CDialog::OnInitDialog();
|
CDialog::OnInitDialog();
|
||||||
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
|
||||||
@ -159,5 +168,11 @@ BOOL CTabProgram::OnInitDialog()
|
|||||||
IconBox->SetIcon(::LoadIcon(NULL, IDI_ERROR));
|
IconBox->SetIcon(::LoadIcon(NULL, IDI_ERROR));
|
||||||
::FreeLibrary(Hinst);
|
::FreeLibrary(Hinst);
|
||||||
if(PrevIcon) ::DestroyIcon(PrevIcon);
|
if(PrevIcon) ::DestroyIcon(PrevIcon);
|
||||||
|
|
||||||
|
m_EditPosX.SubclassDlgItem(IDC_POSX, this);
|
||||||
|
m_EditPosY.SubclassDlgItem(IDC_POSY, this);
|
||||||
|
m_EditPosX.SetFormatter(m_pRelIntegerFormat);
|
||||||
|
m_EditPosY.SetFormatter(m_pRelIntegerFormat);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
// TabProgram.h : header file
|
// TabProgram.h : header file
|
||||||
//
|
//
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
#include "afxwin.h"
|
||||||
|
#include "specialedit.h"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// CTabProgram dialog
|
// CTabProgram dialog
|
||||||
@ -40,6 +42,9 @@ protected:
|
|||||||
DECLARE_MESSAGE_MAP()
|
DECLARE_MESSAGE_MAP()
|
||||||
public:
|
public:
|
||||||
BOOL OnInitDialog();
|
BOOL OnInitDialog();
|
||||||
|
protected:
|
||||||
|
CSpecialEdit m_EditPosX;
|
||||||
|
CSpecialEdit m_EditPosY;
|
||||||
};
|
};
|
||||||
|
|
||||||
//{{AFX_INSERT_LOCATION}}
|
//{{AFX_INSERT_LOCATION}}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
// TargetDlg.h : Header file
|
// TargetDlg.h : Header file
|
||||||
//
|
//
|
||||||
#include "dxTabCtrl.h"
|
#include "dxTabCtrl.h"
|
||||||
|
#include "SpecialEdit.h"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// CTargetDlg Dialog
|
// CTargetDlg Dialog
|
||||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -381,6 +381,10 @@
|
|||||||
RelativePath=".\ShimsDialog.cpp"
|
RelativePath=".\ShimsDialog.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SpecialEdit.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\StatusDialog.cpp"
|
RelativePath=".\StatusDialog.cpp"
|
||||||
>
|
>
|
||||||
@ -536,6 +540,10 @@
|
|||||||
RelativePath=".\Resource.h"
|
RelativePath=".\Resource.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\SpecialEdit.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath=".\StatusDialog.h"
|
RelativePath=".\StatusDialog.h"
|
||||||
>
|
>
|
||||||
|
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user