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

📄 controllerdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 僐儞僩儘乕儔僟僀傾儘僌僋儔僗
//
//
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mmsystem.h>

#include <string>
using namespace std;

#include "VirtuaNESres.h"
#include "DebugOut.h"
#include "App.h"
#include "Pathlib.h"

#include "Wnd.h"
#include "ControllerDlg.h"

#include "DirectInput.h"

///////////////////////////////////////////////////////////////////////////////

DLG_MESSAGE_BEGIN(CControllerPageDlg)
// 儊僢僙乕僕
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )
// NOTIFY儊僢僙乕僕
DLG_NOTIFY_BEGIN()
DLG_NOTIFY_END()
// 僐儅儞僪
DLG_COMMAND_BEGIN()
DLG_ON_COMMAND_NOTIFY_RANGE( IDC_CTR_UP, IDC_CTR_END, STN_CLICKED, OnClicked )
DLG_COMMAND_END()
DLG_MESSAGE_END()

INT	CControllerPageDlg::Create( UINT nID, HWND hWndParent )
{
	m_nPageID = nID;

	m_hWnd = ::CreateDialogParam( CApp::GetPlugin(), MAKEINTRESOURCE(nID),
				hWndParent,  g_DlgProc, (LPARAM)this );
	return	(m_hWnd)?TRUE:FALSE;
}

void	CControllerPageDlg::Destroy()
{
	::DestroyWindow( m_hWnd );
}

DLGCMD	CControllerPageDlg::OnClicked( DLGCMDPARAM )
{
//	DEBUGOUT( "CControllerPageDlg::OnClicked uID=%d\n", uID );

	// 恊偺僞僽僐儞僩儘乕儖傪僷僗偟偰儊僢僙乕僕傪捠抦:p
	HWND	hWndParent, hWndOwner;
	hWndParent = ::GetParent( m_hWnd );
	hWndOwner = ::GetParent( hWndParent );
	::SendMessage( hWndOwner, WM_COMMAND, MAKELPARAM(uID,STN_CLICKED), (LPARAM)::GetDlgItem(m_hWnd,uID) );
}

DLGMSG	CControllerPageDlg::OnInitDialog( DLGMSGPARAM )
{
//	DEBUGOUT( "CControllerPageDlg::OnInitDialog\n" );

	return	TRUE;
}

///////////////////////////////////////////////////////////////////////////////

UINT	CControllerDlg::ControllerPageID[] = {
	IDD_CTR_PLAYER1,
	IDD_CTR_PLAYER2,
	IDD_CTR_PLAYER3,
	IDD_CTR_PLAYER4,
	IDD_CTR_CRAZYCLIMBER,
	IDD_CTR_FAMLYTRAINER,
	IDD_CTR_EXCITINGBOXING,
	IDD_CTR_MAHJANG,
	IDD_CTR_NSFPLAYER,
	IDD_CTR_VSUNISYSTEM,
	0
};

DLG_MESSAGE_BEGIN(CControllerDlg)
// 儊僢僙乕僕
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )
DLG_ON_MESSAGE( WM_DESTROY,	OnDestroy )
DLG_ON_MESSAGE( WM_TIMER,	OnTimer )
// NOTIFY儊僢僙乕僕
DLG_NOTIFY_BEGIN()
DLG_ON_NOTIFY( IDC_CTR_TAB, TCN_SELCHANGE, OnSelectChange )
DLG_NOTIFY_END()
// 僐儅儞僪
DLG_COMMAND_BEGIN()
DLG_ON_COMMAND( IDOK, OnOK )
DLG_ON_COMMAND( IDCANCEL, OnCancel )
DLG_ON_COMMAND( IDDEFAULT, OnDefault )
DLG_ON_COMMAND_NOTIFY_RANGE( IDC_CTR_UP, IDC_CTR_END, STN_CLICKED, OnClicked )
DLG_ON_COMMAND_NOTIFY( IDC_CTR_SELECT_COMBO, CBN_SELCHANGE, OnSettingSelectChange )
DLG_COMMAND_END()
DLG_MESSAGE_END()

INT	CControllerDlg::DoModal( HWND hWndParent )
{
	m_bCancelMode = FALSE;
	m_TimerID = 0;

	m_SettingSel = 0;

	return	::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_CFG_CONTROLLER),
				hWndParent, g_DlgProc, (LPARAM)this );
}

BOOL	CControllerDlg::PreTranslateMessage( MSG* pMsg )
{
	if( pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST ) {
//		DEBUGOUT( "CControllerDlg::PreTranslateMessage WM_KEY????\n" );
		return	m_bCancelMode;
	}
	return	FALSE;
}

void	CControllerDlg::OnInitialMember()
{
	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CTR_TAB );
	RECT	rcT, rcP, rcW;
	INT	page;

//	for( INT page = 0; ControllerPageID[page]; page++ ) {
	for( page = 0; ControllerPageID[page]; page++ ) {
		m_Page[page].Create( ControllerPageID[page], hWndCtrl );

		// 柤慜偺庢摼
		CHAR	szTitle[256];
		::GetWindowText( m_Page[page].m_hWnd, szTitle, sizeof(szTitle) );

		// 柤慜傪庢摼偟偨傜僉儍僾僔儑儞傪徚偡
		LONG	style;
		style = ::GetWindowLong( m_Page[page].m_hWnd, GWL_STYLE );
		style &= ~(WS_CAPTION|WS_BORDER|WS_OVERLAPPED);
		::SetWindowLong( m_Page[page].m_hWnd, GWL_STYLE, style );

		// 僒僀僘曄峏
		::GetWindowRect( m_Page[page].m_hWnd, &rcW );
		rcW.right  -= ::GetSystemMetrics( SM_CXSIZEFRAME );
		rcW.bottom -= ::GetSystemMetrics( SM_CYCAPTION )+::GetSystemMetrics( SM_CYSIZEFRAME )*2;
		::SetWindowPos( m_Page[page].m_hWnd, NULL, 0, 0, RCWIDTH(rcW), RCHEIGHT(rcW), SWP_NOMOVE|SWP_NOZORDER );

		// 僞僽偵柤慜傪愝掕偡傞
		TCITEM	tcitem;
		tcitem.mask = TCIF_TEXT;
		tcitem.pszText = szTitle;
		TabCtrl_InsertItem( hWndCtrl, page, &tcitem );

//		// 儁乕僕埵抲偺曗惓
//		::GetClientRect( hWndCtrl, &rcT );
//		TabCtrl_AdjustRect( hWndCtrl, FALSE, &rcT );
//		::GetWindowRect( m_Page[page].m_hWnd, &rcP );

		// 寁嶼
//		rcW.left   = rcT.left + (RCWIDTH(rcT)-RCWIDTH(rcP))/2;
//		rcW.top    = rcT.top  + (RCHEIGHT(rcT)-RCHEIGHT(rcP))/2;
//		rcW.right  = rcW.left + RCWIDTH(rcP);
//		rcW.bottom = rcW.top  + RCHEIGHT(rcP);
//		::SetWindowPos( m_Page[page].m_hWnd, NULL, rcW.left, rcW.top, RCWIDTH(rcW), RCHEIGHT(rcW), SWP_NOZORDER|SWP_NOACTIVATE );

		// 奺儁乕僕偺儕僗僩儃僢僋僗偺愝掕
		if( page < 4 ) {
			HWND	hWndList;
			hWndList = ::GetDlgItem( m_Page[page].m_hWnd, IDC_CTR_A_RAPID_LIST );
			::SendMessage( hWndList, LB_INSERTSTRING, 0, (LPARAM)" 10FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 1, (LPARAM)" 15FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 2, (LPARAM)" 20FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 3, (LPARAM)" 30FPS" );
			hWndList = ::GetDlgItem( m_Page[page].m_hWnd, IDC_CTR_B_RAPID_LIST );
			::SendMessage( hWndList, LB_INSERTSTRING, 0, (LPARAM)" 10FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 1, (LPARAM)" 15FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 2, (LPARAM)" 20FPS" );
			::SendMessage( hWndList, LB_INSERTSTRING, 3, (LPARAM)" 30FPS" );
		}

		// 儃僞儞柤摍偺愝掕
		OnPageSetup( page );

		::ShowWindow( m_Page[page].m_hWnd, (page==0)?SW_SHOW:SW_HIDE );
	}

	// 儁乕僕埵抲嵞挷惍
	for( page = 0; ControllerPageID[page]; page++ ) {
		// 儁乕僕埵抲偺曗惓
		::GetClientRect( hWndCtrl, &rcT );
		TabCtrl_AdjustRect( hWndCtrl, FALSE, &rcT );
		::GetWindowRect( m_Page[page].m_hWnd, &rcP );

		// 寁嶼
		rcW.left   = rcT.left + (RCWIDTH(rcT)-RCWIDTH(rcP))/2;
		rcW.top    = rcT.top  + (RCHEIGHT(rcT)-RCHEIGHT(rcP))/2;
		rcW.right  = rcW.left + RCWIDTH(rcP);
		rcW.bottom = rcW.top  + RCHEIGHT(rcP);
		::SetWindowPos( m_Page[page].m_hWnd, NULL, rcW.left, rcW.top, RCWIDTH(rcW), RCHEIGHT(rcW), SWP_NOZORDER|SWP_NOACTIVATE );
	}

	TabCtrl_SetCurSel( hWndCtrl, 0 );
	m_PageSel = 0;

	m_PageNum = page;

	// 愝掕僐儞儃儃僢僋僗
	::SendDlgItemMessage( m_hWnd, IDC_CTR_SELECT_COMBO, CB_RESETCONTENT, 0, 0 );
	CHAR	szStr[64];
	for( INT i = IDS_CTR_SELECT1; i <= IDS_CTR_SELECT2; i++ ) {
		CApp::LoadString( i, szStr, sizeof(szStr) );
		::SendDlgItemMessage( m_hWnd, IDC_CTR_SELECT_COMBO, CB_INSERTSTRING, (WPARAM)i-IDS_CTR_SELECT1, (LPARAM)szStr );
	}
	::SendDlgItemMessage( m_hWnd, IDC_CTR_SELECT_COMBO, CB_SETCURSEL, 0, 0 );
}

void	CControllerDlg::OnPageSetup( UINT nPage )
{
	HWND	hWnd = m_Page[nPage].m_hWnd;
	HWND	hWndCtrl;
	INT	nKey;
	LPCSTR	lpStr;
	INT	nOffset = m_SettingSel?32:0;

	for( INT nID = IDC_CTR_UP; nID <= IDC_CTR_END; nID++ ) {
		if( (hWndCtrl = ::GetDlgItem( hWnd, nID )) ) {
			if( nPage < 4 ) {
				nKey = Config.controller.nButton[nPage][nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_CRAZYCLIMBER ) {
				nKey = Config.controller.nExButton[0][nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_FAMLYTRAINER ) {
				nKey = Config.controller.nExButton[1][nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_EXCITINGBOXING ) {
				nKey = Config.controller.nExButton[2][nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_MAHJANG ) {
				nKey = Config.controller.nExButton[3][nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_NSFPLAYER ) {
				nKey = Config.controller.nNsfButton[nID-IDC_CTR_UP+nOffset];
			} else if( ControllerPageID[nPage] == IDD_CTR_VSUNISYSTEM ) {
				nKey = Config.controller.nVSUnisystem[nID-IDC_CTR_UP+nOffset];
			}
			if( (lpStr = DirectInput.SearchKeyName(nKey)) ) {
				::SetWindowText( hWndCtrl, lpStr );
			} else {
				::SetWindowText( hWndCtrl, "----" );
			}
			::InvalidateRect( hWndCtrl, NULL, TRUE );
		}
	}

	if( nPage < 4 ) {
		::SendDlgItemMessage( hWnd, IDC_CTR_A_RAPID_LIST, LB_SETCURSEL,
					(WPARAM)Config.controller.nRapid[nPage][0], 0 );
		::SendDlgItemMessage( hWnd, IDC_CTR_B_RAPID_LIST, LB_SETCURSEL,
					(WPARAM)Config.controller.nRapid[nPage][1], 0 );
	}
}

⌨️ 快捷键说明

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