tmainfrm.h

来自「mpq文件的格式就是一种压缩格式」· C头文件 代码 · 共 279 行

H
279
字号
/*****************************************************************************/
/* TMainFrm.h                             Copyright (c) Ladislav Zezula 2003 */
/*---------------------------------------------------------------------------*/
/* Interface of the TMainFrame class                                         */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 03.04.03  1.00  Lad  The first version of TMainFrm.h                      */
/*****************************************************************************/

#ifndef __TMAINFRM_H__
#define __TMAINFRM_H__

//-----------------------------------------------------------------------------
// Defines

#define ESEL_NO_SELECTED     0x00000001     // Error when no items selected
#define ESEL_MORE_SELECTED   0x00000002     // Error when more items selected
#define ESEL_DIR_SELECTED    0x00000004     // Error when directory selected
#define ESEL_NAMELESS        0x00000008

//-----------------------------------------------------------------------------
// Defined work types for the worker threads

#define WORK_NONE                0
#define WORK_NEW_MPQ_ARCHIVE     1
#define WORK_LOAD_MPQ_ARCHIVE    2
#define WORK_OPEN_FILE           3
#define WORK_EXTRACT_FILES       4
#define WORK_RENAME_FILE         5
#define WORK_REMOVE_FILES        6
#define WORK_ADD_FILES           7
#define WORK_EXTRACT_LISTFILE    8
#define WORK_EXTRACT_ATTRIBUTES  9
#define WORK_EXTRACT_SIGNATURE  10
#define WORK_COMPACT_ARCHIVE    11
#define WORK_RUN_SCRIPT         12

struct TFileInfo;
struct TAddFlags;
class  TMainFrame;
class  TNameBreakerDlg;

struct TNewMpqInfo
{
    TAddFlags * pAddFlags;              // Pointer to add flags. Must NOT ne deleted !!!
    int   nAddFlags;                    // Number of add flags
    DWORD dwHashTableSize;              // Size of hash table for the archive
    DWORD nRelPathStart;                // Start of relative path
    BOOL  bOverwrite;                   // If TRUE, the existing files will be overwritten
};

struct TLoadMpqInfo
{
    char szFileList[MAX_PATH];          // Listfile name
    int  nListFile;                     // 0 - use external listfile, 1 - use internal listfile, 2 - autodetect
};

struct TOpenFileInfo
{
    TFileInfo * pInfo;
    HTREEITEM   hItem;
    BOOL        bOpenWith;
};

struct TRenameFileInfo
{
    TFileInfo * pInfo;                  // The file info to be renamed
    char szNewName[MAX_PATH];
};

struct TCompactInfo
{
    char szFileList[MAX_PATH];
};

struct TRunScriptInfo
{
    char szScript[MAX_PATH];
};

struct TWorkInfo
{
    TMainFrame * pMainFrame;            // Pointer to the main frame
    DWORD        dwWorkType;            // Work type
    CPtrList   * pFileList;             // File list
    LCID         lcLocale;              // Locale ID
    BOOL         bStop;                 // TRUE if the thread was stopped
    BOOL         bFreeList;             // If TRUE, the list entries will be freed when work ends
    BOOL         bKeepPath;
    BOOL         bOverwriteAll;         // If TRUE, 
    char szMpqName[MAX_PATH];
    char szWorkDir[MAX_PATH];

    TNewMpqInfo      New;
    TLoadMpqInfo     Load;
    TOpenFileInfo    Open;
    TRenameFileInfo  Ren;
    TCompactInfo     Cmpct;
    TRunScriptInfo   Runsc;
};

//-----------------------------------------------------------------------------
// TMainFrame class

class TListView;
class TTreeView;
class TMainFrame : public CFrameWnd
{
    public:
	TMainFrame();
	virtual ~TMainFrame();
    DECLARE_DYNAMIC(TMainFrame);

    int NewMpqArchive();
    int OpenMpqArchive(const char * szMpqArchive, const char * szFileList);
    int CloseMpqArchive();
    int ExtractSelectedFiles();
    int OpenSelectedFile(BOOL bOpenWith = FALSE);
    int RenameFile(TFileInfo * pInfo, const char * szNewFileName);
    int RenameFile();
    int RemoveFiles();
    int NewFolder();
    int AddFiles(HDROP hDropInfo);
    int DragFiles();
    int ShowProperties();
    int ExtractListFile();
    int ExtractAttributes();
    int ExtractArchive();
    int BuildArchive();
    int CompactArchive();
    int NameBreaker(const char * szMpqName, const char * szFileList, const char * szDirs = NULL, const char * szExts = NULL, int nItem = 0);
    int MergeListfiles();
    int RunMpq2000Script(const char * szScriptName);
    int Options();
    int AddFileOptions();
    
    TTreeView * GetTreeViewPane() { return m_pTreeView; }
	TListView * GetListViewPane() { return m_pListView; }
    BOOL        IsIdle();               // TRUE if MPQ Editor has no work.
    BOOL        HasDocAndIsIdle();      // TRUE if MPQ Editor has no work and a document open
    BOOL        IsItemSelAndIdle();     // TRUE is an item is selected and no work

    protected:
    // Other functions
    TWorkInfo * CreateWorkInfo(DWORD dwWorkType, const char * szMpqName = NULL, const char * szWorkDir = NULL);
    CPtrList * CreateFileList(HWND hListView);
    CPtrList * CreateFileList(CFileDialog * pDlg);
    CPtrList * CreateFileList(HDROP hDropInfo, DWORD & nRelPathStart);
    HDROP  CreateDropFiles(CPtrList * pFileList);
    int    InitFunctionTable(BOOL bUseStorm);
    void   AddFolderToList(CPtrList * pList, HTREEITEM hItem);
    void   AddFolderToList(CPtrList * pList, const char * szFolder);
    void   RemoveNonNeutralItems(CPtrList * pList);
    void   FreeWorkInfo(TWorkInfo * pWork);
    BOOL   CheckListSelection(DWORD dwFlags);
    int    AskForAddFlags();
    
    protected:
    // Worker thread functions
    static void WINAPI CompactCB(void *, DWORD dwWorkType, DWORD dwParam1, DWORD dwParam2);
    TFileInfo * CreateFileInfo(const char * szFileName, LCID lcLocale, DWORD dwFileSize, DWORD dwFileAttr);
    const char * GetFileOrdinal(const char * szFileName);
    char * SkipSpaces(const char * ch);
    void UpdateFileInfo(CPtrList * pFileList, const char * szFileName, LCID lcLocale, DWORD dwFileSize, DWORD dwFileAttr);
    BOOL GetCommandParams(char * szCmd, char * szParam1, char * szParam2);
    BOOL WorkStopped(TWorkInfo * pWork);
    int  EnableDialogBars(BOOL bEnable);
    int  ReadLine(FILE * fp, TCHAR * szBuffer, int nMaxChars);
    int  SetStatusText(UINT nIDText, ...);
    int  CreateMpqEvent(const char * szMpqName);
    int  AddFiles(HANDLE hMpq, TWorkInfo * pWork);
    int  AddFileToTree(const char * szFileName, LCID lcLocale, DWORD dwFileSize, DWORD dwFileAttr);
    int  LoadMpqArchiveST(const char * szMpqName, const char * szFileList);
    int  LoadMpqArchiveSL(const char * szMpqName, const char * szFileList);
    int  ExtractFile(TWorkInfo * pWork, HANDLE hMpq, const char * szToExtract, const char * szExtracted, LCID lcLocale, BOOL bNoShowError = FALSE);
    int  AddFileToArchive(TWorkInfo * pWork, HANDLE hMpq, char * szFileName, char * szArchName, BOOL * pbReplaced = NULL);

    // Functions for worker thread
    int    WTNewMpqArchive(TWorkInfo * pWork);
    int    WTLoadMPQArchive(TWorkInfo * pWork);
    int    WTOpenFile(TWorkInfo * pWork);
    int    WTExtractFiles(TWorkInfo * pWork);
    int    WTRenameFile(TWorkInfo * pWork);
    int    WTRemoveFiles(TWorkInfo * pWork);
    int    WTAddFiles(TWorkInfo * pWork);
    int    WTExtractSpecialFile(TWorkInfo * pWork);
    int    WTCompactArchive(TWorkInfo * pWork);
    int    WTRunMPQ2000Script(char * szScript);
    static DWORD WINAPI WorkThreadProc(VOID * pParam);
    int    StartWorkThread(TWorkInfo * pWork);

    // Function table from Storm.dll
    SFILEOPENARCHIVE    pSFileOpenArchive;
    SFILECLOSEARCHIVE   pSFileCloseArchive;
    SFILEOPENFILEEX     pSFileOpenFileEx;
    SFILECLOSEFILE      pSFileCloseFile;
    SFILEGETFILESIZE    pSFileGetFileSize;
    SFILESETFILEPOINTER pSFileSetFilePointer;
    SFILEREADFILE       pSFileReadFile;
    SFILESETLOCALE      pSFileSetLocale;

    TNameBreakerDlg * m_pNameBreaker;
    TTreeView  * m_pTreeView;           // Tree view
    TListView  * m_pListView;           // List view
    CPtrList   * m_pAddFileList;
    CSplitterWnd m_wndSplitter;
	CDialogBar   m_wndDlgBar;
	CStatusBar   m_wndStatusBar;
	CToolBar     m_wndToolBar;
	CReBar       m_wndReBar;
    CString      m_strMpqName;
    CString      m_strFileList;
    CString      m_strMask;             // Search mask for MPQ archive
    HINSTANCE    m_hStorm;              // Handle to Storm.dll
    HANDLE       m_hWorkThread;
    HANDLE       m_hStopEvent;          // Handle to stopping event
    HANDLE       m_hMpqEvent;           // For detecting open archives in another instance of MPQ Editor
    BOOL         m_bNameless;           // TRUE if we loaded the files from MPQ as nameless
    BOOL         m_bUseStormDll;        // TRUE if using Storm.dll for read access
    HBRUSH       m_hBrush;              // BG brush for script interpreter
    HWND         m_hConsole;

	//{{AFX_VIRTUAL(TMainFrame)
	public:
    virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
	virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext);
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
	//}}AFX_VIRTUAL

    protected:  // Generated message map functions
	//{{AFX_MSG(TMainFrame)
	afx_msg int  OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnClose();
    afx_msg void OnSystrayEvent(WPARAM wParam, LPARAM lParam);
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnDestroy();
    afx_msg void OnSetStatusText(WPARAM wParam, LPARAM lParam);
    afx_msg HBRUSH OnCtlColorEdit(WPARAM wParam, LPARAM lParam);
    afx_msg void OnConsoleDestroyed(WPARAM wParam, LPARAM lParam);
    afx_msg void MustBeIdle(CCmdUI* pCmdUI);
    afx_msg void MustHaveDocAndIdle(CCmdUI* pCmdUI);
    afx_msg void MustHaveItemAndIdle(CCmdUI* pCmdUI);
	afx_msg void OnFileNew();
	afx_msg void OnFileOpen();
	afx_msg void OnFileClose();
	afx_msg void OnOpsOpen();
	afx_msg void OnOpsOpenWith();
	afx_msg void OnOpsExtract();
	afx_msg void OnOpsRename();
	afx_msg void OnOpsRemove();
	afx_msg void OnOpsGetListFile();
	afx_msg void OnOpsNewFolder();
	afx_msg void OnOpsAddFiles();
	afx_msg void OnOpsProperties();
	afx_msg void OnOpsExtractArchive();
	afx_msg void OnOpsGetAttributes();
	afx_msg void OnOpsBuildArchive();
	afx_msg void OnOpsCompactArchive();
	afx_msg void OnToolsNameBreaker();
	afx_msg void OnToolsMergeListfiles();
	afx_msg void OnToolsMpq2000Script();
	afx_msg void OnToolsOptions();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnDropFiles(HDROP hDropInfo);
	afx_msg void OnToolsAddFileOptions();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnToolsScriptConsole();
    afx_msg void OnWorkComplete(WPARAM wParam, LPARAM lParam);
	//}}AFX_MSG
	afx_msg void OnUpdateViewStyles(CCmdUI* pCmdUI);
	afx_msg void OnViewStyle(UINT nCommandID);
	DECLARE_MESSAGE_MAP()

    friend class TDataSource;
};

#endif // __TMAINFRM_H__

⌨️ 快捷键说明

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