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

358 lines
19 KiB
C++
Raw 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 <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();
}