mirror of
https://github.com/libretro/xmil-libretro.git
synced 2024-11-23 08:09:42 +00:00
win9x: adds resizer
refs #94 svn merge -r 342:343 https://amethyst.yui.ne.jp/svn-dev/x1/xmil/branches/yui/WORK_01
This commit is contained in:
parent
1edca61000
commit
bd48847366
@ -7,6 +7,7 @@
|
||||
#include "d_cfg.h"
|
||||
#include "resource.h"
|
||||
#include <commctrl.h>
|
||||
#include "xmil.h"
|
||||
#include "soundmng.h"
|
||||
#include "sysmng.h"
|
||||
#include "pccore.h"
|
||||
@ -51,6 +52,8 @@ BOOL CConfigDlg::OnInitDialog()
|
||||
}
|
||||
#endif // !defined(DISABLE_SOUND)
|
||||
|
||||
CheckDlgButton(IDC_ALLOWRESIZE, (xmiloscfg.thickframe) ? BST_CHECKED : BST_UNCHECKED);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -91,6 +94,13 @@ void CConfigDlg::OnOK()
|
||||
}
|
||||
#endif // !defined(DISABLE_SOUND)
|
||||
|
||||
const UINT8 bAllowResize = (IsDlgButtonChecked(IDC_ALLOWRESIZE) != BST_UNCHECKED) ? 1 : 0;
|
||||
if (xmiloscfg.thickframe != bAllowResize)
|
||||
{
|
||||
xmiloscfg.thickframe = bAllowResize;
|
||||
nUpdateFlags |= SYS_UPDATEOSCFG;
|
||||
}
|
||||
|
||||
::sysmng_update(nUpdateFlags);
|
||||
|
||||
CDlgProc::OnOK();
|
||||
|
@ -110,6 +110,26 @@ void extclass_enablemenu(HWND hWnd, BOOL enable) {
|
||||
}
|
||||
}
|
||||
|
||||
void extclass_frametype(HWND hWnd, UINT8 thick) {
|
||||
|
||||
RECT rect;
|
||||
DWORD style;
|
||||
|
||||
GetClientRect(hWnd, &rect);
|
||||
style = GetWindowLong(hWnd, GWL_STYLE);
|
||||
if (thick) {
|
||||
style |= WS_THICKFRAME;
|
||||
}
|
||||
else {
|
||||
style &= ~WS_THICKFRAME;
|
||||
}
|
||||
SetWindowLong(hWnd, GWL_STYLE, style);
|
||||
SetWindowPos(hWnd, 0, 0, 0, 0, 0,
|
||||
SWP_FRAMECHANGED | SWP_DRAWFRAME |
|
||||
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
|
||||
extclass_setclientsize(hWnd, rect.right - rect.left, rect.bottom - rect.top);
|
||||
}
|
||||
|
||||
HMENU extclass_gethmenu(HWND hWnd) {
|
||||
|
||||
HMENU ret;
|
||||
@ -121,3 +141,53 @@ HMENU extclass_gethmenu(HWND hWnd) {
|
||||
return(ret);
|
||||
}
|
||||
|
||||
void extclass_setclientsize(HWND hwnd, int width, int height) {
|
||||
|
||||
RECT rectDisktop;
|
||||
int scx;
|
||||
int scy;
|
||||
UINT cnt;
|
||||
RECT rectWindow;
|
||||
RECT rectClient;
|
||||
int x, y, w, h;
|
||||
|
||||
SystemParametersInfo(SPI_GETWORKAREA, 0, &rectDisktop, 0);
|
||||
scx = GetSystemMetrics(SM_CXSCREEN);
|
||||
scy = GetSystemMetrics(SM_CYSCREEN);
|
||||
|
||||
cnt = 2;
|
||||
do {
|
||||
GetWindowRect(hwnd, &rectWindow);
|
||||
GetClientRect(hwnd, &rectClient);
|
||||
w = width + (rectWindow.right - rectWindow.left)
|
||||
- (rectClient.right - rectClient.left);
|
||||
h = height + (rectWindow.bottom - rectWindow.top)
|
||||
- (rectClient.bottom - rectClient.top);
|
||||
|
||||
x = rectWindow.left;
|
||||
y = rectWindow.top;
|
||||
if (scx < w) {
|
||||
x = (scx - w) / 2;
|
||||
}
|
||||
else {
|
||||
if ((x + w) > rectDisktop.right) {
|
||||
x = rectDisktop.right - w;
|
||||
}
|
||||
if (x < rectDisktop.left) {
|
||||
x = rectDisktop.left;
|
||||
}
|
||||
}
|
||||
if (scy < h) {
|
||||
y = (scy - h) / 2;
|
||||
}
|
||||
else {
|
||||
if ((y + h) > rectDisktop.bottom) {
|
||||
y = rectDisktop.bottom - h;
|
||||
}
|
||||
if (y < rectDisktop.top) {
|
||||
y = rectDisktop.top;
|
||||
}
|
||||
}
|
||||
MoveWindow(hwnd, x, y, w, h, TRUE);
|
||||
} while(--cnt);
|
||||
}
|
||||
|
@ -22,5 +22,6 @@ enum {
|
||||
void extclass_wmcreate(HWND hWnd);
|
||||
void extclass_wmdestroy(HWND hWnd);
|
||||
void extclass_enablemenu(HWND hWnd, BOOL enable);
|
||||
void extclass_frametype(HWND hWnd, UINT8 thick);
|
||||
HMENU extclass_gethmenu(HWND hWnd);
|
||||
|
||||
void extclass_setclientsize(HWND hwnd, int width, int height);
|
||||
|
@ -363,6 +363,7 @@ static const PFTBL s_IniItems[] =
|
||||
PFAND("clock_dn", PFRO_HEX32, &xmiloscfg.clockcolor2, 0xffffff),
|
||||
#endif /* defined(SUPPORT_DCLOCK) */
|
||||
|
||||
PFVAL("thickfrm", PFTYPE_BOOL, &xmiloscfg.thickframe),
|
||||
PFVAL("fscrnbpp", PFRO_UINT8, &xmiloscfg.fscrnbpp),
|
||||
PFVAL("fscrnmod", PFTYPE_HEX8, &xmiloscfg.fscrnmod),
|
||||
};
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define IDC_MAKE2D 1008
|
||||
#define IDC_MAKE2HD 1009
|
||||
#define IDC_XMILVER 1010
|
||||
#define IDC_ALLOWRESIZE 1011
|
||||
#define IDC_FULLSCREEN_SAMEBPP 1101
|
||||
#define IDC_FULLSCREEN_SAMERES 1102
|
||||
#define IDC_FULLSCREEN_ZOOM 1103
|
||||
|
@ -63,7 +63,7 @@ typedef struct {
|
||||
int width;
|
||||
int height;
|
||||
// int extend;
|
||||
// int multiple;
|
||||
int multiple;
|
||||
} SCRNSTAT;
|
||||
|
||||
static DDRAW ddraw;
|
||||
@ -208,7 +208,7 @@ static void renewalclientsize(BOOL winloc) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
multiple = 8;
|
||||
multiple = scrnstat.multiple;
|
||||
scrnwidth = (width * multiple) >> 3;
|
||||
scrnheight = (height * multiple) >> 3;
|
||||
ddraw.rect.right = width;
|
||||
@ -387,7 +387,7 @@ void scrnmng_initialize(void) {
|
||||
scrnstat.width = 640;
|
||||
scrnstat.height = 400;
|
||||
// scrnstat.extend = 1;
|
||||
// scrnstat.multiple = 8;
|
||||
scrnstat.multiple = 8;
|
||||
setwindowsize(hWndMain, 640, 400);
|
||||
}
|
||||
|
||||
@ -407,7 +407,7 @@ BRESULT scrnmng_create(UINT8 scrnmode) {
|
||||
winstyleex = GetWindowLong(hWndMain, GWL_EXSTYLE);
|
||||
if (scrnmode & SCRNMODE_FULLSCREEN) {
|
||||
scrnmng.flag = SCRNFLAG_FULLSCREEN;
|
||||
winstyle &= ~(WS_CAPTION | WS_OVERLAPPED | WS_SYSMENU);
|
||||
winstyle &= ~(WS_CAPTION | WS_SYSMENU | WS_THICKFRAME);
|
||||
winstyle |= WS_POPUP;
|
||||
winstyleex |= WS_EX_TOPMOST;
|
||||
ddraw.menudisp = FALSE;
|
||||
@ -417,6 +417,9 @@ BRESULT scrnmng_create(UINT8 scrnmode) {
|
||||
else {
|
||||
// scrnmng.flag = 0;
|
||||
winstyle |= WS_SYSMENU;
|
||||
if (xmiloscfg.thickframe) {
|
||||
winstyle |= WS_THICKFRAME;
|
||||
}
|
||||
winstyle |= WS_CAPTION;
|
||||
winstyle &= ~WS_POPUP;
|
||||
winstyleex &= ~WS_EX_TOPMOST;
|
||||
@ -798,6 +801,23 @@ void scrnmng_update(void) {
|
||||
}
|
||||
|
||||
|
||||
// ----
|
||||
|
||||
void scrnmng_setmultiple(int multiple)
|
||||
{
|
||||
if (scrnstat.multiple != multiple)
|
||||
{
|
||||
scrnstat.multiple = multiple;
|
||||
renewalclientsize(TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
int scrnmng_getmultiple(void)
|
||||
{
|
||||
return scrnstat.multiple;
|
||||
}
|
||||
|
||||
|
||||
// ----
|
||||
|
||||
#if defined(SUPPORT_DCLOCK)
|
||||
@ -840,3 +860,113 @@ void scrnmng_dispclock(void)
|
||||
}
|
||||
#endif // defined(SUPPORT_DCLOCK)
|
||||
|
||||
|
||||
// ----
|
||||
|
||||
typedef struct {
|
||||
int bx;
|
||||
int by;
|
||||
int cx;
|
||||
int cy;
|
||||
int mul;
|
||||
} SCRNSIZING;
|
||||
|
||||
static SCRNSIZING scrnsizing;
|
||||
|
||||
enum {
|
||||
SIZING_ADJUST = 12
|
||||
};
|
||||
|
||||
void scrnmng_entersizing(void) {
|
||||
|
||||
RECT rectwindow;
|
||||
RECT rectclient;
|
||||
int cx;
|
||||
int cy;
|
||||
|
||||
GetWindowRect(hWndMain, &rectwindow);
|
||||
GetClientRect(hWndMain, &rectclient);
|
||||
scrnsizing.bx = (rectwindow.right - rectwindow.left) -
|
||||
(rectclient.right - rectclient.left);
|
||||
scrnsizing.by = (rectwindow.bottom - rectwindow.top) -
|
||||
(rectclient.bottom - rectclient.top);
|
||||
cx = min(scrnstat.width, ddraw.width);
|
||||
cx = (cx + 7) >> 3;
|
||||
cy = min(scrnstat.height, ddraw.height);
|
||||
cy = (cy + 7) >> 3;
|
||||
scrnsizing.cx = cx;
|
||||
scrnsizing.cy = cy;
|
||||
scrnsizing.mul = scrnstat.multiple;
|
||||
}
|
||||
|
||||
void scrnmng_sizing(UINT side, RECT *rect) {
|
||||
|
||||
int width;
|
||||
int height;
|
||||
int mul;
|
||||
|
||||
if ((side != WMSZ_TOP) && (side != WMSZ_BOTTOM)) {
|
||||
width = rect->right - rect->left - scrnsizing.bx + SIZING_ADJUST;
|
||||
width /= scrnsizing.cx;
|
||||
}
|
||||
else {
|
||||
width = 16;
|
||||
}
|
||||
if ((side != WMSZ_LEFT) && (side != WMSZ_RIGHT)) {
|
||||
height = rect->bottom - rect->top - scrnsizing.by + SIZING_ADJUST;
|
||||
height /= scrnsizing.cy;
|
||||
}
|
||||
else {
|
||||
height = 16;
|
||||
}
|
||||
mul = min(width, height);
|
||||
if (mul <= 0) {
|
||||
mul = 1;
|
||||
}
|
||||
else if (mul > 16) {
|
||||
mul = 16;
|
||||
}
|
||||
width = scrnsizing.bx + (scrnsizing.cx * mul);
|
||||
height = scrnsizing.by + (scrnsizing.cy * mul);
|
||||
switch(side) {
|
||||
case WMSZ_LEFT:
|
||||
case WMSZ_TOPLEFT:
|
||||
case WMSZ_BOTTOMLEFT:
|
||||
rect->left = rect->right - width;
|
||||
break;
|
||||
|
||||
case WMSZ_RIGHT:
|
||||
case WMSZ_TOP:
|
||||
case WMSZ_TOPRIGHT:
|
||||
case WMSZ_BOTTOM:
|
||||
case WMSZ_BOTTOMRIGHT:
|
||||
default:
|
||||
rect->right = rect->left + width;
|
||||
break;
|
||||
}
|
||||
|
||||
switch(side) {
|
||||
case WMSZ_TOP:
|
||||
case WMSZ_TOPLEFT:
|
||||
case WMSZ_TOPRIGHT:
|
||||
rect->top = rect->bottom - height;
|
||||
break;
|
||||
|
||||
case WMSZ_LEFT:
|
||||
case WMSZ_RIGHT:
|
||||
case WMSZ_BOTTOM:
|
||||
case WMSZ_BOTTOMLEFT:
|
||||
case WMSZ_BOTTOMRIGHT:
|
||||
default:
|
||||
rect->bottom = rect->top + height;
|
||||
break;
|
||||
}
|
||||
scrnsizing.mul = mul;
|
||||
}
|
||||
|
||||
void scrnmng_exitsizing(void)
|
||||
{
|
||||
scrnmng_setmultiple(scrnsizing.mul);
|
||||
InvalidateRect(hWndMain, NULL, TRUE); // ugh
|
||||
}
|
||||
|
||||
|
@ -76,15 +76,22 @@ RGB16 scrnmng_makepal16(RGB32 pal32); // pal_get16pal
|
||||
|
||||
// ---- for windows
|
||||
|
||||
void scrnmng_setmultiple(int multiple);
|
||||
int scrnmng_getmultiple(void);
|
||||
|
||||
void scrnmng_initialize(void); // ddraws_initwindowsize
|
||||
BRESULT scrnmng_create(UINT8 scrnmode); // ddraws_InitDirectDraw
|
||||
void scrnmng_destroy(void); // ddraws_TermDirectDraw
|
||||
#if defined(SUPPORT_DCLOCK)
|
||||
void scrnmng_dispclock(void); // ddraws_dispclock
|
||||
#endif // defined(SUPPORT_DCLOCK)
|
||||
|
||||
void scrnmng_querypalette(void); // ddraws_palette
|
||||
void scrnmng_fullscrnmenu(int y);
|
||||
void scrnmng_topwinui(void); // ddraws_topwinui
|
||||
void scrnmng_clearwinui(void); // ddraws_clearwinui
|
||||
|
||||
void scrnmng_entersizing(void);
|
||||
void scrnmng_sizing(UINT side, RECT *rect);
|
||||
void scrnmng_exitsizing(void);
|
||||
|
||||
#if defined(SUPPORT_DCLOCK)
|
||||
void scrnmng_dispclock(void);
|
||||
#endif // defined(SUPPORT_DCLOCK)
|
||||
|
@ -57,7 +57,7 @@ static const OEMCHAR szClassName[] = OEMTEXT("Xmil-MainWindow");
|
||||
#if defined(SUPPORT_DCLOCK)
|
||||
0, 0, 0xffffff, 0xffbf6a,
|
||||
#endif // defined(SUPPORT_DCLOCK)
|
||||
0,
|
||||
0, 0,
|
||||
FSCRNMOD_SAMEBPP | FSCRNMOD_SAMERES | FSCRNMOD_ASPECTFIX8
|
||||
};
|
||||
|
||||
@ -272,6 +272,13 @@ static void xmilcmd(HWND hWnd, UINT cmd) {
|
||||
case IDM_CONFIG:
|
||||
winuienter();
|
||||
CConfigDlg::Config(hWnd);
|
||||
if (!scrnmng_isfullscreen()) {
|
||||
UINT8 thick;
|
||||
thick = (GetWindowLong(hWnd, GWL_STYLE) & WS_THICKFRAME) ? 1 : 0;
|
||||
if (thick != xmiloscfg.thickframe) {
|
||||
extclass_frametype(hWnd, xmiloscfg.thickframe);
|
||||
}
|
||||
}
|
||||
winuileave();
|
||||
break;
|
||||
|
||||
@ -714,11 +721,7 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
soundmng_disable(SNDPROC_MAIN);
|
||||
mousemng_disable(MOUSEPROC_WINUI);
|
||||
s_wndloc.Start();
|
||||
break;
|
||||
|
||||
case WM_EXITSIZEMOVE:
|
||||
mousemng_enable(MOUSEPROC_WINUI);
|
||||
soundmng_enable(SNDPROC_MAIN);
|
||||
scrnmng_entersizing();
|
||||
break;
|
||||
|
||||
case WM_MOVING:
|
||||
@ -728,6 +731,16 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SIZING:
|
||||
scrnmng_sizing((UINT)wParam, (RECT *)lParam);
|
||||
break;
|
||||
|
||||
case WM_EXITSIZEMOVE:
|
||||
scrnmng_exitsizing();
|
||||
mousemng_enable(MOUSEPROC_WINUI);
|
||||
soundmng_enable(SNDPROC_MAIN);
|
||||
break;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
if (wParam == VK_F12) {
|
||||
mousemng_toggle(MOUSEPROC_SYSTEM);
|
||||
@ -971,12 +984,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
|
||||
|
||||
mousemng_initialize();
|
||||
|
||||
DWORD style = WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX;
|
||||
if (xmiloscfg.thickframe) {
|
||||
style |= WS_THICKFRAME;
|
||||
}
|
||||
hWnd = CreateWindowEx(0,
|
||||
szClassName, szProgName,
|
||||
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |
|
||||
WS_MINIMIZEBOX,
|
||||
xmiloscfg.winx, xmiloscfg.winy,
|
||||
SURFACE_WIDTH, SURFACE_HEIGHT,
|
||||
szClassName, szProgName, style,
|
||||
xmiloscfg.winx, xmiloscfg.winy, SURFACE_WIDTH, SURFACE_HEIGHT,
|
||||
NULL, NULL, hInstance, NULL);
|
||||
hWndMain = hWnd;
|
||||
scrnmng_initialize();
|
||||
|
@ -29,6 +29,7 @@ typedef struct {
|
||||
UINT32 clockcolor2;
|
||||
#endif // defined(SUPPORT_DCLOCK)
|
||||
|
||||
UINT8 thickframe;
|
||||
UINT8 fscrnbpp;
|
||||
UINT8 fscrnmod;
|
||||
} XMILOSCFG;
|
||||
|
@ -225,7 +225,7 @@ END
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_CONFIG DIALOG DISCARDABLE 0, 0, 194, 80
|
||||
IDD_CONFIG DIALOG DISCARDABLE 0, 0, 194, 100
|
||||
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
CAPTION "Configure"
|
||||
FONT 9, "MS Pゴシック"
|
||||
@ -240,6 +240,8 @@ BEGIN
|
||||
LTEXT "ms",IDC_STATIC,116,37,10,8
|
||||
LTEXT "Seek Volume",IDC_STATIC,16,52,38,8
|
||||
EDITTEXT IDC_SEEKVOL,80,50,20,12
|
||||
CONTROL "Allow resize",IDC_ALLOWRESIZE,"Button",BS_AUTOCHECKBOX |
|
||||
WS_TABSTOP,8,80,162,10
|
||||
DEFPUSHBUTTON "&OK",IDOK,144,12,44,14
|
||||
PUSHBUTTON "Cancel",IDCANCEL,144,30,44,14
|
||||
END
|
||||
|
Loading…
Reference in New Issue
Block a user