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

📄 dipswitchdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
字号:
//
// 僠儍僢僩僟僀傾儘僌僋儔僗
//
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <stdlib.h>
#include <mbstring.h>
#include <shlwapi.h>

#include <string>
using namespace std;

#include "typedef.h"
#include "macro.h"

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

#include "EmuThread.h"
#include "VsUnisystem.h"

#include "Wnd.h"
#include "DipSwitchDlg.h"

// 儊僢僙乕僕
DLG_MESSAGE_BEGIN(CDipSwitchDlg)
DLG_ON_MESSAGE( WM_INITDIALOG,	OnInitDialog )

// 僐儅儞僪
DLG_COMMAND_BEGIN()
DLG_ON_COMMAND( IDOK, OnOK )
DLG_ON_COMMAND( IDCANCEL, OnCancel )
DLG_COMMAND_END()
// Notify 儊僢僙乕僕
DLG_NOTIFY_BEGIN()
DLG_NOTIFY_END()
DLG_MESSAGE_END()

INT	CDipSwitchDlg::DoModal( HWND hWndParent )
{
	return	::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_EXT_VSUNISYSTEM),
				hWndParent, g_DlgProc, (LPARAM)this );
}


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

	for( INT i = IDC_EVS_DIPCOMBO0; i <= IDC_EVS_DIPCOMBO7; i++ ) {
		::SendDlgItemMessage( m_hWnd, i, CB_RESETCONTENT, 0, 0 );
	}

	BYTE		val = Emu.GetNES()->GetVSDipSwitch();
	VSDIPSWITCH*	dip = Emu.GetNES()->GetVSDipSwitchTable();

DEBUGOUT( "GET DIPSWITCH:%02X\n", val );

	BYTE	mask;

	INT	nStatic = IDC_EVS_DIPNAME0;
	INT	nCombo  = IDC_EVS_DIPCOMBO0;
	BOOL	bFlag;
	INT	nCount, nSelect;

	bFlag = FALSE;
	nCount = nSelect = 0;
	for(;;) {
		if( dip->name == NULL && dip->value == 0x0000 ) {
			break;
		} else if( dip->value == 0x00FF ) {
			bFlag = FALSE;
			::SendDlgItemMessage( m_hWnd, nCombo, CB_SETCURSEL, (WPARAM)nSelect, 0 );
			nCombo++;
		} else if( !bFlag ) {
			bFlag = TRUE;
			::SetDlgItemText( m_hWnd, nStatic, (LPCTSTR)dip->name );
			mask = dip->value>>8;
			nCount = 0;
			nStatic++;
		} else {
			if( dip->value == (val & mask) )
				nSelect = nCount;
			::SendDlgItemMessage( m_hWnd, nCombo, CB_INSERTSTRING, (WPARAM)-1, (LPARAM)dip->name );
			::SendDlgItemMessage( m_hWnd, nCombo, CB_SETITEMDATA, (WPARAM)nCount, (LPARAM)(dip->value&0xFF) );
			nCount++;
		}
		dip++;
	}
	m_nDispCount = nStatic-IDC_EVS_DIPNAME0;

	// 巊傢側偄搝偼旕昞帵偵偡傞
	for( ; nStatic <= IDC_EVS_DIPNAME7; nStatic++, nCombo++ ) {
		::ShowWindow( ::GetDlgItem( m_hWnd, nStatic ), SW_HIDE );
		::ShowWindow( ::GetDlgItem( m_hWnd, nCombo ), SW_HIDE );
	}

	return	TRUE;
}

DLGCMD	CDipSwitchDlg::OnOK( DLGCMDPARAM )
{
//	DEBUGOUT( "CDipSwitchDlg::OnOK\n" );

	// 慖戰偝傟偰偄傞搝偺ItemData傪庢摼偟偰DipSwitch僨乕僞傪嶌傝捈偡(OnInitDialog偱ItemData傪愝掕嵪傒)
	BYTE	dipval = 0;
	for( INT i = IDC_EVS_DIPCOMBO0; i < IDC_EVS_DIPCOMBO0+m_nDispCount; i++ ) {
		INT	sel = ::SendDlgItemMessage( m_hWnd, i, CB_GETCURSEL, 0, 0 );
		DWORD	val = (DWORD)::SendDlgItemMessage( m_hWnd, i, CB_GETITEMDATA, (WPARAM)sel, 0 );

		dipval |= val & 0xFF;
	}

	Emu.GetNES()->SetVSDipSwitch( dipval );

DEBUGOUT( "SET DIPSWITCH:%02X\n", dipval );

	::EndDialog( m_hWnd, IDOK );
}

DLGCMD	CDipSwitchDlg::OnCancel( DLGCMDPARAM )
{
//	DEBUGOUT( "CDipSwitchDlg::OnCancel\n" );
	::EndDialog( m_hWnd, IDCANCEL );
}

⌨️ 快捷键说明

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