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

📄 tlistview.cpp

📁 mpq文件的格式就是一种压缩格式
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
/* TListView.cpp                          Copyright (c) Ladislav Zezula 2003 */
/*---------------------------------------------------------------------------*/
/* Implementation of the TListView class                                     */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 03.04.03  1.00  Lad  The first version of TListView.cpp                   */
/*****************************************************************************/

#include "stdafx.h"
#include "TMainFrm.h"
#include "TListView.h"
#include "TTreeView.h"
#include "StormHelp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//-----------------------------------------------------------------------------
// Local functions

int CALLBACK TListView::CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)
{
    TListView * pListView = (TListView *)lParam;

    if(pListView != NULL)
        return pListView->CompareItems(lParam1, lParam2);
    return 0;
}

//-----------------------------------------------------------------------------
// TListView

IMPLEMENT_DYNCREATE(TListView, CListView);

BEGIN_MESSAGE_MAP(TListView, CListView)
	//{{AFX_MSG_MAP(TListView)
	ON_WM_CREATE()
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblClick)
	ON_WM_CONTEXTMENU()
	ON_NOTIFY_REFLECT(LVN_BEGINLABELEDIT, OnBeginLabelEdit)
	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_WM_CHAR()
	ON_WM_KEYDOWN()
	ON_WM_DROPFILES()
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
	ON_NOTIFY_REFLECT(LVN_BEGINDRAG, OnBeginDrag)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

//-----------------------------------------------------------------------------
// Constructor and destructor

TListView::TListView()
{
    SHFILEINFO sfi;

    // Retrieve handle to the system image list
    ZeroMemory(&sfi, sizeof(SHFILEINFO));
    m_hImlNormal = (HIMAGELIST)SHGetFileInfo("a.txt", FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
    m_hImlSmall  = (HIMAGELIST)SHGetFileInfo("a.txt", FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    m_hCurrent   = NULL;
    m_uSortColumn = 0;
    m_bAscending  = TRUE;
}

TListView::~TListView()
{}

//-----------------------------------------------------------------------------
// Public functions

void TListView::SetLinkPointers(TMainFrame * pMainFrame, TTreeView * pTreeView)
{
    m_pMainFrame = pMainFrame;
    m_pTreeView  = pTreeView;
}

int TListView::CompareItems(LPARAM lParam1, LPARAM lParam2)
{
    char * szExt1 = NULL;
    char * szExt2 = NULL;
    int nResult = 0;

    // If comparing two directories, compare them by name
    if((lParam1 & 0x80000000) == 0 && (lParam2 & 0x80000000) == 0)
    {
        char szText1[MAX_PATH] = "";
        char szText2[MAX_PATH] = "";

        m_pTreeView->GetItemData((HTREEITEM)lParam1, szText1, sizeof(szText1));
        m_pTreeView->GetItemData((HTREEITEM)lParam2, szText2, sizeof(szText2));
        nResult = stricmp(szText1, szText2);

        // If descending, reverse the result
        if(m_bAscending == FALSE)
            nResult = -nResult;
        return nResult;
    }

    // If comparing directory, the directory is always first
    if((lParam1 & 0x80000000) == 0 && (lParam2 & 0x80000000) != 0)
        return -1;

    // If comparing file and directory, the directory is always first
    if((lParam1 & 0x80000000) != 0 && (lParam2 & 0x80000000) == 0)
        return 1;

    // If comparing two files, compare by the sort column
    TFileInfo * pInfo1 = (TFileInfo *)(lParam1 & 0x7FFFFFFF);
    TFileInfo * pInfo2 = (TFileInfo *)(lParam2 & 0x7FFFFFFF);
    szExt1 = strrchr(pInfo1->szPlainName, '.');
    szExt2 = strrchr(pInfo2->szPlainName, '.');

    switch(m_uSortColumn)
    {
        case 0:
            nResult = stricmp(pInfo1->szPlainName, pInfo2->szPlainName);
            break;
        
        case 1:
            if(szExt1 != NULL && szExt2 != NULL)
                nResult = stricmp(szExt1, szExt2);
            break;

        case 2:
            if(pInfo1->lcLocale != pInfo2->lcLocale)
                nResult = (pInfo1->lcLocale < pInfo2->lcLocale) ? -1 : 1;
            break;

        case 3:
            if(pInfo1->dwFileSize != pInfo2->dwFileSize)
                nResult = (pInfo1->dwFileSize < pInfo2->dwFileSize) ? -1 : 1;
            break;

    }

    // If the result is still fifty-fifty, continue comparing
    if(nResult == 0)
        nResult = stricmp(pInfo1->szPlainName, pInfo2->szPlainName);
    if(nResult == 0 && szExt1 != NULL && szExt2 != NULL)
        nResult = stricmp(szExt1, szExt2);
    if(nResult == 0 && pInfo1->dwFileSize != pInfo2->dwFileSize)
        nResult = (pInfo1->dwFileSize < pInfo2->dwFileSize) ? -1 : 1;

    // If descending, reverse the result
    if(m_bAscending == FALSE)
        nResult = -nResult;
    return nResult;
}

void TListView::LoadListView(HTREEITEM hItem)
{
    SHFILEINFO sfi;
    CPtrList * pFileList = NULL;
    HTREEITEM hSubItem;
    LVITEM lvitem;
    LPARAM ClickPoint;
    RECT RectHeader;
    HWND hTreeView = m_pTreeView->GetHwnd();
    UINT nIconIndex = (UINT)-1;
    UINT nItemIndex = 0;
    UINT nInsertedIndex = 0;

    // Disable redrawing and removeall items
    SendMessage(WM_SETREDRAW, FALSE, 0);
    ListView_DeleteAllItems(m_hListView);
    m_hCurrent = hItem;

    // Fill the subdirectories
    if(hItem != NULL)
    {
        char szText[MAX_PATH] = "";

        SHGetFileInfo("A", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
        nIconIndex = sfi.iIcon;
        pFileList = m_pTreeView->GetItemData(hItem);

        // Walk through all subitems and add them as directories
        hSubItem = TreeView_GetNextItem(hTreeView, hItem, TVGN_CHILD);
        while(hSubItem != NULL)
        {
            // Retrieve the data of the tree view item
            m_pTreeView->GetItemData(hSubItem, szText, sizeof(szText));

            ZeroMemory(&lvitem, sizeof(LV_ITEM));
            lvitem.mask     = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
            lvitem.iItem    = nItemIndex++;
            lvitem.pszText  = szText;
            lvitem.iImage   = nIconIndex;
            lvitem.lParam   = (LPARAM)hSubItem;
            nInsertedIndex  = ListView_InsertItem(m_hListView, &lvitem);
            ListView_SetItemText(m_hListView, nInsertedIndex, 1, sfi.szTypeName);
            ListView_SetItemText(m_hListView, nInsertedIndex, 3, "<DIR>");
            ListView_SetItemText(m_hListView, nInsertedIndex, 4, "--");

            hSubItem = TreeView_GetNextItem(hTreeView, hSubItem, TVGN_NEXT);
        }
    }

    // Now fill the files
    if(pFileList != NULL)
    {
        POSITION pos = pFileList->GetHeadPosition();
        while(pos != NULL)
        {
            TFileInfo * pInfo = (TFileInfo *)pFileList->GetNext(pos);
            char szItemText[128] = "";

            // If the file was deleted, don't show it
            if(pInfo->bDeleted)
                continue;

            // Retrieve file type
            SHGetFileInfo(pInfo->szPlainName, FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME);
            GetBlizzardFileTypeName(pInfo->szPlainName, sfi);
            nIconIndex = sfi.iIcon;

            // File name
            ZeroMemory(&lvitem, sizeof(LV_ITEM));
            lvitem.mask     = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
            lvitem.iItem    = nItemIndex++;
            lvitem.pszText  = pInfo->szPlainName;
            lvitem.iImage   = nIconIndex;
            lvitem.lParam   = (LPARAM)pInfo | 0x80000000;
            nInsertedIndex  = ListView_InsertItem(m_hListView, &lvitem);

            // File type
            ListView_SetItemText(m_hListView, nInsertedIndex, 1, sfi.szTypeName);
            
            // File locale
            if(pInfo->lcLocale != LANG_NEUTRAL)
                GetLocaleInfo(pInfo->lcLocale, LOCALE_SLANGUAGE, szItemText, sizeof(szItemText)-1);
            else
                LoadString(AfxGetResourceHandle(), IDS_NEUTRAL, szItemText, sizeof(szItemText)-1);

⌨️ 快捷键说明

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