⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainwnd.cpp

📁 日本的手持pda源码.wince下使用,完全开源
💻 CPP
字号:
#include "PocketGnuboy.h"
#include "MainWnd.h"
#include "Registory.h"
#include "wce.h"

BOOL	g_fVPadPress = FALSE;

int MainWnd_MessageLoop()
{
	MSG msg;
	for (;;) {
		if (get_romfile() && emu_get_run()) {
			emu_do_frame();
			while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
				if (msg.message == WM_QUIT)
					return msg.wParam;
				if (!TranslateAccelerator(msg.hwnd, g_hAccelTable, &msg)) {
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
			}
		}
		else {
			if (GetMessage(&msg, NULL, 0, 0)) {
				if (!TranslateAccelerator(msg.hwnd, g_hAccelTable, &msg)) {
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
			}
			else 
				return msg.wParam;
		}
	}
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) {
		case WM_CREATE:
			return HANDLE_WM_CREATE(hWnd, wParam, lParam, MainWnd_OnCreate);
		case WM_ACTIVATE:
			HANDLE_WM_ACTIVATE(hWnd, wParam, lParam, MainWnd_OnActivate);
			break;
		case WM_COMMAND:
			HANDLE_WM_COMMAND(hWnd, wParam, lParam, MainWnd_OnCommand);
			break;
		case WM_PAINT:
			HANDLE_WM_PAINT(hWnd, wParam, lParam, MainWnd_OnPaint);
			break;
		case WM_CLOSE:
			HANDLE_WM_CLOSE(hWnd, wParam, lParam, MainWnd_OnClose);
			break;
		case WM_DESTROY:
			HANDLE_WM_DESTROY(hWnd, wParam, lParam, MainWnd_OnDestroy);
			break;
		case WM_LBUTTONDOWN:
			HANDLE_WM_LBUTTONDOWN(hWnd, wParam, lParam, MainWnd_OnLButtonDown);
			break;
		case WM_LBUTTONUP:
			HANDLE_WM_LBUTTONUP(hWnd, wParam, lParam, MainWnd_OnLButtonUp);
			break;
		case WM_MOUSEMOVE:
			HANDLE_WM_MOUSEMOVE(hWnd, wParam, lParam, MainWnd_OnMouseMove);
			break;
		case WM_INITMENUPOPUP:
			HANDLE_WM_INITMENUPOPUP(hWnd, wParam, lParam, MainWnd_OnInitMenuPopup);
			break;
		case WM_ENTERMENULOOP:
			MainWnd_OnEnterMenuLoop(hWnd);
			break;
		case WM_SETTINGCHANGE:
			SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
     		break;
		case WM_UPDATEFPS:
			MainWnd_OnUpdateFPS(hWnd, wParam, lParam);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

BOOL MainWnd_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
	emu_close();
	LoadRegistory();

	g_hwndCB = CreateRpCommandBar(hwnd);
	if (!g_hwndCB)
		return FALSE;

	HDC hDC = GetDC(hwnd);
	g_hdcVPad = CreateCompatibleDC(hDC);
	ReleaseDC(hwnd, hDC);

	if (!g_hdcVPad)
		return FALSE;

	g_hbmpVPad = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_VPAD));
	SelectObject(g_hdcVPad, g_hbmpVPad);

	if (!g_hbmpVPad)
		return FALSE;

	UpdateToolbar();

	return TRUE;
}

void MainWnd_OnPaint(HWND hwnd)
{
	PAINTSTRUCT ps;
	HDC hDC = BeginPaint(hwnd, &ps);

	if (get_romfile()) {
		RECT rc;
		GetClientRect(hwnd, &rc);
		if (emu_get_run()) {
			if (g_fVPad) {
				BitBlt(hDC, VPAD_LEFT, VPAD_TOP, VPAD_WIDTH, VPAD_HEIGHT, g_hdcVPad, 0, 0, SRCCOPY);

				if (g_fShowFPS && _tcslen(g_szFPS)) {
					rc.left = rc.right - g_sizeFPS.cx;
					rc.top = rc.bottom - VPAD_HEIGHT;
					rc.bottom = rc.top + g_sizeFPS.cy;

					int oldmode = SetBkMode(hDC, TRANSPARENT);
					COLORREF oldbk = SetTextColor(hDC, RGB(0xff, 0xff, 0xff));
					DrawText(hDC, g_szFPS, -1, &rc, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE);
					SetTextColor(hDC, oldbk);
					SetBkMode(hDC, oldmode);
				}
			}
			else if (g_fShowFPS && _tcslen(g_szFPS)) {
				rc.bottom -= MENU_HEIGHT;
				rc.left = rc.right - g_sizeFPS.cx;
				rc.top = rc.bottom - g_sizeFPS.cy;

				int oldmode = SetBkMode(hDC, TRANSPARENT);
				COLORREF oldbk = SetTextColor(hDC, RGB(0xff, 0xff, 0xff));
				DrawText(hDC, g_szFPS, -1, &rc, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE);
				SetTextColor(hDC, oldbk);
				SetBkMode(hDC, oldmode);
			}
		}
		else {
			rc.bottom -= MENU_HEIGHT;

			if (g_fDrawScreen && vid_get_screen_dc()) {
				int top = g_fVPad ? 0 : 52 - MENU_HEIGHT;
				BitBlt(hDC, 0, top, SCREENBMP_WIDTH, SCREENBMP_HEIGHT, vid_get_screen_dc(), 0, 0, SRCCOPY);
			}

			TCHAR szMessage[MAX_LOADSTRING];
			LoadString(g_hInst, IDS_MSG_PAUSE, szMessage, MAX_LOADSTRING);
			int oldmode = SetBkMode(hDC, TRANSPARENT);
			COLORREF oldbk = SetTextColor(hDC, RGB(0xff, 0xff, 0xff));

			DrawText(hDC, szMessage, -1, &rc, DT_BOTTOM | DT_RIGHT | DT_NOPREFIX | DT_SINGLELINE);

			SetTextColor(hDC, oldbk);
			SetBkMode(hDC, oldmode);
		}
	}

	EndPaint(hwnd, &ps);
}

void MainWnd_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
	switch (id) {
	case IDM_HELP_ABOUT:
		DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hwnd, (DLGPROC)AboutDlgProc);
		break;
	case IDOK:
		SendMessage(hwnd, WM_ACTIVATE, MAKEWPARAM(WA_INACTIVE, 0), (LPARAM)hwnd);
		SendMessage(hwnd, WM_CLOSE, 0, 0);
		break;
	case IDM_FILE_OPEN:
		OnFileOpen(hwnd);
		break;
	case IDM_FILE_CLOSE:
		OnFileClose(hwnd);
		break;
	case IDM_FILE_RESUME:
		OnFileResume(hwnd);
		break;
	case IDM_FILE_RESET:
		OnFileReset(hwnd);
		break;
	case IDM_FILE_STATE0:
	case IDM_FILE_STATE1:
	case IDM_FILE_STATE2:
	case IDM_FILE_STATE3:
	case IDM_FILE_STATE4:
	case IDM_FILE_STATE5:
	case IDM_FILE_STATE6:
	case IDM_FILE_STATE7:
	case IDM_FILE_STATE8:
	case IDM_FILE_STATE9:
		OnFileState(hwnd, id - IDM_FILE_STATE0);
		break;
	case IDM_FILE_STATE_LOAD:
		OnFileStateLoad(hwnd);
		break;
	case IDM_FILE_STATE_SAVE:
		OnFileStateSave(hwnd);
		break;
	case IDM_FILE_EXIT:
		OnFileExit(hwnd);
		break;
	case IDM_CTRL_SCREEN_160_144:
	case IDM_CTRL_SCREEN_240_216:
	case IDM_CTRL_SCREEN_240_216H:
	case IDM_CTRL_SCREEN_240_216A:
		OnCtrlScreen(hwnd, id - IDM_CTRL_SCREEN_160_144);
		break;
	case IDM_CTRL_FRAMESKIP_AUTO:
	case IDM_CTRL_FRAMESKIP0:
	case IDM_CTRL_FRAMESKIP1:
	case IDM_CTRL_FRAMESKIP2:
	case IDM_CTRL_FRAMESKIP3:
	case IDM_CTRL_FRAMESKIP4:
	case IDM_CTRL_FRAMESKIP5:
		OnCtrlFrameSkip(hwnd, id - IDM_CTRL_FRAMESKIP0);
		break;
	case IDM_CTRL_AUDIO_ENABLE:
		OnCtrlAudioEnable(hwnd);
		break;
	case IDM_CTRL_AUDIO_11K:
	case IDM_CTRL_AUDIO_22K:
	case IDM_CTRL_AUDIO_44K:
		OnCtrlAudioSampleRate(hwnd, id - IDM_CTRL_AUDIO_11K);
		break;
	case IDM_CTRL_AUDIO_MONO:
	case IDM_CTRL_AUDIO_STEREO:
		OnCtrlAudioStereo(hwnd, id == IDM_CTRL_AUDIO_STEREO);
		break;
	case IDM_CTRL_AUDIO_8BITS:
	case IDM_CTRL_AUDIO_16BITS:
		OnCtrlAudioBits(hwnd, id == IDM_CTRL_AUDIO_16BITS);
		break;
	case IDM_CTRL_CONTROLLERS:
		OnCtrlControllers(hwnd);
		break;
	case IDM_CTRL_PREFERENCES:
		OnCtrlPreferences(hwnd);
		break;
	case IDM_CTRL_TURBOA: 
		OnCtrlTurboA(hwnd);
		break;
	case IDM_CTRL_TURBOB: 
		OnCtrlTurboB(hwnd);
		break;
	case IDM_CTRL_VPAD:
		OnCtrlVPad(hwnd);
		break;
	case IDM_CTRL_AUDIO_BUF4:
	case IDM_CTRL_AUDIO_BUF8:
	case IDM_CTRL_AUDIO_BUF12:
	case IDM_CTRL_AUDIO_BUF16:
	case IDM_CTRL_AUDIO_BUF24:
	case IDM_CTRL_AUDIO_BUF32:
		OnCtrlAudioBuffers(hwnd, id - IDM_CTRL_AUDIO_BUF4);
		break;
	}
}

void MainWnd_OnClose(HWND hwnd)
{
	emu_close();
	SaveRegistory();

	DeleteDC(g_hdcVPad);
	DeleteObject(g_hbmpVPad);
	DestroyWindow(hwnd);
}

void MainWnd_OnDestroy(HWND hwnd)
{
	CommandBar_Destroy(g_hwndCB);
	PostQuitMessage(0);
}

void MainWnd_OnLButtonDown(HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags)
{
	if (get_romfile()) {
		if (!MainWnd_UpdateVPadState(x, y)) {
			if (emu_get_run())
				Pause(hwnd);
			else
				Resume(hwnd);
		}
	}
}

void MainWnd_OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
{
	if (get_romfile()) {
		if (g_fVPad)
			joy_set_vpadstate(VPAD_STATE_NONE);
	}
	g_fVPadPress = FALSE;
}

void MainWnd_OnMouseMove(HWND hwnd, int x, int y, UINT keyFlags)
{
	if (get_romfile()) {
		if (g_fVPadPress)
			MainWnd_UpdateVPadState(x, y);
	}
}

void MainWnd_OnInitMenuPopup(HWND hwnd, HMENU hMenu, UINT item, BOOL fSystemMenu)
{
	int nCheck;
	UINT uEnable;

	if (get_romfile() && emu_get_run())
		Pause(hwnd);

	uEnable = get_romfile() ? MF_BYCOMMAND | MF_ENABLED : MF_BYCOMMAND | MF_GRAYED;
	EnableMenuItem(hMenu, IDM_FILE_CLOSE, uEnable);
	EnableMenuItem(hMenu, IDM_FILE_RESUME, uEnable);
	EnableMenuItem(hMenu, IDM_FILE_RESET, uEnable);
	EnableMenuItem(hMenu, IDM_FILE_STATE_LOAD, uEnable);
	EnableMenuItem(hMenu, IDM_FILE_STATE_SAVE, uEnable);

	CheckMenuRadioItem(hMenu, IDM_FILE_STATE0, IDM_FILE_STATE9,
					   IDM_FILE_STATE0 + get_saveslot(), MF_BYCOMMAND);

	CheckMenuRadioItem(hMenu, IDM_CTRL_SCREEN_160_144, IDM_CTRL_SCREEN_240_216A,
					   IDM_CTRL_SCREEN_160_144 + vid_get_screenmode(), MF_BYCOMMAND);

	CheckMenuRadioItem(hMenu, IDM_CTRL_FRAMESKIP_AUTO, IDM_CTRL_FRAMESKIP5,
					   IDM_CTRL_FRAMESKIP0 + vid_get_frameskip(), MF_BYCOMMAND);

	CheckMenuItem(hMenu, IDM_CTRL_AUDIO_ENABLE, pcm_get_enable() ? 
						MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);

	switch (pcm_get_samplerate()) {
	case 22050:
		nCheck = IDM_CTRL_AUDIO_22K; break;
	case 44100:
		nCheck = IDM_CTRL_AUDIO_44K; break;
	default:
		nCheck = IDM_CTRL_AUDIO_11K; break;
	}
	CheckMenuRadioItem(hMenu, IDM_CTRL_AUDIO_11K, IDM_CTRL_AUDIO_44K, nCheck, MF_BYCOMMAND);
	CheckMenuRadioItem(hMenu, IDM_CTRL_AUDIO_MONO, IDM_CTRL_AUDIO_STEREO,
				pcm_get_stereo() ? IDM_CTRL_AUDIO_STEREO : IDM_CTRL_AUDIO_MONO, MF_BYCOMMAND);
	CheckMenuRadioItem(hMenu, IDM_CTRL_AUDIO_8BITS, IDM_CTRL_AUDIO_16BITS,
				pcm_get_16bits() ? IDM_CTRL_AUDIO_16BITS : IDM_CTRL_AUDIO_8BITS, MF_BYCOMMAND);
	
	CheckMenuItem(hMenu, IDM_CTRL_TURBOA, joy_get_turbo_a() ? 
						MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hMenu, IDM_CTRL_TURBOB, joy_get_turbo_b() ? 
						MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);
	CheckMenuItem(hMenu, IDM_CTRL_VPAD, g_fVPad ? 
						MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);

	switch (pcm_get_buffer_count()) {
	case 4:
		nCheck = IDM_CTRL_AUDIO_BUF4; break;
	case 8:
		nCheck = IDM_CTRL_AUDIO_BUF8; break;
	case 16:
		nCheck = IDM_CTRL_AUDIO_BUF16; break;
	case 24:
		nCheck = IDM_CTRL_AUDIO_BUF24; break;
	case 32:
		nCheck = IDM_CTRL_AUDIO_BUF32; break;
	default:
	nCheck = IDM_CTRL_AUDIO_BUF12; break;
	}
	CheckMenuRadioItem(hMenu, IDM_CTRL_AUDIO_BUF4, IDM_CTRL_AUDIO_BUF32, nCheck, MF_BYCOMMAND);
}

void MainWnd_OnActivate(HWND hwnd, UINT state, HWND hwndActDeact, BOOL fMinimized)
{
	if (state == WA_INACTIVE) {
		if (get_romfile() && emu_get_run())
			Pause(hwnd);
	}
}

void MainWnd_OnEnterMenuLoop(HWND hwnd)
{
	if (get_romfile() && emu_get_run())
		Pause(hwnd);
}

BOOL MainWnd_UpdateVPadState(int x, int y)
{
#define VPAD_CURSOR_LEFT	17
#define VPAD_CURSOR_TOP		5
#define VPAD_CURSOR_WIDTH	24
#define VPAD_CURSOR_HEIGHT	24
#define VPAD_A_LEFT			189
#define VPAD_A_TOP			17
#define VPAD_A_WIDTH		36
#define VPAD_A_HEIGHT		36
#define VPAD_B_LEFT			137
#define VPAD_B_TOP			34
#define VPAD_B_WIDTH		36
#define VPAD_B_HEIGHT		36
#define VPAD_AB_LEFT		171
#define VPAD_AB_TOP			26
#define VPAD_AB_WIDTH		18
#define VPAD_AB_HEIGHT		36
	if (!g_fVPad || !emu_get_run())
		return FALSE;

	if (x < VPAD_LEFT || x > VPAD_LEFT + VPAD_WIDTH ||
		y < VPAD_TOP || y > VPAD_TOP + VPAD_HEIGHT)
		return FALSE;

	x -= VPAD_LEFT;
	y -= VPAD_TOP;

	if ((x >= VPAD_CURSOR_LEFT && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH) &&
		(y >= VPAD_CURSOR_TOP && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_UPLEFT);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2) &&
		(y >= VPAD_CURSOR_TOP && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_UP);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2 && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 3) &&
		(y >= VPAD_CURSOR_TOP && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_UPRIGHT);
	}
	else if ((x >= VPAD_CURSOR_LEFT && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2)) {
		joy_set_vpadstate(VPAD_STATE_LEFT);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2)) {
		joy_set_vpadstate(VPAD_STATE_CENTER);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2 && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 3) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2)) {
		joy_set_vpadstate(VPAD_STATE_RIGHT);
	}
	else if ((x >= VPAD_CURSOR_LEFT && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2 && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 3)) {
		joy_set_vpadstate(VPAD_STATE_DOWNLEFT);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2 && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 3)) {
		joy_set_vpadstate(VPAD_STATE_DOWN);
	}
	else if ((x >= VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 2 && x < VPAD_CURSOR_LEFT + VPAD_CURSOR_WIDTH * 3) &&
		(y >= VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 2 && y < VPAD_CURSOR_TOP + VPAD_CURSOR_HEIGHT * 3)) {
		joy_set_vpadstate(VPAD_STATE_DOWNRIGHT);
	}
	else if ((x >= VPAD_A_LEFT && x < VPAD_A_LEFT + VPAD_A_WIDTH) &&
		(y >= VPAD_A_TOP && y < VPAD_A_TOP + VPAD_A_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_A);
	}
	else if ((x >= VPAD_B_LEFT && x < VPAD_B_LEFT + VPAD_B_WIDTH) &&
		(y >= VPAD_B_TOP && y < VPAD_B_TOP + VPAD_B_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_B);
	}
	else if ((x >= VPAD_AB_LEFT && x < VPAD_AB_LEFT + VPAD_AB_WIDTH) &&
		(y >= VPAD_AB_TOP && y < VPAD_AB_TOP + VPAD_AB_HEIGHT)) {
		joy_set_vpadstate(VPAD_STATE_AB);
	}
	else 
		joy_set_vpadstate(VPAD_STATE_NONE);

	g_fVPadPress = TRUE;
	return TRUE;
}

void MainWnd_OnUpdateFPS(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
	SIZE old = g_sizeFPS;

	HDC hDC = GetDC(hwnd);
	wsprintf(g_szFPS, _T("%d.%02d FPS"), (int)wParam / 100, (int)wParam % 100);
	GetTextExtentPoint32(hDC, g_szFPS, _tcslen(g_szFPS), &g_sizeFPS);
	ReleaseDC(hwnd, hDC);

	RECT rc;
	GetClientRect(hwnd, &rc);
	if (g_fVPad) {
		rc.left = rc.right - max(g_sizeFPS.cx, old.cx);
		rc.top = rc.bottom - VPAD_HEIGHT;
		rc.bottom = rc.top + max(g_sizeFPS.cy, old.cy);	
		InvalidateRect(hwnd, &rc, FALSE);
	}
	else {
		rc.bottom -= MENU_HEIGHT;
		rc.left = rc.right - max(g_sizeFPS.cx, old.cx);
		rc.top = rc.bottom - max(g_sizeFPS.cy, old.cy);
		InvalidateRect(hwnd, &rc, TRUE);
	}
	UpdateWindow(hwnd);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -