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

📄 tlistview.cpp

📁 mpq文件的格式就是一种压缩格式
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            ListView_SetItemText(m_hListView, nInsertedIndex, 2, szItemText);

            // File size
            sprintf(szItemText, "%u", pInfo->dwFileSize);
            ListView_SetItemText(m_hListView, nInsertedIndex, 3, szItemText);
            
            // File attributes
            szItemText[0] = szItemText[1] = '-';
            szItemText[2] = 0;
            if(pInfo->dwAttributes & MPQ_FILE_COMPRESSED)
                szItemText[0] = 'C';
            if(pInfo->dwAttributes & MPQ_FILE_ENCRYPTED)
                szItemText[1] = 'E';
            ListView_SetItemText(m_hListView, nInsertedIndex, 4, szItemText);
        }
    }

    // Enable the redraw and repaint
    ListView_SortItems(m_hListView, CompareFunc, this);
    SendMessage(WM_SETREDRAW, TRUE, 0);
    ::InvalidateRect(m_hListView, NULL, TRUE);

    // Select the first item
    if(::GetFocus() == m_hWnd)
    {
        ::GetWindowRect(ListView_GetHeader(m_hListView), &RectHeader);
        ClickPoint = MAKELPARAM(2, RectHeader.bottom - RectHeader.top + 2);
        ::PostMessage(m_hListView, WM_LBUTTONDOWN, MK_LBUTTON, ClickPoint);
        ::PostMessage(m_hListView, WM_LBUTTONUP, MK_LBUTTON, ClickPoint);
    }
}

TFileInfo * TListView::GetItemData(UINT nItem, HTREEITEM * phItem, char * szText, int nMaxChars)
{
    TFileInfo * pInfo = NULL;
    HTREEITEM hItem = NULL;
    LVITEM lvitem;

    // Prepare the list view item
    ZeroMemory(&lvitem, sizeof(LVITEM));
    lvitem.mask      = LVIF_PARAM;
    lvitem.iItem     = nItem;
    if(szText != NULL)
    {
        lvitem.mask |= LVIF_TEXT;
        lvitem.pszText = szText;
        lvitem.cchTextMax = nMaxChars - 1;
    }

    // Retrieve the item and return the item data
    ListView_GetItem(m_hListView, &lvitem);

    // If masked with the upper bit, it is a file info, otherwise
    // it it a tree view handle
    if(lvitem.lParam & 0x80000000)
        pInfo = (TFileInfo *)(lvitem.lParam & 0x7FFFFFFF);
    else
        hItem = (HTREEITEM)lvitem.lParam;

    if(phItem != NULL)
        *phItem = hItem;
    return pInfo;
}


//-----------------------------------------------------------------------------
// TListView message handlers

BOOL TListView::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.style |= LVS_REPORT | LVS_EDITLABELS | LVS_SHAREIMAGELISTS;
	return CListView::PreCreateWindow(cs);
}

#define COL_TYPE_WIDTH    150
#define COL_LOCALE_WIDTH  140
#define COL_SIZE_WIDTH     60
#define COL_ATTR_WIDTH     60

int TListView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    CListCtrl & ListCtrl = GetListCtrl();
    DWORD dwWidth;
    char szText[64];

    __try
    {
        if (CListView::OnCreate(lpCreateStruct) == -1)
		    return -1;

        // Remember the window handle
        ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT);
        m_hListView = ListCtrl.m_hWnd;
    
        // Set the image list to the list view
        ListCtrl.SetImageList(CImageList::FromHandle(m_hImlNormal), LVSIL_NORMAL);
        ListCtrl.SetImageList(CImageList::FromHandle(m_hImlSmall),  LVSIL_SMALL);

        // Set the columns
        dwWidth = GetSystemMetrics(SM_CXSCREEN) - GetSystemMetrics(SM_CXVSCROLL) - 270 - COL_TYPE_WIDTH - COL_LOCALE_WIDTH - COL_SIZE_WIDTH - COL_ATTR_WIDTH;
        LoadString(AfxGetResourceHandle(), IDS_FILE_NAME, szText, sizeof(szText)-1);
        ListCtrl.InsertColumn(0, szText, LVCFMT_LEFT, dwWidth, 0);

        LoadString(AfxGetResourceHandle(), IDS_TYPE, szText, sizeof(szText)-1);
        ListCtrl.InsertColumn(1, szText, LVCFMT_LEFT, COL_TYPE_WIDTH, 1);

        LoadString(AfxGetResourceHandle(), IDS_LOCALE, szText, sizeof(szText)-1);
        ListCtrl.InsertColumn(2, szText, LVCFMT_LEFT, COL_LOCALE_WIDTH, 1);

        LoadString(AfxGetResourceHandle(), IDS_SIZE, szText, sizeof(szText)-1);
        ListCtrl.InsertColumn(3, szText, LVCFMT_LEFT, COL_SIZE_WIDTH, 2);

        LoadString(AfxGetResourceHandle(), IDS_ATTR, szText, sizeof(szText)-1);
        ListCtrl.InsertColumn(4, szText, LVCFMT_LEFT, COL_ATTR_WIDTH, 3);

        // Allow file dropping
        ListCtrl.DragAcceptFiles(TRUE);

        // Allow file dragging
        m_DropTarget.Register(this);
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {}
	return 0;
}

void TListView::OnDblClick(NMHDR *, LRESULT * pResult) 
{
    // Send the event to the parent
    GetParent()->SendMessage(WM_COMMAND, ID_OPS_OPEN, (LPARAM)m_hListView);
	*pResult = 0;
}

void TListView::OnContextMenu(CWnd *, CPoint point) 
{
    HMENU   hMenu = LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_CTXMPQLISTVIEW));
    HMENU   hSubMenu = NULL;
    HWND    hWnd = ::GetParent(m_hListView);

    hSubMenu = GetSubMenu(hMenu, 0);
    m_pMainFrame->SendMessage(WM_INITMENUPOPUP, (WPARAM)hSubMenu, 0);

    // If valid context menu
    if(hSubMenu != NULL)
    {
        SetMenuDefaultItem(hSubMenu, ID_OPS_OPEN, FALSE); 
        TrackPopupMenu(hSubMenu, (TPM_LEFTBUTTON | TPM_RIGHTBUTTON), point.x, point.y, 0, hWnd, NULL);
    }
}

void TListView::OnBeginLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

    *pResult = TRUE;
    
    // If working, do nothing
    if(!m_pMainFrame->IsIdle())
        return;

    // If directory, show error and do nothing
    if((pDispInfo->item.lParam & 0x80000000) == 0)
        AfxMessageBox(IDS_CANTDOWITHDIRS, MB_OK | MB_ICONERROR);
    else
    	*pResult = FALSE;
}                  

void TListView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    TFileInfo * pInfo = GetItemData(pDispInfo->item.iItem, NULL);

    // If the user canceled editing, do nothing
    if(pInfo != NULL && pDispInfo->item.pszText != NULL)
    {
        m_pMainFrame->RenameFile(pInfo, pDispInfo->item.pszText);
        *pResult = TRUE;
    }
    else
	    *pResult = FALSE;
}

void TListView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    // Open a file/folder
    if(nChar == 13)
        GetParent()->SendMessage(WM_COMMAND, ID_OPS_OPEN, (LPARAM)m_hListView);
    
    // Move up
    if(nChar == 8)
    {
        HTREEITEM hParent = NULL;
        HWND hTreeView = m_pTreeView->GetHwnd();

        hParent = TreeView_GetNextItem(hTreeView, m_hCurrent, TVGN_PARENT);
        if(hParent != NULL)
            TreeView_SelectItem(hTreeView, hParent);
    }
	CListView::OnChar(nChar, nRepCnt, nFlags);
}

void TListView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    // Send the delete to the parent
    if(nChar == VK_DELETE)
        GetParent()->SendMessage(WM_COMMAND, ID_OPS_REMOVE, (LPARAM)m_hListView);
	CListView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void TListView::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

    if(pNMListView->iSubItem != m_uSortColumn)
    {
        m_uSortColumn = pNMListView->iSubItem;
        m_bAscending = TRUE;
    }
    else
        m_bAscending = !m_bAscending;

    ListView_SortItems(m_hListView, CompareFunc, this);
	*pResult = 0;
}

// Implements Drag to Windows Explorer
void TListView::OnBeginDrag(NMHDR * /* pNMHDR */, LRESULT * pResult) 
{
    m_pMainFrame->DragFiles();
	*pResult = 0;
}

// Implements drop from Windows Explorer
void TListView::OnDropFiles(HDROP hDropInfo) 
{
    m_pMainFrame->AddFiles(hDropInfo);
}

⌨️ 快捷键说明

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