AxibugEmuOnline/References/virtuanessrc097-master/ControllerDlg.cpp
2024-08-05 17:58:53 +08:00

517 lines
30 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// コントローラダイアログクラス
//
//
#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 );
}
}
DLGMSG CControllerDlg::OnInitDialog( DLGMSGPARAM )
{
// DEBUGOUT( "CControllerDlg::OnInitDialog\n" );
m_ConfigSave = Config.controller;
OnInitialMember();
return TRUE;
}
DLGMSG CControllerDlg::OnDestroy( DLGMSGPARAM )
{
// DEBUGOUT( "CControllerDlg::OnDestroy\n" );
// チャイルドウインドウを破棄
for( INT i = 0; i < m_PageNum; i++ ) {
::DestroyWindow( m_Page[i].m_hWnd );
}
return FALSE;
}
DLGNOTIFY CControllerDlg::OnSelectChange( DLGNOTIFYPARAM )
{
// DEBUGOUT( "CControllerDlg::OnSelectChange\n" );
HWND hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CTR_TAB );
m_PageSel = TabCtrl_GetCurSel( hWndCtrl );
OnPageSetup( m_PageSel );
for( INT i = 0; i < m_PageNum; i++ ) {
if( i == m_PageSel ) {
::ShowWindow( m_Page[i].m_hWnd, SW_SHOW );
} else {
::ShowWindow( m_Page[i].m_hWnd, SW_HIDE );
}
}
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
// ::InvalidateRect( hWndCtrl, NULL, TRUE );
}
m_bCancelMode = FALSE;
}
DLGNOTIFY CControllerDlg::OnSettingSelectChange( DLGCMDPARAM )
{
// DEBUGOUT( "CControllerDlg::OnSettingSelectChange\n" );
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
// ::InvalidateRect( ::GetDlgItem( m_hWnd, IDC_CTR_TAB ), NULL, TRUE );
}
m_bCancelMode = FALSE;
m_SettingSel = ::SendDlgItemMessage( m_hWnd, IDC_CTR_SELECT_COMBO, CB_GETCURSEL, 0, 0 );
OnPageSetup( m_PageSel );
}
DLGCMD CControllerDlg::OnClicked( DLGCMDPARAM )
{
// DEBUGOUT( "CControllerDlg::OnClicked uID=%d\n", uID );
if( !m_TimerID ) {
m_ControlID = uID;
m_TimerCount = 0;
m_TimerID = ::SetTimer( m_hWnd, 1, 50, NULL );
m_bCancelMode = TRUE;
}
}
DLGMSG CControllerDlg::OnTimer( DLGMSGPARAM )
{
HWND hWndCtrl = ::GetDlgItem( m_Page[m_PageSel].m_hWnd, m_ControlID );
INT nID = m_ControlID - IDC_CTR_UP;
INT nOffset = m_SettingSel?32:0;
if( wParam == (WPARAM)m_TimerID ) {
if( m_TimerCount == 0 )
m_TimerStart = ::timeGetTime();
m_TimerCount++;
DirectInput.Poll();
if( m_TimerCount > 60 ) {
// TimeOut
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
::InvalidateRect( hWndCtrl, NULL, TRUE );
}
m_bCancelMode = FALSE;
} else {
// Button push?
BOOL bSet = FALSE;
INT i;
LPCSTR str;
// Set cancel
if( DirectInput.m_Sw[DIK_ESCAPE] ) {
if( m_PageSel < 4 ) {
Config.controller.nButton[m_PageSel][nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_CRAZYCLIMBER ) {
Config.controller.nExButton[0][nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_FAMLYTRAINER ) {
Config.controller.nExButton[1][nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_EXCITINGBOXING ) {
Config.controller.nExButton[2][nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_MAHJANG ) {
Config.controller.nExButton[3][nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_NSFPLAYER ) {
Config.controller.nNsfButton[nID+nOffset] = 0;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_VSUNISYSTEM ) {
Config.controller.nVSUnisystem[nID+nOffset] = 0;
}
::SetWindowText( hWndCtrl, "----" );
bSet = TRUE;
} else {
for( i = 0; i < 512; i++ ) {
if( DirectInput.m_Sw[i] ) {
if( (str=DirectInput.SearchKeyName( i )) ) {
if( m_PageSel < 4 ) {
Config.controller.nButton[m_PageSel][nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_CRAZYCLIMBER ) {
Config.controller.nExButton[0][nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_FAMLYTRAINER ) {
Config.controller.nExButton[1][nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_EXCITINGBOXING ) {
Config.controller.nExButton[2][nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_MAHJANG ) {
Config.controller.nExButton[3][nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_NSFPLAYER ) {
Config.controller.nNsfButton[nID+nOffset] = i;
} else if( ControllerPageID[m_PageSel] == IDD_CTR_VSUNISYSTEM ) {
Config.controller.nVSUnisystem[nID+nOffset] = i;
}
::SetWindowText( hWndCtrl, str );
bSet = TRUE;
}
}
}
}
if( bSet ) {
// Button Pressed
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
::InvalidateRect( hWndCtrl, NULL, TRUE );
}
m_bCancelMode = FALSE;
} else {
// Flashing
HDC hDC = ::GetDC( hWndCtrl );
RECT rc;
::GetClientRect( hWndCtrl, &rc );
DWORD c = ((::timeGetTime()-m_TimerStart)/3)&0xFF;
if( c > 0x7F )
c = 0x80 - (c - 0x7F);
c *= 2;
::SetBkColor( hDC, RGB(c,c,c) );
::ExtTextOut( hDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL );
::ReleaseDC( hWndCtrl, hDC );
}
}
}
return FALSE;
}
DLGCMD CControllerDlg::OnOK( DLGCMDPARAM )
{
// DEBUGOUT( "CControllerDlg::OnOK\n" );
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
}
m_bCancelMode = FALSE;
for( INT page = 0; page < 4; page++ ) {
Config.controller.nRapid[page][0] = ::SendDlgItemMessage( m_Page[page].m_hWnd, IDC_CTR_A_RAPID_LIST, LB_GETCURSEL, 0, 0 );
Config.controller.nRapid[page][1] = ::SendDlgItemMessage( m_Page[page].m_hWnd, IDC_CTR_B_RAPID_LIST, LB_GETCURSEL, 0, 0 );
}
::EndDialog( m_hWnd, IDOK );
}
DLGCMD CControllerDlg::OnCancel( DLGCMDPARAM )
{
// DEBUGOUT( "CControllerDlg::OnCancel\n" );
// if( m_bCancelMode )
// return;
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
}
m_bCancelMode = FALSE;
Config.controller = m_ConfigSave;
::EndDialog( m_hWnd, IDCANCEL );
}
DLGCMD CControllerDlg::OnDefault( DLGCMDPARAM )
{
// DEBUGOUT( "CControllerDlg::OnDefault\n" );
if( m_TimerID ) {
::KillTimer( m_hWnd, m_TimerID );
m_TimerID = 0;
m_ControlID = 0;
}
m_bCancelMode = FALSE;
switch( ControllerPageID[m_PageSel] ) {
case IDD_CTR_PLAYER1:
Config.controller.DefaultController1();
break;
case IDD_CTR_PLAYER2:
Config.controller.DefaultController2();
break;
case IDD_CTR_PLAYER3:
Config.controller.DefaultController3();
break;
case IDD_CTR_PLAYER4:
Config.controller.DefaultController4();
break;
case IDD_CTR_CRAZYCLIMBER:
Config.controller.DefaultExController0();
break;
case IDD_CTR_FAMLYTRAINER:
Config.controller.DefaultExController1();
break;
case IDD_CTR_EXCITINGBOXING:
Config.controller.DefaultExController2();
break;
case IDD_CTR_MAHJANG:
Config.controller.DefaultExController3();
break;
case IDD_CTR_NSFPLAYER:
Config.controller.DefaultNsfController();
break;
case IDD_CTR_VSUNISYSTEM:
Config.controller.DefaultVSUnisystem();
break;
default:
break;
}
OnPageSetup( m_PageSel );
}