131 lines
6.2 KiB
C++
131 lines
6.2 KiB
C++
//
|
||
// チャットダイアログクラス
|
||
//
|
||
#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 );
|
||
}
|
||
|