⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 launcherdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	//
	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 + -