📄 main.c
字号:
{
case 0:
pFolderString = RegistryInfo.ROMPath;
break;
case 1:
pFolderString = RegistryInfo.SRAMPath;
break;
case 2:
pFolderString = RegistryInfo.ScreenshotPath;
break;
case 3:
pFolderString = RegistryInfo.SaveStatePath;
break;
case 4:
pFolderString = RegistryInfo.SoundRecordPath;
break;
}
if (pFolderString[strlen(pFolderString) - 1] != '\\')
{
strcat(pFolderString, "\\");
}
SetDlgItemText(hwnd, IDC_FOLDERS_TEXT, pFolderString);
break;
case IDC_DIRECT_DRAW_MODE_COMBO:
NewMode = Index;
break;
}
}
break;
}
}
break;
case WM_HSCROLL:
{
if ((HWND)lParam == GetDlgItem(hwnd, IDC_GAMMA_SLIDER))
{
RegistryInfo.Gamma = (float)SendMessage(GetDlgItem(hwnd, IDC_GAMMA_SLIDER), TBM_GETPOS, 0, 0) / 20.0f;
wsprintf(GammaText, "%d.%02d", (int)(RegistryInfo.Gamma * 20.0f) / 20, ((int)(RegistryInfo.Gamma * 20.0f) % 20) * 5);
SetDlgItemText(hwnd, IDC_GAMMA_TEXT, GammaText);
bitmap.pal.update = 1;
UpdatePalette();
for(vdp.line = 0; vdp.line < LINES_PER_FRAME; vdp.line += 1)
{
render_line(vdp.line);
}
SendMessage(GetParent(hwnd), WM_PAINT, 0, 0);
}
else if ((HWND)lParam == GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER))
{
RegistryInfo.FMVolume = (float)SendMessage(GetDlgItem(hwnd, IDC_FM_VOLUME_SLIDER), TBM_GETPOS, 0, 0) / 100.0f;
sprintf(FMVolumeText, "%.2f", RegistryInfo.FMVolume);
SetDlgItemText(hwnd, IDC_FM_VOLUME_TEXT, FMVolumeText);
}
}
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
if ((NewMode != RegistryInfo.FullScreenMode) && FullScreenMode())
{
UseDirectDraw = ChangeMode(NewMode, TRUE);
AdjustWindowSize();
}
RegistryInfo.FullScreenMode = NewMode;
if (NewDirectDrawEnable != RegistryInfo.EnableDirectDraw)
{
if (NewDirectDrawEnable)
{
UseDirectDraw = ChangeMode(RegistryInfo.FullScreenMode, RegistryInfo.FullScreen);
}
else
{
if (FullScreenMode())
{
SetScreenScale(RegistryInfo.ScreenScale = 1);
}
SwitchInternalRenderingFormat(8);
UseDirectDraw = FALSE;
}
bitmap.pal.update = 1;
memset(bitmap.pal.dirty, 1, PALETTE_SIZE);
AdjustWindowSize();
EnableMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_SMOOTHING, UseDirectDraw? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_GRAYED);
EnableMenuItem(hMenu, ID_MENU_CONFIG_SCREEN_FULL, UseDirectDraw? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_GRAYED);
}
RegistryInfo.EnableDirectDraw = NewDirectDrawEnable;
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK AboutProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_INITDIALOG:
{
CenterWindowInParent(hwnd);
ShowWindow(hwnd, SW_SHOW);
}
break;
case WM_CLOSE:
EndDialog(hwnd, 0);
break;
default:
return FALSE;
}
return TRUE;
}
BOOL CreateSingleInstance(char *pCommandLine)
{
SECURITY_ATTRIBUTES Security;
USER_MESSAGE = RegisterWindowMessage(SMS_INSTANCE_LOAD_NAME);
Security.nLength = sizeof(SECURITY_ATTRIBUTES);
Security.lpSecurityDescriptor = NULL;
Security.bInheritHandle = FALSE;
Mutex = CreateMutex(&Security, TRUE, SMS_MUTEX_NAME);
if (Mutex)
{
int State = WaitForSingleObject(Mutex, 0);
if (State != WAIT_TIMEOUT) return TRUE;
}
SendMessage(FindWindow(SMS_CLASS_NAME, NULL), USER_MESSAGE, 0, (long)pCommandLine);
DestroySingleInstance();
return FALSE;
}
void DestroySingleInstance(void)
{
if (Mutex)
{
CloseHandle(Mutex);
Mutex = NULL;
}
}
void LoadState(void)
{
char Filename[MAX_PATH];
int Found;
int AppendPos;
wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());
Found = CountSaveStateFiles(Filename, &AppendPos);
switch (Found)
{
case 0:
return;
case 1:
wsprintf(&Filename[AppendPos], "(%04d).sta", 0);
break;
default:
{
int SaveState;
SaveState = DialogBox(GetSMSInstance(), MAKEINTRESOURCE(IDD_SAVESTATE), GetSMShwnd(), SaveStateProc);
if (SaveState == -1) return;
wsprintf(&Filename[AppendPos], "(%04d).sta", SaveState);
}
break;
}
load_state(Filename);
// Force audio to re-sync
Frame = 0;
LastTickCount = 0;
}
int CountSaveStateFiles(char *pFilename, int *pAppendPos)
{
int i;
int Found = 0;
HANDLE FileHandle;
*pAppendPos = strlen(pFilename);
for (i = 0 ; i < MAX_SAVE_STATES ; i++)
{
// Add a numbered index and the extension .sta
wsprintf(&pFilename[*pAppendPos], "(%04d).sta", i);
// Attempt to open a new file
FileHandle = CreateFile(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (FileHandle != INVALID_HANDLE_VALUE)
{
Found++;
// Close the file
CloseHandle(FileHandle);
}
}
if (RegistryInfo.SingleSaveState && Found)
{
Found = 1;
}
return Found;
}
void SaveState(void)
{
char Filename[MAX_PATH];
int AppendPos;
int i;
HANDLE FileHandle;
wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());
AppendPos = strlen(Filename);
for (i = 0 ; i < MAX_SAVE_STATES ; i++)
{
// Add a numbered index and the extension .sta
wsprintf(&Filename[AppendPos], "(%04d).sta", i);
if (RegistryInfo.SingleSaveState)
{
FileHandle = CreateFile(Filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
}
else
{
// Attempt to create a new file
FileHandle = CreateFile(Filename, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
}
// If we're successful, stop looking for a new name
if (FileHandle != INVALID_HANDLE_VALUE) break;
}
save_state(Filename, FileHandle);
}
HWND GetSMShwnd(void)
{
return hwnd;
}
HINSTANCE GetSMSInstance(void)
{
return hInstance;
}
LRESULT CALLBACK SaveStateProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static int SelectedSaveState;
switch (msg)
{
case WM_INITDIALOG:
{
char Filename[MAX_PATH];
HANDLE FileHandle;
int i;
int InsertPos;
int AppendPos;
CenterWindowInParent(hwnd);
SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_RESETCONTENT, 0, 0);
wsprintf(Filename, "%s%s", RegistryInfo.SaveStatePath, GetGameName());
AppendPos = strlen(Filename);
for (i = 0 ; i < MAX_SAVE_STATES ; i++)
{
// Add a numbered index and the extension .sta
wsprintf(&Filename[AppendPos], "(%04d).sta", i);
// Attempt to open a new file
FileHandle = CreateFile(Filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
// If we're successful, stop looking for a new name
if (FileHandle != INVALID_HANDLE_VALUE)
{
InsertPos = SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_ADDSTRING, 0, (long)&Filename[strlen(RegistryInfo.SaveStatePath)]);
SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_SETITEMDATA, InsertPos, i);
// Close the file
CloseHandle(FileHandle);
}
}
SelectedSaveState = InsertPos;
SendMessage(GetDlgItem(hwnd, IDC_SAVESTATE_COMBO), CB_SETCURSEL, SelectedSaveState, 0);
ShowWindow(hwnd, SW_SHOW);
}
break;
case WM_COMMAND:
{
switch (HIWORD(wParam))
{
case BN_CLICKED:
switch (LOWORD(wParam))
{
case IDC_OK:
EndDialog(hwnd, SelectedSaveState);
break;
case IDC_CANCEL:
EndDialog(hwnd, -1);
break;
}
break;
case CBN_SELCHANGE:
{
SelectedSaveState = SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), CB_GETCURSEL, 0, 0);
}
break;
}
}
break;
case WM_CLOSE:
EndDialog(hwnd, -1);
break;
default:
return FALSE;
}
return TRUE;
}
void CenterWindowInParent(HWND hwnd)
{
RECT ParentRect;
RECT OurRect;
HWND hParent = GetParent(hwnd);
POINT Pos;
if (!hParent) hParent = GetDesktopWindow();
GetWindowRect(hParent, &ParentRect);
GetWindowRect(hwnd, &OurRect);
Pos.x = (((ParentRect.right - ParentRect.left) - (OurRect.right - OurRect.left)) / 2) + ParentRect.left;
Pos.y = (((ParentRect.bottom - ParentRect.top) - (OurRect.bottom - OurRect.top)) / 2) + ParentRect.top;
if (Pos.x < 0) Pos.x = 0;
if (Pos.y < 0) Pos.y = 0;
SetWindowPos(hwnd, HWND_TOP, Pos.x, Pos.y, 0, 0, SWP_NOSIZE);
}
void GetConsoleScreenRect(RECT *pRect)
{
if (cart.type == TYPE_GG)
{
pRect->left = 48;
pRect->top = 24;
pRect->right = 208;
pRect->bottom = 168;
}
else
{
pRect->left = 0;
pRect->top = 0;
pRect->right = 256;
pRect->bottom = 192;
}
}
BOOL GetRecordSoundStatus(void)
{
return RecordingSound;
}
RGBQUAD *GetSMSPalette(void)
{
return Bmp.Palette;
}
void SwitchInternalRenderingFormat(int BitDepth)
{
HDC hDC;
bitmap.depth = BitDepth;
bitmap.pitch = (bitmap.width * (bitmap.depth >> 3));
Bmp.BitmapInfoHeader.biBitCount = BitDepth;
hDC = GetDC(hwnd);
DeleteObject(hBitmap);
hBitmap = CreateDIBitmap(hDC, &Bmp.BitmapInfoHeader, 0, &BitmapData[0], (BITMAPINFO *)&Bmp, DIB_PAL_COLORS);
ReleaseDC(hwnd, hDC);
}
BOOL DirectDrawAvailable(void)
{
return UseDirectDraw;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -