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

📄 launcherdlg.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	// Country
	if( Config.launcher.bHeaderView[10] ) {
		ListView_SetItemText( hWndCtrl, index, RealOrder[10], (LPSTR)fl.country.c_str() );
	}
	// Manufacturer
	if( Config.launcher.bHeaderView[11] ) {
		ListView_SetItemText( hWndCtrl, index, RealOrder[11], (LPSTR)fl.manufacturer.c_str() );
	}
	// Sale date
	if( Config.launcher.bHeaderView[12] ) {
		ListView_SetItemText( hWndCtrl, index, RealOrder[12], (LPSTR)fl.saledate.c_str() );
	}
	// Price
	if( Config.launcher.bHeaderView[13] ) {
		ListView_SetItemText( hWndCtrl, index, RealOrder[13], (LPSTR)fl.price.c_str() );
	}
	// Genre
	if( Config.launcher.bHeaderView[14] ) {
		ListView_SetItemText( hWndCtrl, index, RealOrder[14], (LPSTR)fl.genre.c_str() );
	}
}

void	CLauncherDlg::SortListView()
{
	INT	i;
	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_LIST );

	if( ListView_GetItemCount( hWndCtrl ) <= 0 )
		return;

	// 僿僢僟晹
	HWND	hWndHdr = ListView_GetHeader( hWndCtrl );
	HD_ITEM	hdi;
	hdi.mask = HDI_FORMAT;
	hdi.fmt  = HDF_STRING;
	for( i = 0; i < Header_GetItemCount(hWndHdr); i++ ) {
		Header_SetItem( hWndHdr, i, &hdi );
	}
	hdi.mask = HDI_FORMAT|HDI_IMAGE;
	hdi.fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT;
	hdi.iImage = Config.launcher.bSortDir?1:0;

	INT	RealOrder[16];
	for( i = 0; i < LAUNCHHEADER_MAX; i++ ) {
		RealOrder[Config.launcher.nHeaderOrder[i]] = i;
	}

	Header_SetItem( hWndHdr, RealOrder[Config.launcher.nSortType], &hdi );

	// 僜乕僩杮懱
	ListView_SortItems( hWndCtrl, (PFNLVCOMPARE)ListViewCompare, Config.launcher.nSortType );

	if( m_SelectPos >= 0 ) {
		LV_FINDINFO	fi;
		fi.flags  = LVFI_PARAM;
		fi.lParam = (LPARAM)m_SelectPos;
		INT	index = ListView_FindItem( hWndCtrl, -1, &fi );
		if( index >= 0 ) {
			ListView_EnsureVisible( hWndCtrl, index, FALSE );
			ListView_SetItemState( hWndCtrl, index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED );
		}
	} else {
		LVITEM	lvitem;
		lvitem.mask = LVIF_PARAM;
		lvitem.iItem = 0;
		ListView_GetItem( hWndCtrl, &lvitem );
		m_SelectPos = lvitem.lParam;
		ListView_SetItemState( hWndCtrl, 0, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED );
	}
}

void	CLauncherDlg::SetLastSelect()
{
	if( !m_FileListNum )
		return;

	FILELIST fl;
	BOOL	bSel = FALSE;
	string	path;

	for( INT index = 0; index < m_FileListNum; index++ ) {
		fl = m_FileList[index];
		path = CPathlib::MakePath( fl.path.c_str(), fl.fname.c_str() );
		if( ::strcmp( Config.launcher.szLastSelect, path.c_str() ) == 0 ) {
			m_SelectPos = index;
			bSel = TRUE;
			break;
		}
	}

	if( bSel ) {
		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 ) {
			ListView_EnsureVisible( hWndCtrl, index, FALSE );
			ListView_SetItemState( hWndCtrl, index, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED );
		}
	}
}

void	CLauncherDlg::OnUpdateStart()
{
	if( !m_FileListNum )
		return;

	if( m_bUpdate ) {
		m_UpdatePos = 0;
		m_nUpdateIndex = 0;
	} else {
		m_UpdatePos = 0;
		m_nUpdateIndex = 0;
		m_nTimerID = ::SetTimer( m_hWnd, 1, 100, NULL );
		m_bUpdate = TRUE;
	}
}

void	CLauncherDlg::OnUpdateStop()
{
	if( m_bUpdate ) {
		::KillTimer( m_hWnd, m_nTimerID );
		m_bUpdate = FALSE;

		::SendMessage( ::GetDlgItem( m_hWnd, IDC_LCH_STATUS ), SB_SETTEXT, SBT_NOBORDERS, (LPARAM)"" );
	}
}

DLGMSG	CLauncherDlg::OnTimer( DLGMSGPARAM )
{
	if( m_bUpdate && !m_bUpdating ) {
		UpdateListView();
	}
	return	FALSE;
}

void	CLauncherDlg::UpdateListView()
{
	HWND	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_LIST );
	INT	nListCount = ListView_GetItemCount( hWndCtrl );
	if( nListCount <= 0 )
		return;

	m_bUpdating = TRUE;

//	for( INT i = 0; i < 5; i++ ) {
	for( INT i = 0; i < 20; i++ ) {
		FILELIST& fl = m_FileList[m_UpdatePos];
		CheckFile( fl );

		LV_FINDINFO	fi;
		fi.flags  = LVFI_PARAM;
		fi.lParam = (LPARAM)m_UpdatePos;
		INT	index = ListView_FindItem( hWndCtrl, -1, &fi );
		if( index >= 0 ) {
			SetListView( index, fl );
		}

		m_UpdatePos++;
		m_nUpdateIndex++;

		if( m_nUpdateIndex >= nListCount ) {
			OnUpdateStop();
			break;
		}
	}

	if( m_nUpdateIndex < nListCount ) {
		// 僗僥乕僞僗僶乕傊偺昞帵
		CHAR	szTemp[256], szText[256];
		CApp::LoadString( IDS_LCH_LISTUPDATE, szTemp, sizeof(szTemp) );
		::wsprintf( szText, szTemp, m_nUpdateIndex, nListCount );
		::SendMessage( ::GetDlgItem( m_hWnd, IDC_LCH_STATUS ), SB_SETTEXT, SBT_NOBORDERS, (LPARAM)szText );
	}

	m_bUpdating = FALSE;
}

void CLauncherDlg::CheckFile( FILELIST& fl )
{
FILE*	fp = NULL;
LPBYTE	temp = NULL;
LONG	FileSize;
string	path;

	path = CPathlib::MakePath( fl.path.c_str(), fl.fname.c_str() );

	if( (fp = ::fopen( path.c_str(), "rb" )) ) {
		NESHEADER	header;

		// 僼傽僀儖僒僀僘庢摼
		::fseek( fp, 0, SEEK_END );
		FileSize = ::ftell( fp );
		::fseek( fp, 0, SEEK_SET );
		// 僼傽僀儖僒僀僘僠僃僢僋(NES僿僢僟+1僶僀僩埲忋偐丠)
		if( FileSize < 17 )
			goto	_error_return;

		// 僥儞億儔儕儊儌儕妋曐
		if( !(temp = (LPBYTE)::malloc( FileSize )) )
			goto	_error_return;

		// 僒僀僘暘撉傒崬傒
		if( ::fread( temp, FileSize, 1, fp ) != 1 )
			goto	_error_return;

		FCLOSE( fp );

		// 僿僢僟僐僺乕
		memcpy( &header, temp, sizeof(NESHEADER) );

		if( header.ID[0] == 'N' && header.ID[1] == 'E'
		 && header.ID[2] == 'S' && header.ID[3] == 0x1A ) {
			// 僿僢僟僐僺乕
//			memcpy( &header, temp, sizeof(NESHEADER) );
		} else if( header.ID[0] == 'F' && header.ID[1] == 'D'
			&& header.ID[2] == 'S' && header.ID[3] == 0x1A ) {
			// 僿僢僟僐僺乕
//			memcpy( &header, temp, sizeof(NESHEADER) );
		} else if( header.ID[0] == 'N' && header.ID[1] == 'E'
			&& header.ID[2] == 'S' && header.ID[3] == 'M') {
			// 僿僢僟僐僺乕
//			memcpy( &header, temp, sizeof(NESHEADER) );
		} else {
			FREE( temp );
			temp = NULL;
			if( !UnCompress( path.c_str(), &temp, (LPDWORD)&FileSize ) )
				goto	_error_return;
			memcpy( &header, temp, sizeof(NESHEADER) );
		}

		if( header.ID[0] == 'N' && header.ID[1] == 'E'
		 && header.ID[2] == 'S' && header.ID[3] == 0x1A ) {
			fl.mapper = ((header.control1&0xF0)>>4)|(header.control2&0xF0);
			fl.prg_size = header.PRG_PAGE_SIZE;
			fl.chr_size = header.CHR_PAGE_SIZE;
			CHAR	szTemp[64];
			::wsprintf( szTemp, "%s%s%s%s %s",
				(header.control1&0x01)?"V":"H",
				(header.control1&0x02)?"S":"_",
				(header.control1&0x04)?"T":"_",
				(header.control1&0x08)?"4":"_",
				(header.control2&0x01)?"(VS)":"" );
			fl.info = szTemp;

			BOOL	bBad = FALSE;
			if( header.control1&0x04 ) {
				if( FileSize < (512+16384*fl.prg_size+8192*fl.chr_size+sizeof(NESHEADER)) ) {
					fl.crcall   = CRC::CrcRev( FileSize-sizeof(NESHEADER), temp+sizeof(NESHEADER) );
					fl.crc      = 0;
					fl.prg_size = 0;
					fl.chr_size = 0;
					fl.info     = "Bad NES header";
					bBad = TRUE;
				} else {
					fl.crcall = CRC::CrcRev( 512+16384*fl.prg_size+8192*fl.chr_size, temp+sizeof(NESHEADER) );
					fl.crc    = CRC::CrcRev( 512+16384*fl.prg_size, temp+sizeof(NESHEADER) );
				}
			} else {
				if( FileSize < (16384*fl.prg_size+8192*fl.chr_size+sizeof(NESHEADER)) ) {
					fl.crcall   = CRC::CrcRev( FileSize-sizeof(NESHEADER), temp+sizeof(NESHEADER) );
					fl.crc      = 0;
					fl.prg_size = 0;
					fl.chr_size = 0;
					fl.info     = "Bad NES header";
					bBad = TRUE;
				} else {
					fl.crcall = CRC::CrcRev( 16384*fl.prg_size+8192*fl.chr_size, temp+sizeof(NESHEADER) );
					fl.crc    = CRC::CrcRev( 16384*fl.prg_size, temp+sizeof(NESHEADER) );
				}
			}

			if( !bBad ) {
				ROMDB	db;
				INT	ret = romdatabase.HeaderCheck( header, fl.crcall, fl.crc, db );
				if( ret == 0 ) {
					fl.db = "OK";
				} else if( ret == 1 ) {
					fl.db = "NG";
					fl.mapper |= 0x1000;
				} else {
					fl.db = "??";
				}
				if( ret >= 0 ) {
					fl.title        = db.title;
					fl.country      = db.country;
					fl.manufacturer = db.manufacturer;
					fl.saledate     = db.saledate;
					fl.price        = db.price;
					fl.genre        = db.genre;
				}
			} else {
				fl.mapper |= 0x1000;
			}
		} else if( header.ID[0] == 'F' && header.ID[1] == 'D'
			&& header.ID[2] == 'S' && header.ID[3] == 0x1A ) {
			fl.mapper = 20;
			fl.info = "Disk";
			// Disk number
			fl.prg_size = header.PRG_PAGE_SIZE;

			if( FileSize < (16+65500*(LONG)header.PRG_PAGE_SIZE) ) {
				// 僨傿僗僋僒僀僘偑堎忢偱偡
				fl.mapper |= 0x1000;
				fl.info = "Bad FDS size";
			}
		} else if( header.ID[0] == 'N' && header.ID[1] == 'E'
			&& header.ID[2] == 'S' && header.ID[3] == 'M') {
			fl.mapper = 0x100;
			if( FileSize < 0x80 ) {
				fl.info = "Bad NSF size";
			} else {
				// Total songs
				fl.prg_size = (INT)temp[0x06];
				fl.chr_size = (INT)temp[0x7a];	// NTSC/PAL
				if( temp[0x7b] ) {
					static	LPCSTR	szChipName[] = { "VRC VI", "VRC VII", "FDS", "MMC5", 
									 "N106", "FME-07", NULL, NULL };
					BOOL	bFind = FALSE;
					for( INT i = 0; szChipName[i]; i++ ) {
						if( temp[0x7b] & (1<<i) ) {
							if( bFind )
								fl.info = fl.info + "/";
							fl.info = fl.info + szChipName[i];
							bFind = TRUE;
						}
					}
				} else {
					fl.info = "Internal";
				}
			}
		}

		FREE(temp);
	}
	return;

_error_return:
	FREE(temp);
	FCLOSE( fp );
}

void CLauncherDlg::ResetFileList()
{
INT	i;
LPSTR	pszExt[] = {
	"*.nes",
	"*.fds",
	"*.nsf",
	"*.lzh",
	"*.zip",
	"*.cab",
	"*.rar",
	NULL
};

	m_bFileLoaded = FALSE;

	// 僼傽僀儖儕僗僩偺僋儕傾
	m_FileList.clear();
	m_FileListNum = 0;

	string	path;
	CHAR**	pExt;
	BOOL	bFind;
	FILELIST fl;
	fl.crc = fl.crcall = 0;
	fl.mapper = 0x200;	// Unknown
	fl.prg_size = fl.chr_size = 0;

	fl.info = fl.db = fl.title = fl.country = fl.manufacturer = fl.saledate = fl.price = fl.genre = "";

	HANDLE	hFind;
	WIN32_FIND_DATA	fdat;

	// 奼挘巕暿専嶕
	for( i = 0; i < 16; i++ ) {
		if( ::strlen( Config.launcher.szFolder[i] ) && Config.launcher.bFolderUse[i] ) {
			pExt = pszExt;
			while( *pExt ) {
				path = Config.launcher.szFolder[i];
				path += *pExt;
				bFind = TRUE;
				hFind = ::FindFirstFile( path.c_str(), &fdat );
				if( hFind == INVALID_HANDLE_VALUE )
					bFind = FALSE;
				while( bFind ) {
					fl.fname = fdat.cFileName;
					fl.path = Config.launcher.szFolder[i];
					m_FileList.push_back( fl );
					m_FileListNum++;
					bFind = ::FindNextFile( hFind, &fdat );
				}
				pExt++;
			}
		}
	}

	m_SelectPos = NULL;
}

DLGMSG	CLauncherDlg::OnInitDialog( DLGMSGPARAM )
{
//	DEBUGOUT( "CLauncherDlg::OnInitDialog\n" );
	// 僗僥乕僞僗僶乕偺捛壛
	HWND	hWndCtrl = ::CreateStatusWindow( WS_CHILD|WS_VISIBLE|CCS_BOTTOM|SBARS_SIZEGRIP,
						"", m_hWnd, IDC_LCH_STATUS );
	if( !hWndCtrl ) {
		bResult = FALSE;
		return	TRUE;
	}
	::SendMessage( hWndCtrl, SB_SETTEXT, SBT_NOBORDERS, (LPARAM)"" );

	// 儕僗僩價儏乕偺僗僞僀儖摍偺愝掕
	hWndCtrl = ::GetDlgItem( m_hWnd, IDC_LCH_LIST );
	ListView_SetExtendedListViewStyle( hWndCtrl, LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP );
	ListView_SetItemCount( hWndCtrl, 2000 );

	// 僀儊乕僕儕僗僩偺嶌惉
	m_hImageList = ImageList_LoadBitmap(
		CApp::GetInstance(), MAKEINTRESOURCE(IDB_LAUNCHERIMAGELIST),
		16, 6, RGB(255,0,255) );

	// 僀儊乕僕儕僗僩傪儕僗僩價儏乕偵妱傝摉偰
	ListView_SetImageList( hWndCtrl, m_hImageList, LVSIL_STATE );

	// 僜乕僩梡僀儊乕僕儕僗僩
	m_hImageListHdr = ImageList_Create( 16, 16, ILC_COLORDDB|ILC_MASK, 2, 2 );
	ImageList_AddIcon( m_hImageListHdr, CApp::LoadIcon(IDI_SORT_DOWN) );
	ImageList_AddIcon( m_hImageListHdr, CApp::LoadIcon(IDI_SORT_UP) );

	// 僀儊乕僕儕僗僩傪僿僢僟偵妱傝摉偰
	Header_SetImageList( ListView_GetHeader( hWndCtrl ), m_hImageListHdr );

	// 僂僀儞僪僂埵抲/僒僀僘偺愝掕
	RECT	rc = Config.launcher.rcWindowPos;
	if( (rc.right-rc.left) && (rc.bottom-rc.top) ) {
		::SetWindowPos( m_hWnd, NULL, rc.left, rc.top, RCWIDTH(rc), RCHEIGHT(rc), SWP_NOZORDER );
	}

	// 儕僗僩價儏乕偺僿僢僟崁栚偺愝掕
	ResetListViewHeader();

	m_bUpdating = FALSE;
	m_nTimerID = 0;
	m_nUpdateIndex = 0;

	m_SelectPos = 0;

//	m_nSortType = COLUMN_FILENAME;
//	m_bSortDir  = FALSE;

	// 儔儞僠儍乕儕僗僩僫儞僶乕
	m_nListSelect = Config.launcher.nListSelect;

	// 僼傽僀儖儕僗僩悢
	m_FileListNum = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -