Win32: Use accurate calculation for client area->window size conversion (gocha)

This commit is contained in:
OV2 2011-01-14 20:20:05 +01:00
parent 46bc2d4c5c
commit 695e4b6b8e
3 changed files with 30 additions and 31 deletions

View File

@ -776,26 +776,12 @@ void WinPreSave(ConfigFile& conf)
if(GUI.window_size.bottom < 10) GUI.window_size.bottom = 10; if(GUI.window_size.bottom < 10) GUI.window_size.bottom = 10;
if(GUI.window_size.right < 10) GUI.window_size.right = 10; if(GUI.window_size.right < 10) GUI.window_size.right = 10;
/*if(!Settings.SoundPlaybackRate) {Settings.SoundPlaybackRate = 6; GUI.Mute = TRUE;}
else if(Settings.SoundPlaybackRate <= 8000) Settings.SoundPlaybackRate = 1;
else if(Settings.SoundPlaybackRate <= 11025) Settings.SoundPlaybackRate = 2;
else if(Settings.SoundPlaybackRate <= 16000) Settings.SoundPlaybackRate = 3;
else if(Settings.SoundPlaybackRate <= 22050) Settings.SoundPlaybackRate = 4;
else if(Settings.SoundPlaybackRate <= 30000) Settings.SoundPlaybackRate = 5;
else if(Settings.SoundPlaybackRate <= 32000) Settings.SoundPlaybackRate = 6;
else if(Settings.SoundPlaybackRate <= 35000) Settings.SoundPlaybackRate = 7;
else if(Settings.SoundPlaybackRate <= 44100) Settings.SoundPlaybackRate = 8;
else Settings.SoundPlaybackRate = 9;*/
conf.DeleteKey("Sound::Mono"); conf.DeleteKey("Sound::Mono");
if(configSort == 2) if(configSort == 2)
conf.ClearLines(); conf.ClearLines();
} }
void WinPostSave(ConfigFile& conf) void WinPostSave(ConfigFile& conf)
{ {
/*if(GUI.window_size.left < -30) GUI.window_size.left = -30;
if(GUI.window_size.top < -30) GUI.window_size.top = -30;
if(GUI.window_size.left+GUI.window_size.right > GetSystemMetrics(SM_CXSCREEN)+30) GUI.window_size.left = GetSystemMetrics(SM_CXSCREEN)+30-GUI.window_size.right;
if(GUI.window_size.top+GUI.window_size.bottom > GetSystemMetrics(SM_CYSCREEN)+30) GUI.window_size.top = GetSystemMetrics(SM_CYSCREEN)+30-GUI.window_size.bottom;*/
int extra_width = 2*(GetSystemMetrics(SM_CXBORDER) + int extra_width = 2*(GetSystemMetrics(SM_CXBORDER) +
GetSystemMetrics(SM_CXDLGFRAME)); GetSystemMetrics(SM_CXDLGFRAME));
int extra_height = 2*(GetSystemMetrics(SM_CYBORDER) + int extra_height = 2*(GetSystemMetrics(SM_CYBORDER) +
@ -809,17 +795,6 @@ void WinPostSave(ConfigFile& conf)
GUI.window_size.bottom += GUI.window_size.top; GUI.window_size.bottom += GUI.window_size.top;
GUI.window_size.right += extra_width; GUI.window_size.right += extra_width;
GUI.window_size.bottom += extra_height; GUI.window_size.bottom += extra_height;
/*switch(Settings.SoundPlaybackRate){
case 1: Settings.SoundPlaybackRate = 8000; break;
case 2: Settings.SoundPlaybackRate = 11025; break;
case 3: Settings.SoundPlaybackRate = 16000; break;
case 4: Settings.SoundPlaybackRate = 22050; break;
case 5: Settings.SoundPlaybackRate = 30000; break;
case 6: Settings.SoundPlaybackRate = 32000; break;
case 7: Settings.SoundPlaybackRate = 35000; break;
case 8: Settings.SoundPlaybackRate = 44100; break;
case 9: Settings.SoundPlaybackRate = 48000; break;
}*/
Settings.ShutdownMaster = preSaveShutdownMaster; // revert temp change Settings.ShutdownMaster = preSaveShutdownMaster; // revert temp change
} }
void WinPostLoad(ConfigFile& conf) void WinPostLoad(ConfigFile& conf)

View File

@ -2058,15 +2058,17 @@ LRESULT CALLBACK WinProc(
case ID_WINDOW_SIZE_2X: case ID_WINDOW_SIZE_2X:
case ID_WINDOW_SIZE_3X: case ID_WINDOW_SIZE_3X:
case ID_WINDOW_SIZE_4X: case ID_WINDOW_SIZE_4X:
UINT factor,newWidth,newHeight; UINT factor, newWidth, newHeight;
RECT margins;
factor = (wParam & 0xffff) - ID_WINDOW_SIZE_1X + 1; factor = (wParam & 0xffff) - ID_WINDOW_SIZE_1X + 1;
newWidth = GUI.AspectWidth * factor; newWidth = GUI.AspectWidth * factor;
newHeight = (GUI.HeightExtend ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * factor; newHeight = (GUI.HeightExtend ? SNES_HEIGHT_EXTENDED : SNES_HEIGHT) * factor;
newWidth += 2*(GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXDLGFRAME));
newHeight += 2*(GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYDLGFRAME)) + margins = GetWindowMargins(GUI.hWnd,newWidth);
GetSystemMetrics(SM_CYCAPTION) + (GUI.HideMenu ? 0 : (GetSystemMetrics(SM_CYMENU) + newHeight += margins.top + margins.bottom;
(factor<2 ? GetSystemMetrics(SM_CYMENU) : 0))); newWidth += margins.left + margins.right;
SetWindowPos(GUI.hWnd,0,0,0,newWidth,newHeight,SWP_NOMOVE);
SetWindowPos(GUI.hWnd, NULL, 0, 0, newWidth, newHeight, SWP_NOMOVE);
break; break;
case ID_WINDOW_STRETCH: case ID_WINDOW_STRETCH:
GUI.Stretch = !GUI.Stretch; GUI.Stretch = !GUI.Stretch;
@ -4167,6 +4169,27 @@ void S9xSetRecentGames ()
} }
} }
RECT GetWindowMargins(HWND hwnd, UINT width)
{
RECT rcMargins = {0,0,0,0};
AdjustWindowRectEx(&rcMargins, GetWindowStyle(hwnd), !GUI.HideMenu, GetWindowExStyle(hwnd));
rcMargins.left = abs(rcMargins.left);
rcMargins.top = abs(rcMargins.top);
if (!GUI.HideMenu) {
RECT rcTemp = {0,0,width,0x7FFF}; // 0x7FFF="Infinite" height
SendMessage(hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rcTemp);
// Adjust our previous calculation to compensate for menu
// wrapping.
rcMargins.top = rcTemp.top;
}
return rcMargins;
}
void WinDeleteRecentGamesList () void WinDeleteRecentGamesList ()
{ {
for(int i=0;i<MAX_RECENT_GAMES_LIST_SIZE;i++) for(int i=0;i<MAX_RECENT_GAMES_LIST_SIZE;i++)

View File

@ -584,5 +584,6 @@ const char* GetFilterName(RenderFilter filterID);
int GetFilterScale(RenderFilter filterID); int GetFilterScale(RenderFilter filterID);
bool GetFilterHiResSupport(RenderFilter filterID); bool GetFilterHiResSupport(RenderFilter filterID);
const TCHAR * S9xGetDirectoryT (enum s9x_getdirtype); const TCHAR * S9xGetDirectoryT (enum s9x_getdirtype);
RECT GetWindowMargins(HWND hwnd, UINT width);
#endif // !defined(SNES9X_H_INCLUDED) #endif // !defined(SNES9X_H_INCLUDED)