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

📄 mpqwindow.cpp

📁 骨骼动画....把魔兽模型解出的代码..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "MpqWindow.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
MPQ_WINDOW MpqWindow;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
MPQ_WINDOW::MPQ_WINDOW()
{
	CurrentlySelectedFile = NULL;
	CurrentlySelectedPopupFile = NULL;

	MpqLoaded = FALSE;
	MpqFileName = "";
}


//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
MPQ_WINDOW::~MPQ_WINDOW()
{
	//Empty
}


//+-----------------------------------------------------------------------------
//| Creates a new window
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::Create()
{
	WINDOW_TREEVIEW_INFO TreeviewInfo;

	FrameInfo.Title = "MPQ Browser";
	FrameInfo.Width = DEFAULT_MPQ_WINDOW_WIDTH;
	FrameInfo.Height = DEFAULT_MPQ_WINDOW_HEIGHT;
	FrameInfo.Menu = ::LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MpqMenu));
	FrameInfo.Style &= (~WS_VISIBLE);
	FrameInfo.Style |= (WS_MAXIMIZEBOX | WS_SIZEBOX);

	if(!WINDOW_FRAME::Create()) return FALSE;

	TreeviewInfo.Parent = Window;

	if(!TreeView.Create(TreeviewInfo)) return FALSE;
	
	Icon.AssignIconListToTreeView(TreeView.GetWindow());
	if(!Filter.AddFilterItemsToMenu(GetMenu())) return FALSE;
	Filter.UpdateFilterMenu(GetMenu());

	RootNode.FilterData.FilterList.resize(Filter.GetNrOfFilters(), FALSE);

	if(!OpenAllMpqArchives()) return FALSE;

	ResizeTreeView();
	UpdateWindowStatus();

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Destroys the window
//+-----------------------------------------------------------------------------
VOID MPQ_WINDOW::Destroy()
{
	Mpq.Close();
	CloseAllMpqArchives();

	TreeView.Destroy();

	WINDOW_FRAME::Destroy();
}


//+-----------------------------------------------------------------------------
//| Handles the window messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::MessageHandler(UINT Message, WPARAM W, LPARAM L)
{
	switch(Message)
	{
		case WM_SIZE:
		case WM_SIZING:
		{
			ResizeTreeView();
			return 0;
		}

		case WM_CLOSE:
		{
			Hide();
			return 0;
		}

		case WM_DESTROY:
		{
			return 0;
		}
	}

	return DefWindowProc(Window, Message, W, L);
}


//+-----------------------------------------------------------------------------
//| Handles the window menu messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::MenuHandler(WORD MenuItem)
{
	switch(MenuItem)
	{
		case MpqFileOpen:
		{
			if(!OpenMpq())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFileClose:
		{
			if(!CloseMpq())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFileWar3Mpq:
		{
			if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFileWar3xMpq:
		{
			if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3X))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFileWar3xLocalMpq:
		{
			if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3X_LOCAL))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFileWar3PatchMpq:
		{
			if(!OpenMpqByName(Register.GetWarcraftDirectory() + "\\" + PATH_MPQ_WAR3_PATCH))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqFiltersOther:
		{
			Filter.SelectOther();
			Filter.UpdateFilterMenu(GetMenu());
			UpdateTreeView();
			return 0;
		}

		case MpqFiltersAll:
		{
			Filter.SelectAll();
			Filter.UpdateFilterMenu(GetMenu());
			UpdateTreeView();
			return 0;
		}

		case MpqFiltersNone:
		{
			Filter.SelectNone();
			Filter.UpdateFilterMenu(GetMenu());
			UpdateTreeView();
			return 0;
		}

		case MpqPopupOpen:
		case MpqPopupOpen2:
		{
			if(CurrentlySelectedPopupFile == NULL) return 0;
			if(!OpenMpqFile(CurrentlySelectedPopupFile->FileNameAndPath))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqPopupExport:
		case MpqPopupExport2:
		{
			std::string FileName;
			WINDOW_FILE_DIALOG FileDialog;

			if(CurrentlySelectedPopupFile == NULL) return 0;

			FileDialog.SetTitle("Export File");
			FileDialog.SetFilter(FILTER_ALL);
			
			FileName = CurrentlySelectedPopupFile->FileName;
			if(!FileDialog.SaveFile(Window, FileName)) return 0;

			if(!ExportMpqFile(CurrentlySelectedPopupFile->FileNameAndPath, FileName))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqPopupCopyPath:
		case MpqPopupCopyPath2:
		{
			if(CurrentlySelectedPopupFile == NULL) return 0;

			if(!Common.SetClipboardData(CurrentlySelectedPopupFile->FileNameAndPath))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case MpqPopupUseAsTexture:
		case MpqPopupUseAsTexture2:
		{
			std::string FileName;

			if(CurrentlySelectedPopupFile == NULL) return 0;

			FileName = CurrentlySelectedPopupFile->FileNameAndPath;
			if(!TextureManagerWindow.UseTextureFromMpq(FileName))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}
	}

	if(MenuItem < Filter.GetMinMenuItemId()) return 0;
	if(MenuItem > Filter.GetMaxMenuItemId()) return 0;

	Filter.Select(MenuItem);
	Filter.UpdateFilterMenu(GetMenu());
	UpdateTreeView();

	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the window control messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::ControlHandler(HWND Control, WORD Code)
{
	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the window notify messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::NotifyHandler(HWND Control, UINT Code, NMHDR* Header)
{
	if(Control == TreeView.GetWindow())
	{
		NM_TREEVIEW* TreeViewHeader;

		TreeViewHeader = reinterpret_cast<NM_TREEVIEW*>(Header);
		if(TreeViewHeader == NULL) return 0;

		return TreeViewHandler(Code, TreeViewHeader);
	}

	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the treeview messages
//+-----------------------------------------------------------------------------
LRESULT MPQ_WINDOW::TreeViewHandler(UINT Code, NM_TREEVIEW* TreeViewHeader)
{
	TVITEM ItemData;
	POINT MousePosition;
	POINT LocalMousePosition;
	TVHITTESTINFO HitTestInfo;

	GetCursorPos(&MousePosition);
	LocalMousePosition = MousePosition;
	ScreenToClient(TreeView.GetWindow(), &LocalMousePosition);

	switch(Code)
	{
		case NM_DBLCLK:
		{
			if(CurrentlySelectedFile == NULL) return 0;
			if(CurrentlySelectedFile->IsFolder) return 0;

			ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
			HitTestInfo.pt = LocalMousePosition;
			if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
			if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;

			if(!OpenMpqFile(CurrentlySelectedFile->FileNameAndPath))
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NM_RCLICK:
		{
			INT MenuId;
			std::string FileName;
			HTREEITEM TreeViewItem;

			ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
			HitTestInfo.pt = LocalMousePosition;
			if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
			if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;

			TreeViewItem = HitTestInfo.hItem;
			if(TreeViewItem == NULL) return 0;

			ZeroMemory(&ItemData, sizeof(TVITEM));
			ItemData.mask = TVIF_PARAM;
			ItemData.hItem = TreeViewItem;
			if(!TreeView_GetItem(TreeView.GetWindow(), &ItemData)) return 0;

			CurrentlySelectedPopupFile = reinterpret_cast<FILE_NODE*>(ItemData.lParam);
			if(CurrentlySelectedPopupFile == NULL) return 0;

			if(CurrentlySelectedPopupFile->IsFolder) return 0;

			FileName = CurrentlySelectedPopupFile->FileName;
			MenuId = (MainWindow.ModelIsLoaded() && ResourceLoader.IsTextureExtention(Common.GetExtention(FileName))) ? MpqPopupMenu : MpqPopupMenu2;
			if(!TrackPopupMenuEx(GetSubMenu(LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MenuId)), 0),
								 TPM_LEFTALIGN | TPM_RIGHTBUTTON, MousePosition.x, MousePosition.y,
								 Window, NULL))
			{
				Error.SetMessage("Unable to create popup menu!");
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case TVN_SELCHANGED:
		{
			CurrentlySelectedFile = reinterpret_cast<FILE_NODE*>(TreeViewHeader->itemNew.lParam);
			if(CurrentlySelectedFile == NULL) return 0;

			return 0;
		}
	}

	return 0;
}


//+-----------------------------------------------------------------------------
//| Opens all MPQ archives
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenAllMpqArchives()
{
	BOOL Result = FALSE;
	std::string FileName;
	std::string ErrorMessage;
	std::string WarcraftDirectory;

	WarcraftDirectory = Register.GetWarcraftDirectory();

	while(TRUE)
	{
		FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3;
		if(!MpqWar3.Open(FileName)) break;

		FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3X;
		if(!MpqWar3x.Open(FileName)) break;

		FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3X_LOCAL;
		if(!MpqWar3xLocal.Open(FileName)) break;

		FileName = WarcraftDirectory + "\\" + PATH_MPQ_WAR3_PATCH;
		if(!MpqWar3Patch.Open(FileName)) break;

		Result = TRUE;
		break;
	}

	if(!Result)
	{
		ErrorMessage = "Unable to open \"" + FileName + "\"!\n\n";
		ErrorMessage += "Make sure that Warcraft 3 is installed and that the registry key\n";
		ErrorMessage += "\"HKEY_CURRENT_USER\\Blizzard Entertainment\\Warcraft III\\InstallPath\" exists!";
		Error.SetMessage(ErrorMessage);
		return FALSE;
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Closes all MPQ archives
//+-----------------------------------------------------------------------------
VOID MPQ_WINDOW::CloseAllMpqArchives()
{
	MpqWar3.Close();
	MpqWar3x.Close();
	MpqWar3xLocal.Close();
	MpqWar3Patch.Close();
}


//+-----------------------------------------------------------------------------
//| Checks if an extention is an mpq archive extention
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::IsMpqExtention(CONST std::string& Extention)
{
	if(Extention == "mpq") return TRUE;
	if(Extention == "w3m") return TRUE;
	if(Extention == "w3x") return TRUE;
	if(Extention == "w3n") return TRUE;

	return FALSE;
}


//+-----------------------------------------------------------------------------
//| Opens an mpq archive by name
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenMpqByName(CONST std::string& FileName)
{
	CloseMpq();

	if(!Mpq.Open(FileName)) return FALSE;
	if(!LoadListFile(FileName)) return FALSE;

	MpqLoaded = TRUE;
	MpqFileName = FileName;

	UpdateTreeView();
	UpdateWindowStatus();

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Opens an mpq archive
//+-----------------------------------------------------------------------------
BOOL MPQ_WINDOW::OpenMpq()
{
	std::string FileName;
	WINDOW_FILE_DIALOG FileDialog;

	FileDialog.SetTitle("Open MPQ Archive");
	FileDialog.SetFilter(FILTER_MPQ);
	if(!FileDialog.OpenFile(Window, FileName)) return TRUE;

	if(!OpenMpqByName(FileName)) return FALSE;

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Closes the mpq archive

⌨️ 快捷键说明

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