windoweventobjectdialog.cpp

来自「骨骼动画....把魔兽模型解出的代码..」· C++ 代码 · 共 871 行 · 第 1/2 页

CPP
871
字号
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "WindowEventObjectDialog.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
WINDOW_EVENT_OBJECT_DIALOG EventObjectDialog;


//+-----------------------------------------------------------------------------
//| Static member variables
//+-----------------------------------------------------------------------------
MODEL_EVENT_OBJECT_DATA WINDOW_EVENT_OBJECT_DIALOG::StaticData;
MODEL_GLOBAL_SEQUENCE* WINDOW_EVENT_OBJECT_DIALOG::StaticGlobalSequence;
std::string WINDOW_EVENT_OBJECT_DIALOG::StaticNameType;
std::string WINDOW_EVENT_OBJECT_DIALOG::StaticNameIdentifier;
std::string WINDOW_EVENT_OBJECT_DIALOG::StaticNameData;
std::map<std::string, std::string> WINDOW_EVENT_OBJECT_DIALOG::SplatMap;
std::map<std::string, std::string> WINDOW_EVENT_OBJECT_DIALOG::UberSplatMap;
std::map<std::string, std::string> WINDOW_EVENT_OBJECT_DIALOG::SoundMap;
std::map<std::string, std::string> WINDOW_EVENT_OBJECT_DIALOG::SpawnObjectMap;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
WINDOW_EVENT_OBJECT_DIALOG::WINDOW_EVENT_OBJECT_DIALOG()
{
	//Empty
}


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


//+-----------------------------------------------------------------------------
//| Loads all data
//+-----------------------------------------------------------------------------
BOOL WINDOW_EVENT_OBJECT_DIALOG::LoadData()
{
	BUFFER Buffer;
	TOKEN_IN_STREAM TokenStream;
	std::string FileName;
	std::string ProgramDirectory;
	std::string Name;
	std::string Data;

	ProgramDirectory = Common.GetProgramDirectory() + "\\";

	FileName = ProgramDirectory + PATH_DATA_SPLAT;
	TokenStream.SetFileName(FileName);

	if(!FileLoader.LoadFromFile(FileName, Buffer))
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	if(!TokenStream.Load(Buffer)) return FALSE;

	while(!TokenStream.Eof())
	{
		Data = TokenStream.ReadWord();
		if(Data == "") break;

		Name = TokenStream.ReadLine();
		if(Name == "") break;

		RegisterSplat(Data, Data + " - " + Name);
	}

	FileName = ProgramDirectory + PATH_DATA_UBERSPLAT;
	TokenStream.SetFileName(FileName);

	if(!FileLoader.LoadFromFile(FileName, Buffer))
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	if(!TokenStream.Load(Buffer)) return FALSE;

	while(!TokenStream.Eof())
	{
		Data = TokenStream.ReadWord();
		if(Data == "") break;

		Name = TokenStream.ReadLine();
		if(Name == "") break;

		RegisterUberSplat(Data, Data + " - " + Name);
	}

	FileName = ProgramDirectory + PATH_DATA_SOUND;
	TokenStream.SetFileName(FileName);

	if(!FileLoader.LoadFromFile(FileName, Buffer))
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	if(!TokenStream.Load(Buffer)) return FALSE;

	while(!TokenStream.Eof())
	{
		Data = TokenStream.ReadWord();
		if(Data == "") break;

		Name = TokenStream.ReadLine();
		if(Name == "") break;

		RegisterSound(Data, Data + " - " + Name);
	}

	FileName = ProgramDirectory + PATH_DATA_SPAWNOBJECT;
	TokenStream.SetFileName(FileName);

	if(!FileLoader.LoadFromFile(FileName, Buffer))
	{
		Error.SetMessage("Unable to open \"" + FileName + "\"!");
		return FALSE;
	}

	if(!TokenStream.Load(Buffer)) return FALSE;

	while(!TokenStream.Eof())
	{
		Data = TokenStream.ReadWord();
		if(Data == "") break;

		Name = TokenStream.ReadLine();
		if(Name == "") break;

		RegisterSpawnObject(Data, Data + " - " + Name);
	}

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Displays the dialog
//+-----------------------------------------------------------------------------
BOOL WINDOW_EVENT_OBJECT_DIALOG::Display(HWND ParentWindow, MODEL_EVENT_OBJECT_DATA& Data, MODEL_GLOBAL_SEQUENCE*& GlobalSequence) CONST
{
	StaticData = Data;
	StaticGlobalSequence = GlobalSequence;
	if(DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(DialogEventObject), ParentWindow, DialogMessageHandler, 0))
	{
		Data = StaticData;
		GlobalSequence = StaticGlobalSequence;
		StaticData = MODEL_EVENT_OBJECT_DATA();
		return TRUE;
	}

	StaticData = MODEL_EVENT_OBJECT_DATA();
	return FALSE;
}


//+-----------------------------------------------------------------------------
//| Handles the dialog messages
//+-----------------------------------------------------------------------------
BOOL CALLBACK WINDOW_EVENT_OBJECT_DIALOG::DialogMessageHandler(HWND Window, UINT Message, WPARAM W, LPARAM L)
{
	switch(Message)
	{
		case WM_INITDIALOG:
		{
			INT Index;
			HWND ListBox;
			HWND ComboBox;
			std::list<INT>::iterator i;

			AddWindow(Window);
			CenterWindow(Window);

			ListBox = GetDlgItem(Window, DialogEventObjectList);
			ComboBox = GetDlgItem(Window, DialogEventObjectCombo1);

			i = StaticData.EventTrack.begin();
			while(i != StaticData.EventTrack.end())
			{
				SortedInsert(ListBox, (*i));
				i++;
			}

			::SendMessage(ListBox, LB_SETCURSEL, 0, 0);

			Index = static_cast<INT>(::SendMessage(ComboBox, CB_INSERTSTRING, -1, reinterpret_cast<LPARAM>("FPT (FootPrint)")));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, 0);
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_INSERTSTRING, -1, reinterpret_cast<LPARAM>("SPL (BloodSplat)")));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, 1);
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_INSERTSTRING, -1, reinterpret_cast<LPARAM>("UBR (UberSplat)")));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, 2);
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_INSERTSTRING, -1, reinterpret_cast<LPARAM>("SND (Sound)")));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, 3);
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_INSERTSTRING, -1, reinterpret_cast<LPARAM>("SPN (SpawnObject)")));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, 4);

			if(StaticData.Name.size() != 8) StaticData.Name = STRING_DEFAULT_EVENT;

			StaticNameType = StaticData.Name.substr(0, 3);
			StaticNameIdentifier = StaticData.Name.substr(3, 1);
			StaticNameData = StaticData.Name.substr(4, 4);

			if(StaticNameType == "SPL")
			{
				BuildSplatList(Window);
				::SendMessage(ComboBox, CB_SETCURSEL, 1, 0);
				::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, GetComboIndex(Window, StaticNameData, SplatMap), 0);
			}
			else if(StaticNameType == "UBR")
			{
				BuildUberSplatList(Window);
				::SendMessage(ComboBox, CB_SETCURSEL, 2, 0);
				::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, GetComboIndex(Window, StaticNameData, UberSplatMap), 0);
			}
			else if(StaticNameType == "SND")
			{
				BuildSoundList(Window);
				::SendMessage(ComboBox, CB_SETCURSEL, 3, 0);
				::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, GetComboIndex(Window, StaticNameData, SoundMap), 0);
			}
			else if(StaticNameType == "SPN")
			{
				BuildSpawnObjectList(Window);
				::SendMessage(ComboBox, CB_SETCURSEL, 4, 0);
				::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, GetComboIndex(Window, StaticNameData, SpawnObjectMap), 0);
			}
			else
			{
				BuildSplatList(Window);
				::SendMessage(ComboBox, CB_SETCURSEL, 0, 0);
				::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, GetComboIndex(Window, StaticNameData, SplatMap), 0);
			}

			SetString(GetDlgItem(Window, DialogEventObjectEditIdentifier), StaticNameIdentifier);
			SetString(GetDlgItem(Window, DialogEventObjectEditData), StaticNameData);

			BuildGlobalSequenceIdList(Window);

			return TRUE;
		}

		case WM_CONTEXTMENU:
		{
			INT Index;
			INT MenuId;
			INT NrOfItems;
			RECT TempRect;
			RECT ListRect;
			POINT MousePosition;
			POINT LocalMousePosition;
			HWND ListBox;

			ListBox = GetDlgItem(Window, DialogEventObjectList);

			GetWindowRect(ListBox, &ListRect);
			GetCursorPos(&MousePosition);
			LocalMousePosition = MousePosition;
			ScreenToClient(ListBox, &LocalMousePosition);

			if(!Common.PointInsideRect(MousePosition, ListRect)) return TRUE;

			MenuId = TrackMenu2;
			NrOfItems = static_cast<INT>(::SendMessage(ListBox, LB_GETCOUNT, 0, 0));

			Index = 0;
			while(Index < NrOfItems)
			{
				::SendMessage(ListBox, LB_GETITEMRECT, Index, reinterpret_cast<LPARAM>(&TempRect));
				if(Common.PointInsideRect(LocalMousePosition, TempRect))
				{
					::SendMessage(ListBox, LB_SETCURSEL, Index, 0);
					MenuId = TrackMenu;
					break;
				}

				Index++;
			}

			TrackPopupMenuEx(GetSubMenu(LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MenuId)), 0), TPM_LEFTALIGN | TPM_RIGHTBUTTON, MousePosition.x, MousePosition.y, Window, NULL);

			return TRUE;
		}

		case WM_COMMAND:
		{
			HWND Control;

			Control = reinterpret_cast<HWND>(L);
			if(Control == GetDlgItem(Window, DialogEventObjectCombo1))
			{
				switch(HIWORD(W))
				{
					case CBN_SELCHANGE:
					{
						INT Index;
						INT Type;

						Index = static_cast<INT>(::SendMessage(Control, CB_GETCURSEL, 0, 0));
						Type = static_cast<INT>(::SendMessage(Control, CB_GETITEMDATA, Index, 0));

						switch(Type)
						{
							case 0:
							{
								BuildSplatList(Window);
								break;
							}

							case 1:
							{
								BuildSplatList(Window);
								break;
							}

							case 2:
							{
								BuildUberSplatList(Window);
								break;
							}

							case 3:
							{
								BuildSoundList(Window);
								break;
							}

							case 4:
							{
								BuildSpawnObjectList(Window);
								break;
							}
						}

						::SendMessage(GetDlgItem(Window, DialogEventObjectCombo2), CB_SETCURSEL, 0, 0);

						break;
					}
				}

				return TRUE;
			}
			else if(Control == GetDlgItem(Window, DialogEventObjectCombo2))
			{
				switch(HIWORD(W))
				{
					case CBN_SELCHANGE:
					{
						INT Index;
						INT Type;
						INT Size;
						std::vector<CHAR> Buffer;
						std::string String;
						std::map<std::string, std::string>::iterator i;

						Index = static_cast<INT>(::SendMessage(GetDlgItem(Window, DialogEventObjectCombo1), CB_GETCURSEL, 0, 0));
						Type = static_cast<INT>(::SendMessage(GetDlgItem(Window, DialogEventObjectCombo1), CB_GETITEMDATA, Index, 0));

						Index = static_cast<INT>(::SendMessage(Control, CB_GETCURSEL, 0, 0));
						Size = static_cast<INT>(::SendMessage(Control, CB_GETLBTEXTLEN, Index, 0));
						if(Size ==  LB_ERR) return TRUE;

						Buffer.resize(Size + 1);
						::SendMessage(Control, CB_GETLBTEXT, Index, reinterpret_cast<LPARAM>(&Buffer[0]));
						Buffer[Size] = '\0';
						String = &Buffer[0];

						switch(Type)
						{
							case 0:
							{
								i = SplatMap.find(String);
								if(i == SplatMap.end()) break;

								SetString(GetDlgItem(Window, DialogEventObjectEditData), i->second);

								break;
							}

							case 1:
							{
								i = SplatMap.find(String);
								if(i == SplatMap.end()) break;

								SetString(GetDlgItem(Window, DialogEventObjectEditData), i->second);

								break;
							}

							case 2:
							{
								i = UberSplatMap.find(String);
								if(i == UberSplatMap.end()) break;

								SetString(GetDlgItem(Window, DialogEventObjectEditData), i->second);

								break;
							}

							case 3:
							{
								i = SoundMap.find(String);
								if(i == SoundMap.end()) break;

								SetString(GetDlgItem(Window, DialogEventObjectEditData), i->second);

								break;
							}

							case 4:
							{
								i = SpawnObjectMap.find(String);
								if(i == SpawnObjectMap.end()) break;

								SetString(GetDlgItem(Window, DialogEventObjectEditData), i->second);

								break;
							}

							default:
							{
								SetString(GetDlgItem(Window, DialogEventObjectEditData), "Data not found!");
								break;

⌨️ 快捷键说明

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