📄 launcherdlg.cpp
字号:
}
// 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 + -