358 lines
9.2 KiB
C++
358 lines
9.2 KiB
C++
//
|
|
// ショートカットダイアログクラス
|
|
//
|
|
//
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
|
|
#include <string>
|
|
using namespace std;
|
|
|
|
#include "VirtuaNESres.h"
|
|
#include "DebugOut.h"
|
|
#include "App.h"
|
|
#include "Pathlib.h"
|
|
#include "Config.h"
|
|
|
|
#include "Wnd.h"
|
|
#include "ShortcutDlg.h"
|
|
|
|
#include "DirectInput.h"
|
|
|
|
DLG_MESSAGE_BEGIN(CShortcutDlg)
|
|
// メッセージ
|
|
DLG_ON_MESSAGE( WM_INITDIALOG, OnInitDialog )
|
|
DLG_ON_MESSAGE( WM_TIMER, OnTimer )
|
|
// NOTIFYメッセージ
|
|
DLG_NOTIFY_BEGIN()
|
|
DLG_ON_NOTIFY( IDC_CUT_LIST, NM_DBLCLK, OnListDblClick )
|
|
DLG_ON_NOTIFY( IDC_CUT_LIST, LVN_ITEMCHANGED, OnListItemChanged )
|
|
DLG_NOTIFY_END()
|
|
// コマンド
|
|
DLG_COMMAND_BEGIN()
|
|
DLG_ON_COMMAND( IDOK, OnOK )
|
|
DLG_ON_COMMAND( IDCANCEL, OnCancel )
|
|
DLG_ON_COMMAND( IDDEFAULT, OnDefault )
|
|
DLG_COMMAND_END()
|
|
DLG_MESSAGE_END()
|
|
|
|
DLGMSG OnTimer( DLGMSGPARAM );
|
|
DLGNOTIFY OnListDblClick( DLGNOTIFYPARAM );
|
|
DLGNOTIFY OnListItemChanged( DLGNOTIFYPARAM );
|
|
|
|
INT CShortcutDlg::DoModal( HWND hWndParent )
|
|
{
|
|
m_bCancelMode = FALSE;
|
|
return ::DialogBoxParam( CApp::GetPlugin(), MAKEINTRESOURCE(IDD_CFG_SHORTCUT),
|
|
hWndParent, g_DlgProc, (LPARAM)this );
|
|
}
|
|
|
|
BOOL CShortcutDlg::PreTranslateMessage( MSG* pMsg )
|
|
{
|
|
if( pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST ) {
|
|
// DEBUGOUT( "CShortcutDlg::PreTranslateMessage WM_KEY????\n" );
|
|
return m_bCancelMode;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void CShortcutDlg::OnInitialMember()
|
|
{
|
|
// リストビューのアイテム等の削除
|
|
CHAR szStr[256];
|
|
HWND hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CUT_LIST );
|
|
ListView_DeleteColumn( hWndCtrl, 0 );
|
|
ListView_DeleteColumn( hWndCtrl, 0 );
|
|
ListView_DeleteColumn( hWndCtrl, 0 );
|
|
ListView_DeleteAllItems( hWndCtrl );
|
|
ListView_SetItemCount( hWndCtrl, 100 );
|
|
|
|
// ヘッダコントロールの設定
|
|
LVCOLUMN lvColumn;
|
|
lvColumn.mask = LVCF_FMT|LVCF_TEXT|LVCF_SUBITEM;
|
|
lvColumn.fmt = LVCFMT_LEFT;
|
|
|
|
CApp::LoadString( IDS_CUT_TYPE, szStr, sizeof(szStr) );
|
|
lvColumn.iSubItem = 0;
|
|
lvColumn.pszText = szStr;
|
|
ListView_InsertColumn( hWndCtrl, 0, &lvColumn );
|
|
|
|
CApp::LoadString( IDS_CUT_KEY, szStr, sizeof(szStr) );
|
|
lvColumn.iSubItem = 1;
|
|
lvColumn.pszText = szStr;
|
|
ListView_InsertColumn( hWndCtrl, 1, &lvColumn );
|
|
|
|
CApp::LoadString( IDS_CUT_KEY2, szStr, sizeof(szStr) );
|
|
lvColumn.iSubItem = 2;
|
|
lvColumn.pszText = szStr;
|
|
ListView_InsertColumn( hWndCtrl, 2, &lvColumn );
|
|
|
|
|
|
// リストビュー内容設定
|
|
LVITEM lvItem;
|
|
ZeroMemory( &lvItem, sizeof(lvItem) );
|
|
lvItem.mask = LVIF_TEXT;
|
|
|
|
for( INT i = 0; CConfig::ShortcutKeyID[i*3+0]; i++ ) {
|
|
lvItem.iItem = i;
|
|
// 種類
|
|
CApp::LoadString( CConfig::ShortcutKeyID[i*3+1], szStr, sizeof(szStr) );
|
|
lvItem.pszText = szStr;
|
|
ListView_InsertItem( hWndCtrl, &lvItem );
|
|
|
|
// 設定キー
|
|
if( m_ControlBuf[i] == 0 ) {
|
|
ListView_SetItemText( hWndCtrl, i, 1, "----" );
|
|
} else {
|
|
string str = Config.ShortcutToKeyName( m_ControlBuf[i] );
|
|
ListView_SetItemText( hWndCtrl, i, 1, (LPSTR)str.c_str() );
|
|
}
|
|
// 設定キー2
|
|
if( m_ControlBuf2[i] == 0 ) {
|
|
ListView_SetItemText( hWndCtrl, i, 2, "----" );
|
|
} else {
|
|
string str = Config.ShortcutToKeyName( m_ControlBuf2[i] );
|
|
ListView_SetItemText( hWndCtrl, i, 2, (LPSTR)str.c_str() );
|
|
}
|
|
}
|
|
|
|
// カラムを設定してから横幅変更しないと横スクロールバーが出て邪魔なので...
|
|
RECT rc;
|
|
::GetClientRect( hWndCtrl, &rc );
|
|
|
|
ListView_SetColumnWidth( hWndCtrl, 0, (rc.right-rc.left)*10/20 );
|
|
ListView_SetColumnWidth( hWndCtrl, 1, (rc.right-rc.left)*5/20 );
|
|
ListView_SetColumnWidth( hWndCtrl, 2, (rc.right-rc.left)*5/20 );
|
|
ListView_SetExtendedListViewStyle( hWndCtrl, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES );
|
|
}
|
|
|
|
DLGMSG CShortcutDlg::OnInitDialog( DLGMSGPARAM )
|
|
{
|
|
// DEBUGOUT( "CShortcutDlg::OnInitDialog\n" );
|
|
|
|
// 設定の保存
|
|
m_ConfigSave = Config.shortcut;
|
|
|
|
// コピー
|
|
for( INT i = 0; CConfig::ShortcutKeyID[i*3+0]; i++ ) {
|
|
m_ControlBuf [i] = Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2]];
|
|
m_ControlBuf2[i] = Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2]+128];
|
|
}
|
|
// ウインドウタイトルの保存
|
|
::GetWindowText( m_hWnd, m_szWindowTitle, sizeof(m_szWindowTitle) );
|
|
// 設定中メッセージの保存
|
|
CApp::LoadString( IDS_CUT_TITLE, m_szMessage, sizeof(m_szMessage) );
|
|
|
|
// 初期化
|
|
OnInitialMember();
|
|
|
|
m_bCancelMode = FALSE;
|
|
m_SelectPos = -1;
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
DLGMSG CShortcutDlg::OnTimer( DLGMSGPARAM )
|
|
{
|
|
if( wParam == (WPARAM)m_TimerID ) {
|
|
m_TimerCount++;
|
|
|
|
DirectInput.Poll();
|
|
|
|
if( !(m_TimerCount&0x04) ) {
|
|
string str = m_szWindowTitle;
|
|
str = str + " ";
|
|
str = str + m_szMessage;
|
|
::SetWindowText( m_hWnd, str.c_str() );
|
|
} else {
|
|
::SetWindowText( m_hWnd, m_szWindowTitle );
|
|
}
|
|
|
|
if( m_TimerCount > 60 ) {
|
|
// タイムアウト
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
}
|
|
m_bCancelMode = FALSE;
|
|
::SetWindowText( m_hWnd, m_szWindowTitle );
|
|
} else {
|
|
// Button push?
|
|
HWND hWndCtrl = ::GetDlgItem( m_hWnd, IDC_CUT_LIST );
|
|
INT i;
|
|
// Set cancel
|
|
if( DirectInput.m_Sw[DIK_ESCAPE] && !(DirectInput.m_Sw[DIK_LSHIFT] || DirectInput.m_Sw[DIK_RSHIFT]) ) {
|
|
if( m_SelectSubID == 2 ) {
|
|
ListView_SetItemText( hWndCtrl, m_SelectID, 2, "----" );
|
|
m_ControlBuf2[m_SelectID] = 0;
|
|
} else {
|
|
ListView_SetItemText( hWndCtrl, m_SelectID, 1, "----" );
|
|
m_ControlBuf[m_SelectID] = 0;
|
|
}
|
|
// ::SetWindowText( hWndCtrl, "----" );
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
}
|
|
m_bCancelMode = FALSE;
|
|
::SetWindowText( m_hWnd, m_szWindowTitle );
|
|
} else {
|
|
string str;
|
|
WORD keyex = 0;
|
|
if( !DirectInput.m_Sw[DIK_ESCAPE] ) {
|
|
if( DirectInput.m_Sw[DIK_LMENU] || DirectInput.m_Sw[DIK_RMENU] ) {
|
|
keyex |= CCfgShortCut::K_ALT;
|
|
str = str + "Alt+";
|
|
}
|
|
if( DirectInput.m_Sw[DIK_LCONTROL] || DirectInput.m_Sw[DIK_RCONTROL] ) {
|
|
keyex |= CCfgShortCut::K_CTRL;
|
|
str = str + "Ctrl+";
|
|
}
|
|
if( DirectInput.m_Sw[DIK_LSHIFT] || DirectInput.m_Sw[DIK_RSHIFT] ) {
|
|
keyex |= CCfgShortCut::K_SHIFT;
|
|
str = str + "Shift+";
|
|
}
|
|
}
|
|
|
|
for( i = 0; i < 256+64*8; i++ ) {
|
|
if( i == DIK_LMENU || i == DIK_RMENU
|
|
|| i == DIK_LCONTROL || i == DIK_RCONTROL
|
|
|| i == DIK_LSHIFT || i == DIK_RSHIFT )
|
|
continue;
|
|
|
|
if( DirectInput.m_Sw[i]&0x80 ) {
|
|
if( DirectInput.SearchKeyName(i) ) {
|
|
str = str + DirectInput.SearchKeyName(i);
|
|
if( m_SelectSubID == 2 ) {
|
|
m_ControlBuf2[m_SelectID] = keyex+i;
|
|
ListView_SetItemText( hWndCtrl, m_SelectID, 2, (LPSTR)str.c_str() );
|
|
} else {
|
|
m_ControlBuf [m_SelectID] = keyex+i;
|
|
ListView_SetItemText( hWndCtrl, m_SelectID, 1, (LPSTR)str.c_str() );
|
|
}
|
|
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
}
|
|
m_bCancelMode = FALSE;
|
|
::SetWindowText( m_hWnd, m_szWindowTitle );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
DLGNOTIFY CShortcutDlg::OnListItemChanged( DLGNOTIFYPARAM )
|
|
{
|
|
NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;
|
|
|
|
if( !(pNMListView->uOldState & LVIS_SELECTED) && (pNMListView->uNewState & LVIS_SELECTED) ) {
|
|
m_SelectPos = pNMListView->iItem;
|
|
}
|
|
}
|
|
|
|
DLGNOTIFY CShortcutDlg::OnListDblClick( DLGNOTIFYPARAM )
|
|
{
|
|
NMLISTVIEW* pNMListView = (NMLISTVIEW*)pNMHDR;
|
|
|
|
// DEBUGOUT( "CShortcutDlg::OnListDblClick\n" );
|
|
|
|
// まだ選択してないよ
|
|
if( m_SelectPos == -1 )
|
|
return;
|
|
|
|
LVHITTESTINFO htInfo;
|
|
ZeroMemory( &htInfo, sizeof(htInfo) );
|
|
// DWORD pos = ::GetMessagePos();
|
|
// POINT pt = *((POINT*)&pos);
|
|
// ::ScreenToClient( ::GetDlgItem( m_hWnd, IDC_CUT_LIST ), &pt );
|
|
// htInfo.pt.x = pt.x;
|
|
// htInfo.pt.y = pt.y;
|
|
htInfo.pt.x = pNMListView->ptAction.x;
|
|
htInfo.pt.y = pNMListView->ptAction.y;
|
|
ListView_HitTest( ::GetDlgItem( m_hWnd, IDC_CUT_LIST ), &htInfo );
|
|
|
|
// セレクトされた場所にヒットしてない?
|
|
if( htInfo.flags & LVHT_NOWHERE ) {
|
|
return;
|
|
}
|
|
|
|
if( !m_TimerID && pNMListView->iSubItem ) {
|
|
m_bCancelMode = TRUE;
|
|
m_SelectID = m_SelectPos;
|
|
m_SelectSubID = pNMListView->iSubItem;
|
|
m_TimerCount = 0;
|
|
m_TimerID = ::SetTimer( m_hWnd, 1, 50, NULL );
|
|
DEBUGOUT( "ID=%d/SUBID=%d\n", pNMListView->iItem, pNMListView->iSubItem );
|
|
}
|
|
}
|
|
|
|
DLGCMD CShortcutDlg::OnOK( DLGCMDPARAM )
|
|
{
|
|
// DEBUGOUT( "CShortcutDlg::OnOK\n" );
|
|
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
m_bCancelMode = FALSE;
|
|
}
|
|
|
|
// 設定をコピー
|
|
for( INT i = 0; CConfig::ShortcutKeyID[i*3+0]; i++ ) {
|
|
Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2] ] = m_ControlBuf [i];
|
|
Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2]+128] = m_ControlBuf2[i];
|
|
}
|
|
|
|
::EndDialog( m_hWnd, IDOK );
|
|
}
|
|
|
|
DLGCMD CShortcutDlg::OnCancel( DLGCMDPARAM )
|
|
{
|
|
// DEBUGOUT( "CShortcutDlg::OnCancel\n" );
|
|
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
m_bCancelMode = FALSE;
|
|
}
|
|
|
|
// 設定を戻す
|
|
Config.shortcut = m_ConfigSave;
|
|
|
|
::EndDialog( m_hWnd, IDCANCEL );
|
|
}
|
|
|
|
DLGCMD CShortcutDlg::OnDefault( DLGCMDPARAM )
|
|
{
|
|
// DEBUGOUT( "CShortcutDlg::OnDefault\n" );
|
|
|
|
if( m_TimerID ) {
|
|
::KillTimer( m_hWnd, m_TimerID );
|
|
m_TimerID = 0;
|
|
m_SelectID = 0;
|
|
m_bCancelMode = FALSE;
|
|
}
|
|
|
|
Config.shortcut.Default();
|
|
// コピー
|
|
for( INT i = 0; CConfig::ShortcutKeyID[i*3+0]; i++ ) {
|
|
m_ControlBuf [i] = Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2] ];
|
|
m_ControlBuf2[i] = Config.shortcut.nShortCut[CConfig::ShortcutKeyID[i*3+2]+128];
|
|
}
|
|
OnInitialMember();
|
|
}
|
|
|