// UnPackToolDlg.cpp : ±¸Çö ÆÄÀÏ // #include "stdafx.h" #include "UnPackTool.h" #include "UnPackToolDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CUnPackToolDlg ´ëÈ­ »óÀÚ CUnPackToolDlg::CUnPackToolDlg(CWnd* pParent /*=NULL*/) : CDialog(CUnPackToolDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1); //mStatus = NULL; mpPackFile = NULL; mSortColumn = -1; mIsAsc = true; } void CUnPackToolDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_PACK_LIST, mPackList); DDX_Control(pDX, IDC_FILE_LIST, mFileList); } BEGIN_MESSAGE_MAP(CUnPackToolDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_DESTROY() ON_BN_CLICKED(IDC_FILE_OPEN, &CUnPackToolDlg::OnFileOpen) ON_BN_CLICKED(IDC_EXTRACT, &CUnPackToolDlg::OnExtract) ON_NOTIFY(NM_CLICK, IDC_PACK_LIST, &CUnPackToolDlg::OnSelectPack) ON_WM_MEASUREITEM() ON_BN_CLICKED(IDC_CLOSE, &CUnPackToolDlg::OnClose) ON_NOTIFY(LVN_KEYDOWN, IDC_PACK_LIST, &CUnPackToolDlg::OnKeyDownFromPackList) ON_NOTIFY(LVN_COLUMNCLICK, IDC_FILE_LIST, &CUnPackToolDlg::OnOrderFileList) ON_NOTIFY(NM_DBLCLK, IDC_PACK_LIST, &CUnPackToolDlg::OnViewExtFile) ON_WM_DROPFILES() END_MESSAGE_MAP() // CUnPackToolDlg ¸Þ½ÃÁö 󸮱â BOOL CUnPackToolDlg::OnInitDialog() { CDialog::OnInitDialog(); // ÀÌ ´ëÈ­ »óÀÚÀÇ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ Ã¢ÀÌ ´ëÈ­ »óÀÚ°¡ ¾Æ´Ò °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©°¡ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. SetIcon(m_hIcon, TRUE); // Å« ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. SetIcon(m_hIcon, FALSE); // ÀÛÀº ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÕ´Ï´Ù. /// packList ÃʱâÈ­ mPackList.InsertColumn( 0, _T(" pack ÆÄÀÏ "), LVCFMT_CENTER ); mPackList.SetColumnWidth( 0, LVSCW_AUTOSIZE_USEHEADER ); mPackList.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES ); /// fileList ÃʱâÈ­ mFileList.InsertColumn( 0, _T(" file " ), LVCFMT_CENTER, 190 ); mFileList.InsertColumn( 1, _T(" Å©±â " ), LVCFMT_RIGHT, 50 ); mFileList.InsertColumn( 2, _T(" ¼öÁ¤ ³¯Â¥ "), LVCFMT_LEFT, 150 ); mFileList.SetExtendedStyle( LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_SUBITEMIMAGES ); int strPartDim[]= {-1, 500, -1, 600, -1 }; mStatusBar.Create( WS_CHILD | WS_VISIBLE | SBT_OWNERDRAW, CRect(0,0,0,0), this, 0 ); mStatusBar.SetParts(4, strPartDim); /// packFile class ÃʱâÈ­ mpPackFile = new cPackFile; return TRUE; // Æ÷Ä¿½º¸¦ ÄÁÆ®·Ñ¿¡ ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é TRUE¸¦ ¹ÝȯÇÕ´Ï´Ù. } // ´ëÈ­ »óÀÚ¿¡ ÃÖ¼ÒÈ­ ´ÜÃ߸¦ Ãß°¡ÇÒ °æ¿ì ¾ÆÀÌÄÜÀ» ±×¸®·Á¸é // ¾Æ·¡ Äڵ尡 ÇÊ¿äÇÕ´Ï´Ù. ¹®¼­/ºä ¸ðµ¨À» »ç¿ëÇÏ´Â MFC ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â // ÇÁ·¹ÀÓ¿öÅ©¿¡¼­ ÀÌ ÀÛ¾÷À» ÀÚµ¿À¸·Î ¼öÇàÇÕ´Ï´Ù. void CUnPackToolDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // ±×¸®±â¸¦ À§ÇÑ µð¹ÙÀ̽º ÄÁÅØ½ºÆ® SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Ŭ¶óÀÌ¾ðÆ® »ç°¢Çü¿¡¼­ ¾ÆÀÌÄÜÀ» °¡¿îµ¥¿¡ ¸ÂÃä´Ï´Ù. int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // ¾ÆÀÌÄÜÀ» ±×¸³´Ï´Ù. dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // »ç¿ëÀÚ°¡ ÃÖ¼ÒÈ­µÈ âÀ» ²ô´Â µ¿¾È¿¡ Ä¿¼­°¡ Ç¥½ÃµÇµµ·Ï ½Ã½ºÅÛ¿¡¼­ // ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. HCURSOR CUnPackToolDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CUnPackToolDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. for( int i = 0; i < mPackList.GetItemCount(); i++ ) { sPackInfo* p = (sPackInfo*)mPackList.GetItemData( i ); SAFE_DELETE( p ); } SAFE_DELETE( mpPackFile ); // for( int i = 0; i < mFileList.GetItemCount(); i++ ) // { // sFileInfo* p = (sFileInfo*)mFileList.GetItemData( i ); // SAFE_DELETE( p ); // } } void CUnPackToolDlg::OnFileOpen() { CFileDialog dlg( TRUE,"pack","*.pack", OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT | OFN_NONETWORKBUTTON, "pack ÆÄÀÏ (*.pack) | *.pack |" ); if( dlg.DoModal() == IDOK ) { int nItem = mPackList.GetItemCount(); POSITION pos = dlg.GetStartPosition(); while( pos ) { CString path = dlg.GetNextPathName(pos); if( FindPackList( path ) ) continue; sPackInfo* pack = new sPackInfo; /// ÆÄÀÏ °æ·Î strcpy_s( pack->path, path ); /// ÆÄÀÏ À̸§ int sPos = path.ReverseFind( '\\' ); CString fileName = path.Right( (path.GetLength() - sPos - 1) ); strcpy_s( pack->name, fileName ); mPackList.InsertItem( nItem, fileName ); mPackList.SetItemData( nItem, (DWORD_PTR)pack ); ++nItem; } } } void CUnPackToolDlg::OnExtract() { int pos = mPackList.GetSelectionMark(); if( pos < 0 ) return; sPackInfo* pack = (sPackInfo*)mPackList.GetItemData( pos ); if( pack ) { cExtractDlg extDlg; extDlg.Init( mpPackFile, pack->path ); if( extDlg.DoModal() ) { } } } void CUnPackToolDlg::OnSelectPack(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. *pResult = 0; int pos = mPackList.GetSelectionMark(); if( pos < 0 ) return; /* sPackInfo* pack = (sPackInfo*)mPackList.GetItemData( pos ); /// »óŹٿ¡ .packÆÄÀÏ Á¤º¸ Ç¥½Ã SetStatusBar( pack->path ); */ } void CUnPackToolDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù. if( nIDCtl == IDC_PACK_LIST || nIDCtl == IDC_FILE_LIST ) { lpMeasureItemStruct->itemHeight = 15; } //CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } void CUnPackToolDlg::SetStatusBar(const TCHAR* path) { CFileStatus status; if( CFile::GetStatus( path, status ) ) { CString msg; msg.Format("¾ÐÃàµÈ ÆÄÀÏ:%d°³ ¼öÁ¤ÇÑ ³¯Â¥:%d³â%d¿ù%dÀÏ %d½Ã%dºÐ", mFileList.GetItemCount() , status.m_mtime.GetYear(), status.m_mtime.GetMonth(), status.m_mtime.GetDay(), status.m_mtime.GetHour(), status.m_mtime.GetMinute() ); mStatusBar.SetText( msg, 0, SB_SETTEXT); //mStatusBar.SetText( "111", 2, SB_SETTEXT); } } void CUnPackToolDlg::OnClose() { PostMessage( WM_CLOSE ); } void CUnPackToolDlg::OnKeyDownFromPackList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast(pNMHDR); // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. *pResult = 0; if( pLVKeyDow->wVKey == VK_DELETE ) { int pos = mPackList.GetSelectionMark(); sPackInfo* p = (sPackInfo*)mPackList.GetItemData( pos ); SAFE_DELETE( p ); mPackList.DeleteItem( pos ); // for( int i = 0; i < mFileList.GetItemCount(); i++ ) // { // sFileInfo* p = (sFileInfo*)mFileList.GetItemData( i ); // SAFE_DELETE( p ); // } mFileList.DeleteAllItems(); } } bool CUnPackToolDlg::FindPackList(const TCHAR* path) { for( int i = 0; i < mPackList.GetItemCount(); i++ ) { sPackInfo* p = (sPackInfo*)mPackList.GetItemData( i ); if( p ) { if( strcmp( p->path, path ) == 0 ) return true; } } return false; } void CUnPackToolDlg::OnOrderFileList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. *pResult = 0; int column = pNMLV->iSubItem; if( column == mSortColumn ) mIsAsc = !mIsAsc; else mIsAsc = TRUE; mSortColumn = column; int itemCnt = mFileList.GetItemCount(); CString** pStr = new CString*[itemCnt]; for( int i = 0; i < itemCnt; i++ ) { pStr[i] = new CString( mFileList.GetItemText(i, column) ); mFileList.SetItemData( i, (DWORD_PTR)pStr[i] ); } mFileList.SortItems( CompareFunc, (LPARAM)mIsAsc ); for( int i = 0; i < itemCnt; i++ ) if( pStr[i] ) delete pStr[i]; delete []pStr; } static int CALLBACK CompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParam3 ) { CString* str1 = (CString*)lParam1; CString* str2 = (CString*)lParam2; BOOL IsAsc = (BOOL)lParam3; if( !str1 || !str2 ) return 0; int ret = strcmp( *str1, *str2 ); if( IsAsc ) return ret; else return -ret; } void CUnPackToolDlg::OnViewExtFile(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: ¿©±â¿¡ ÄÁÆ®·Ñ ¾Ë¸² 󸮱â Äڵ带 Ãß°¡ÇÕ´Ï´Ù. *pResult = 0; int pos = mPackList.GetSelectionMark(); if( pos < 0 ) return; sPackInfo* pack = (sPackInfo*)mPackList.GetItemData( pos ); /// ¾ÐÃàµÈ file list mpPackFile->View( pack->path ); /// È­¸é Ãâ·Â mFileList.DeleteAllItems(); TCHAR fsize[52] = {0,}; TCHAR ftime[52] = {0,}; for( unsigned int i = 0; i < mpPackFile->GetFileCount(); i++ ) { /// ÆÄÀÏ Å©±â WORD byteSize = mpPackFile->GetFileSize( i ); WORD kbSize = ((double)byteSize / 1024) + 1; sprintf_s( fsize, "%dKB", kbSize ); /// ¼öÁ¤ÇÑ ³¯Â¥ cFileTime mWriteTime = mpPackFile->GetFileUpdateTime( i ); FILETIME fileTime = mWriteTime.GetFileTime( ); FILETIME localTime; SYSTEMTIME utc; SYSTEMTIME utc2; SystemTimeToFileTime( &utc, &fileTime ); FileTimeToLocalFileTime( &fileTime, &localTime ); FileTimeToSystemTime( &localTime, &utc2 ); int hour = utc2.wHour - 12; if( hour <= 0 ) hour = utc2.wHour; sprintf_s( ftime, "%4d-%02d-%02d %s %02d:%02d", utc2.wYear, utc2.wMonth, utc2.wDay, ((utc2.wHour - 12) > 0 ) ? "¿ÀÈÄ" : "¿ÀÀü", hour, utc2.wMinute ); mFileList.InsertItem( i, (LPCTSTR)mpPackFile->GetFileName( i ) ); mFileList.SetItemText( i, 1, (LPCTSTR)fsize ); mFileList.SetItemText( i, 2, (LPCTSTR)ftime ); } /// »óŹٿ¡ .packÆÄÀÏ Á¤º¸ Ç¥½Ã SetStatusBar( pack->path ); } void CUnPackToolDlg::OnDropFiles(HDROP hDropInfo) { // TODO: ¿©±â¿¡ ¸Þ½ÃÁö 󸮱â Äڵ带 Ãß°¡ ¹×/¶Ç´Â ±âº»°ªÀ» È£ÃâÇÕ´Ï´Ù. char file[_MAX_PATH] = {0,}; UINT count = DragQueryFile( hDropInfo, 0xFFFFFFFF, NULL, 0 ); int nItem = mPackList.GetItemCount(); for( UINT i = 0; i < count; i++ ) { DragQueryFile( hDropInfo, i, file, _MAX_PATH ); CString path( file ); if( FindPackList( path ) ) continue; sPackInfo* pack = new sPackInfo; /// ÆÄÀÏ °æ·Î strcpy_s( pack->path, path ); /// ÆÄÀÏ À̸§ int sPos = path.ReverseFind( '\\' ); CString fileName = path.Right( (path.GetLength() - sPos - 1) ); strcpy_s( pack->name, fileName ); mPackList.InsertItem( nItem, fileName ); mPackList.SetItemData( nItem, (DWORD_PTR)pack ); ++nItem; } ::DragFinish( hDropInfo ); // CDialog::OnDropFiles(hDropInfo); }