📄 launcherdlg.cpp
字号:
//
m_bFileLoaded = FALSE;
if( LoadFileList() ) {
if( !m_FileListNum ) {
::PostMessage( m_hWnd, WM_COMMAND, ID_LCH_REFRESH, 0 );
} else {
ResetListView();
SortListView();
SetLastSelect();
m_bFileLoaded = TRUE;
}
} else {
::PostMessage( m_hWnd, WM_COMMAND, ID_LCH_REFRESH, 0 );
}
// // 昞帵
// ::ShowWindow( m_hWnd, SW_SHOW );
return TRUE;
}
DLGMSG CLauncherDlg::OnDestroy( DLGMSGPARAM )
{
if( m_hImageList ) {
ImageList_Destroy( m_hImageList );
m_hImageList = NULL;
}
if( m_hImageListHdr ) {
ImageList_Destroy( m_hImageListHdr );
m_hImageListHdr = NULL;
}
return TRUE;
}
DLGMSG CLauncherDlg::OnClose( DLGMSGPARAM )
{
::ShowWindow( m_hWnd, SW_HIDE ); // 旕昞帵偵偡傞偩偗
return TRUE;
}
DLGMSG CLauncherDlg::OnActivate( DLGMSGPARAM )
{
if( LOWORD(wParam) == WA_INACTIVE ) {
// DEBUGOUT( "CLauncherDlg::OnActivate:Inactive\n" );
::PostMessage( CApp::GetHWnd(), WM_VNS_SHORTCUTENABLE, (WPARAM)TRUE, 0 );
} else {
// DEBUGOUT( "CLauncherDlg::OnActivate:Active\n" );
::PostMessage( CApp::GetHWnd(), WM_VNS_SHORTCUTENABLE, (WPARAM)FALSE, 0 );
}
return TRUE;
}
DLGMSG CLauncherDlg::OnSetCursor( DLGMSGPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnSetCursor\n" );
return FALSE;
}
DLGMSG CLauncherDlg::OnSize( DLGMSGPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnSize\n" );
HWND hWndCtrl;
RECT rcT, rcC, rcW;
::GetClientRect( m_hWnd, &rcC );
rcT = rcC;
if( (hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_STATUS )) ) {
::GetWindowRect( hWndCtrl, &rcW );
rcT.top = rcC.bottom - (rcW.bottom-rcW.top);
::MoveWindow( hWndCtrl, rcT.left, rcT.top, RCWIDTH(rcT), RCHEIGHT(rcT), TRUE );
if( (hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_LIST )) ) {
rcT.top = rcC.top;
rcT.bottom = rcC.bottom - (rcW.bottom-rcW.top);
::MoveWindow( hWndCtrl, rcT.left, rcT.top, RCWIDTH(rcT), RCHEIGHT(rcT), TRUE );
}
}
return FALSE;
}
DLGMSG CLauncherDlg::OnInitMenuPopup( DLGMSGPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnInitMenuPopup\n" );
// System menu
if( (BOOL)HIWORD(lParam) )
return FALSE;
// DEBUGOUT( "SubMenu=%08X uPos=%d bSys=%d\n", wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam) );
HMENU hMenu = (HMENU)wParam;
INT MenuCount = ::GetMenuItemCount( hMenu );
for( INT i = 0; i < MenuCount; i++ ) {
OnUpdateMenu( hMenu, ::GetMenuItemID( hMenu, i ) );
}
return FALSE;
}
void CLauncherDlg::OnUpdateMenu( HMENU hMenu, UINT uID )
{
BOOL bCheck = FALSE;
switch( uID ) {
case ID_LCH_LIST0: case ID_LCH_LIST1:
case ID_LCH_LIST2: case ID_LCH_LIST3:
case ID_LCH_LIST4: case ID_LCH_LIST5:
case ID_LCH_LIST6: case ID_LCH_LIST7:
case ID_LCH_LIST8: case ID_LCH_LIST9:
if( m_nListSelect == (uID-ID_LCH_LIST0) )
bCheck = TRUE;
else
bCheck = FALSE;
::CheckMenuItem( hMenu, uID, MF_BYCOMMAND|(bCheck?MF_CHECKED:MF_UNCHECKED) );
break;
}
}
DLGNOTIFY CLauncherDlg::OnKeyDownListView( DLGNOTIFYPARAM )
{
NMLVKEYDOWN* pNMLVKeyDown = (NMLVKEYDOWN*)pNMHDR;
if( pNMLVKeyDown->wVKey == VK_ESCAPE ) {
::PostMessage( m_hWnd, WM_COMMAND, IDCANCEL, 0 );
}
}
DLGNOTIFY CLauncherDlg::OnReturnListView( DLGNOTIFYPARAM )
{
::PostMessage( m_hWnd, WM_COMMAND, IDOK, 0 );
}
DLGNOTIFY CLauncherDlg::OnDoubleClickListView( DLGNOTIFYPARAM )
{
if( m_FileListNum ) {
//DEBUGOUT( "Item double click!! SEL=%08X\n", m_SelectPos );
FILELIST& fl = m_FileList[m_SelectPos];
string path = CPathlib::MakePath( fl.path.c_str(), fl.fname.c_str() );
::strcpy( m_LaunchPath, path.c_str() );
// 儊僀儞僂僀儞僪僂偵億僗僩
::PostMessage( CApp::GetHWnd(), WM_VNS_LAUNCHERCMD, 0, (LPARAM)m_LaunchPath );
}
}
DLGNOTIFY CLauncherDlg::OnColumnClickListView( DLGNOTIFYPARAM )
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
//DEBUGOUT( "Column click!! I:%d S:%d\n", pNMListView->iItem, pNMListView->iSubItem );
//DEBUGOUT( "Order:%d\n", Config.launcher.nHeaderOrder[pNMListView->iSubItem] );
if( Config.launcher.nSortType == Config.launcher.nHeaderOrder[pNMListView->iSubItem] ) {
Config.launcher.bSortDir = !Config.launcher.bSortDir;
} else {
Config.launcher.bSortDir = FALSE;
Config.launcher.nSortType = Config.launcher.nHeaderOrder[pNMListView->iSubItem];
}
SortListView();
}
DLGNOTIFY CLauncherDlg::OnItemChangedListView( DLGNOTIFYPARAM )
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
if( !(pNMListView->uOldState & LVIS_SELECTED) && (pNMListView->uNewState & LVIS_SELECTED) ) {
//DEBUGOUT( "Item Select. SEL=%d\n", pNMListView->iItem );
m_SelectPos = (INT)pNMListView->lParam;
}
}
DLGCMD CLauncherDlg::OnOK( DLGCMDPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnOK\n" );
if( m_FileListNum ) {
//DebugOut( "Item double click!! SEL=%08X\n", m_SelectPos );
FILELIST& fl = m_FileList[m_SelectPos];
string path = CPathlib::MakePath( fl.path.c_str(), fl.fname.c_str() );
::strcpy( m_LaunchPath, path.c_str() );
// 儊僀儞僂僀儞僪僂偵億僗僩
::PostMessage( CApp::GetHWnd(), WM_VNS_LAUNCHERCMD, 0, (LPARAM)m_LaunchPath );
}
}
DLGCMD CLauncherDlg::OnCancel( DLGCMDPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnCancel\n" );
::ShowWindow( m_hWnd, SW_HIDE ); // 旕昞帵偵偡傞偩偗
}
DLGCMD CLauncherDlg::OnListSelect( DLGCMDPARAM )
{
// DEBUGOUT( "CLauncherDlg::OnListSelect uID:%d\n", uID );
INT nSel = uID-ID_LCH_LIST0;
// 堘偆儕僗僩偵偟偨偄丠
if( m_nListSelect != nSel ) {
// 偟偨偄偱偡
// DEBUGOUT( "LISTSEL=%d\n", nSel );
// 捈慜偺傕偺傪僙乕僽
m_bFileLoaded = FALSE;
SaveFileList();
Config.launcher.nListSelect = m_nListSelect = nSel;
LoadFileList();
if( m_FileListNum ) {
ResetListView();
SortListView();
SetLastSelect();
m_bFileLoaded = TRUE;
} else {
ResetListView();
}
}
}
DLGCMD CLauncherDlg::OnRefresh( DLGCMDPARAM )
{
OnUpdateStop();
ResetFileList();
ResetListView();
SortListView();
OnUpdateStart();
}
DLGCMD CLauncherDlg::OnDispEdit( DLGCMDPARAM )
{
CLchDispEditDlg dlg;
if( dlg.DoModal( m_hWnd ) == IDOK ) {
ResetListViewHeader();
ResetListView();
SortListView();
}
}
DLGCMD CLauncherDlg::OnFolder( DLGCMDPARAM )
{
CLchFolderConfigDlg dlg;
if( dlg.DoModal( m_hWnd ) == IDOK ) {
// ::PostMessage( m_hWnd, WM_COMMAND, ID_LCH_REFRESH, 0 );
}
}
DLGCMD CLauncherDlg::OnHeaderEdit( DLGCMDPARAM )
{
DEBUGOUT( "CLauncherDlg::OnHeaderEdit SEL=%d\n", m_SelectPos );
if( m_SelectPos >= 0 && m_FileListNum ) {
FILE* fp = NULL;
NESHEADER header;
FILELIST& fl = m_FileList[ m_SelectPos ];
string Path = CPathlib::MakePath( fl.path.c_str(), fl.fname.c_str() );
DEBUGOUT( "Path:%s\n", Path.c_str() );
// 傾乕僇僀僽僼傽僀儖偼僄僨傿僢僩晄壜
char* pExt = ::PathFindExtension( Path.c_str() );
if( _stricmp( pExt, ".lzh" ) == 0 || _stricmp( pExt, ".zip" ) == 0 || _stricmp( pExt, ".cab" ) == 0 || _stricmp( pExt, ".rar" ) == 0 ) {
return;
}
if( (fp = ::fopen( Path.c_str(), "rb" )) ) {
if( ::fread( &header, sizeof(header), 1, fp ) != 1 ) {
FCLOSE( fp );
return;
}
FCLOSE( fp );
} else {
return;
}
// NES埲奜偼僄僨傿僢僩晄壜
if( header.ID[0] != 'N' || header.ID[1] != 'E'
|| header.ID[2] != 'S' || header.ID[3] != 0x1A) {
return;
}
CLchHeaderEditDlg dlg;
dlg.m_nMapperNo = (INT)((header.control1&0xF0)>>4)|(header.control2&0xF0);
dlg.m_bMirror = (header.control1&0x01)?TRUE:FALSE;
dlg.m_bSram = (header.control1&0x02)?TRUE:FALSE;
dlg.m_bTrainer = (header.control1&0x04)?TRUE:FALSE;
dlg.m_bFourScreen = (header.control1&0x08)?TRUE:FALSE;
dlg.m_bVSUnisystem = (header.control2&0x01)?TRUE:FALSE;
if( dlg.DoModal( m_hWnd ) == IDOK ) {
BYTE control1 = 0;
BYTE control2 = 0;
INT no = dlg.m_nMapperNo;
control1 = (no&0x0F)<<4;
control2 = no&0xF0;
if( dlg.m_bMirror ) control1 |= 0x01;
if( dlg.m_bSram ) control1 |= 0x02;
if( dlg.m_bTrainer ) control1 |= 0x04;
if( dlg.m_bFourScreen ) control1 |= 0x08;
if( dlg.m_bVSUnisystem ) control2 |= 0x01;
if( header.control1 != control1 || header.control2 != control2 ) {
CHAR szStr[256];
CApp::LoadString( IDS_LCH_HEADERREWRITE, szStr, sizeof(szStr) );
if( ::MessageBox( m_hWnd, szStr, "", MB_YESNO ) == IDYES ) {
header.control1 = control1;
header.control2 = control2;
for( INT i = 0; i < 8; i++ )
header.reserved[i] = 0;
LPBYTE temp = NULL;
LONG size;
try {
if( (fp = ::fopen( Path.c_str(), "r+b" )) ) {
// 僼傽僀儖僒僀僘庢摼
::fseek( fp, 0, SEEK_END );
size = ::ftell( fp );
::fseek( fp, 0, SEEK_SET );
// 僥儞億儔儕儊儌儕妋曐
if( !(temp = (LPBYTE)::malloc( size )) )
// 儊儌儕傪妋曐弌棃傑偣傫
throw CApp::GetErrorString( IDS_ERROR_OUTOFMEMORY );
// 僒僀僘暘撉傒崬傒
if( ::fread( temp, size, 1, fp ) != 1 )
// 僼傽僀儖偺撉傒崬傒偵幐攕偟傑偟偨
throw CApp::GetErrorString( IDS_ERROR_READ );
::memcpy( temp, &header, sizeof(header) );
::fseek( fp, 0, SEEK_SET );
if( ::fwrite( temp, size, 1, fp ) != 1 )
// 僼傽僀儖偺彂偒崬傒偵幐攕偟傑偟偨
throw CApp::GetErrorString( IDS_ERROR_WRITE );
FCLOSE( fp );
FREE( temp );
}
CheckFile( fl );
m_bFileLoaded = FALSE; // 僙乕僽偡傞堊偵僼儔僌徚偡
HWND hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_LIST );
LV_FINDINFO fi;
fi.flags = LVFI_PARAM;
fi.lParam = (LPARAM)m_SelectPos;
INT index = ListView_FindItem( hWndCtrl, -1, &fi );
if( index >= 0 ) {
SetListView( index, fl );
}
} catch( CHAR* str ) {
::MessageBox( m_hWnd, str, "ERROR", MB_ICONERROR|MB_OK );
#ifndef _DEBUG
} catch(...) {
::MessageBox( m_hWnd, CApp::GetErrorString( IDS_ERROR_UNKNOWN ), "ERROR", MB_ICONERROR|MB_OK );
#endif
}
}
}
}
}
}
BOOL CLauncherDlg::LoadFileList()
{
FILE* fp = NULL;
CHAR buf[1024+1];
const UCHAR seps[] = ";\n\0"; // 僙僷儗乕僞
FILELIST fl;
// string Path = CPathlib::MakePathExt( CApp::GetModulePath(), "launcher", "lst" );
string Path = CPathlib::MakePath( CApp::GetModulePath(), "launcher" );
if( m_nListSelect ) {
Path = Path + (char)('0'+m_nListSelect) + ".lst";
} else {
Path = Path + ".lst";
}
m_FileList.clear();
m_FileListNum = 0;
if( (fp = ::fopen( Path.c_str(), "r" )) ) {
DEBUGOUT( "Load Launcher File:%s\n", Path.c_str() );
while( ::fgets( buf, 1024, fp ) ) {
if( buf[0] == ';' ) {
continue;
}
CHAR* pToken;
// File Name
if( !(pToken = (CHAR*)::_mbstok( (UCHAR*)buf, seps )) )
continue;
fl.fname = pToken;
// Path
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.path = pToken;
// Mapper
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.mapper = ::atoi( pToken );
// PRG SIZE
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.prg_size = ::atoi( pToken );
// CHR SIZE
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.chr_size = ::atoi( pToken );
// ALL CRC
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.crcall = ::strtoul( pToken, NULL, 16 );
// CRC
if( !(pToken = (CHAR*)::_mbstok( NULL, seps )) )
continue;
fl.crc = ::strtoul( pToken, NULL, 16 );
// Info
if( (pToken = (CHAR*)::_mbstok( NULL, seps )) ) {
fl.info = pToken;
} else {
fl.info = "";
}
// DB
if( (pToken = (CHAR*)::_mbstok( NULL, seps )) ) {
fl.db = pToken;
} else {
fl.db = "";
}
// TITLE
if( (pToken = (CHAR*)::_mbstok( NULL, seps )) ) {
fl.title = pToken;
} else {
fl.title = "";
}
// Country
if( (pToken = (CHAR*)::_mbstok( NULL, seps )) ) {
fl.country = pToken;
} else {
fl.country = "";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -