windoweventobjectdialog.cpp

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

CPP
871
字号
							}
						}

						break;
					}
				}

				return TRUE;
			}

			switch(LOWORD(W))
			{
				case TrackFileCreateNew:
				case TrackFileCreateNew2:
				{
					INT Time;

					Time = static_cast<INT>(DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(DialogTrack), Window, TrackDialogMessageHandler, 0));
					if(Time < 0) return TRUE;

					SortedInsert(GetDlgItem(Window, DialogEventObjectList), Time);

					return TRUE;
				}

				case TrackFileRemove:
				case TrackFileRemove2:
				{
					INT Index;
					HWND ListBox;

					ListBox = GetDlgItem(Window, DialogEventObjectList);

					Index = static_cast<INT>(::SendMessage(ListBox, LB_GETCURSEL, 0, 0));
					if(Index == LB_ERR) return TRUE;

					::SendMessage(ListBox, LB_DELETESTRING, Index, 0);

					return TRUE;
				}

				case DialogEventObjectButtonOk:
				{
					INT i;
					INT Size;
					INT Index;
					HWND ListBox;

					Index = static_cast<INT>(::SendMessage(GetDlgItem(Window, DialogEventObjectCombo1), CB_GETCURSEL, 0, 0));
					switch(::SendMessage(GetDlgItem(Window, DialogEventObjectCombo1), CB_GETITEMDATA, Index, 0))
					{
						case 0:
						{
							StaticNameType = "FPT";
							break;
						}

						case 1:
						{
							StaticNameType = "SPL";
							break;
						}

						case 2:
						{
							StaticNameType = "UBR";
							break;
						}

						case 3:
						{
							StaticNameType = "SND";
							break;
						}

						case 4:
						{
							StaticNameType = "SPN";
							break;
						}

						default:
						{
							Error.SetMessage("The event type is invalid!");
							Error.DisplayMessage(Window);
							Error.ClearMessage();

							return TRUE;
						}
					}

					StaticNameIdentifier = GetString(GetDlgItem(Window, DialogEventObjectEditIdentifier));
					if(StaticNameIdentifier.size() != 1)
					{
						Error.SetMessage("The identifier has to be exactly one character!");
						Error.DisplayMessage(Window);
						Error.ClearMessage();

						SetFocus(GetDlgItem(Window, DialogEventObjectEditIdentifier));
						::SendMessage(GetDlgItem(Window, DialogEventObjectEditIdentifier), EM_SETSEL, 0, -1);

						return TRUE;
					}

					StaticNameData = GetString(GetDlgItem(Window, DialogEventObjectEditData));
					if(StaticNameData.size() != 4)
					{
						Error.SetMessage("The data has to be exactly four characters!");
						Error.DisplayMessage(Window);
						Error.ClearMessage();

						SetFocus(GetDlgItem(Window, DialogEventObjectEditData));
						::SendMessage(GetDlgItem(Window, DialogEventObjectEditData), EM_SETSEL, 0, -1);

						return TRUE;
					}

					StaticData.Name = StaticNameType + StaticNameIdentifier + StaticNameData;

					ListBox = GetDlgItem(Window, DialogEventObjectList);
					Size = static_cast<INT>(::SendMessage(ListBox, LB_GETCOUNT, 0, 0));
					StaticData.EventTrack.clear();

					for(i = 0; i < Size; i++)
					{
						StaticData.EventTrack.push_back(static_cast<INT>(::SendMessage(ListBox, LB_GETITEMDATA, i, 0)));
					}

					StaticGlobalSequence = reinterpret_cast<MODEL_GLOBAL_SEQUENCE*>(::SendMessage(GetDlgItem(Window, DialogEventObjectComboGlobalSequenceId), CB_GETITEMDATA, ::SendMessage(GetDlgItem(Window, DialogEventObjectComboGlobalSequenceId), CB_GETCURSEL, 0, 0), 0));

					RemoveWindow(Window);
					EndDialog(Window, 1);
					return TRUE;
				}

				case DialogEventObjectButtonCancel:
				{
					RemoveWindow(Window);
					EndDialog(Window, 0);
					return TRUE;
				}
			}

			return FALSE;
		}

		case WM_CLOSE:
		{
			::SendMessage(Window, WM_COMMAND, DialogEventObjectButtonCancel, 0);
			return TRUE;
		}
	}

	return FALSE;
}


//+-----------------------------------------------------------------------------
//| Handles the track dialog messages
//+-----------------------------------------------------------------------------
BOOL CALLBACK WINDOW_EVENT_OBJECT_DIALOG::TrackDialogMessageHandler(HWND Window, UINT Message, WPARAM W, LPARAM L)
{
	switch(Message)
	{
		case WM_INITDIALOG:
		{
			AddWindow(Window);
			CenterWindow(Window);

			SetDlgItemInt(Window, DialogTrackEditTime, 0, FALSE);

			return TRUE;
		}

		case WM_COMMAND:
		{
			switch(LOWORD(W))
			{
				case DialogTrackButtonOk:
				{
					INT Time;

					Time = GetDlgItemInt(Window, DialogTrackEditTime, NULL, FALSE);

					RemoveWindow(Window);
					EndDialog(Window, Time);
					return TRUE;
				}

				case DialogTrackButtonCancel:
				{
					RemoveWindow(Window);
					EndDialog(Window, -1);
					return TRUE;
				}
			}

			return FALSE;
		}

		case WM_CLOSE:
		{
			::SendMessage(Window, WM_COMMAND, DialogTrackButtonCancel, 0);
			return TRUE;
		}
	}

	return FALSE;
}


//+-----------------------------------------------------------------------------
//| Inserts the data into a sorted position in the list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::SortedInsert(HWND ListBox, INT Data)
{
	INT i;
	INT Size;
	INT Index;
	std::stringstream Stream;

	Size = static_cast<INT>(::SendMessage(ListBox, LB_GETCOUNT, 0, 0));
	Index = -1;

	for(i = 0; i < Size; i++)
	{
		if(::SendMessage(ListBox, LB_GETITEMDATA, i, 0) > Data)
		{
			Index = i;
			break;
		}
	}

	Stream << Data;

	Index = static_cast<INT>(::SendMessage(ListBox, LB_INSERTSTRING, Index, reinterpret_cast<LPARAM>(Stream.str().c_str())));
	::SendMessage(ListBox, LB_SETITEMDATA, Index, Data);
}


//+-----------------------------------------------------------------------------
//| Builds the global sequence ID list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::BuildGlobalSequenceIdList(HWND Window)
{
	INT i;
	INT Index;
	HWND ComboBox;

	ComboBox = GetDlgItem(Window, DialogEventObjectComboGlobalSequenceId);
	if(ComboBox == NULL) return;

	Index = static_cast<INT>(::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(NAME_NO_ID.c_str())));
	::SendMessage(ComboBox, CB_SETITEMDATA, Index, 0);
	::SendMessage(ComboBox, CB_SETCURSEL, 0, 0);

	for(i = 0; i < Model.Data().GlobalSequenceContainer.GetTotalSize(); i++)
	{
		if(Model.Data().GlobalSequenceContainer.ValidIndex(i))
		{
			std::stringstream Stream;

			Stream << "GlobalSequence " << Model.Data().GlobalSequenceContainer[i];
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(Stream.str().c_str())));
			::SendMessage(ComboBox, CB_SETITEMDATA, Index, reinterpret_cast<LPARAM>(Model.Data().GlobalSequenceContainer[i]));

			if(Model.Data().GlobalSequenceContainer[i] == StaticGlobalSequence)
			{
				::SendMessage(ComboBox, CB_SETCURSEL, Index, 0);
			}
		}
	}
}


//+-----------------------------------------------------------------------------
//| Builds the splat list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::BuildSplatList(HWND Window)
{
	HWND ComboBox;
	std::map<std::string, std::string>::iterator i;

	ComboBox = GetDlgItem(Window, DialogEventObjectCombo2);
	if(ComboBox == NULL) return;

	::SendMessage(ComboBox, CB_RESETCONTENT, 0, 0);

	i = SplatMap.begin();
	while(i != SplatMap.end())
	{
		::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(i->first.c_str()));
		i++;
	}

	::SendMessage(Window, CB_SETCURSEL, 0, 0);
}


//+-----------------------------------------------------------------------------
//| Builds the uber splat list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::BuildUberSplatList(HWND Window)
{
	HWND ComboBox;
	std::map<std::string, std::string>::iterator i;

	ComboBox = GetDlgItem(Window, DialogEventObjectCombo2);
	if(ComboBox == NULL) return;

	::SendMessage(ComboBox, CB_RESETCONTENT, 0, 0);

	i = UberSplatMap.begin();
	while(i != UberSplatMap.end())
	{
		::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(i->first.c_str()));
		i++;
	}

	::SendMessage(Window, CB_SETCURSEL, 0, 0);
}


//+-----------------------------------------------------------------------------
//| Builds the sound list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::BuildSoundList(HWND Window)
{
	HWND ComboBox;
	std::map<std::string, std::string>::iterator i;

	ComboBox = GetDlgItem(Window, DialogEventObjectCombo2);
	if(ComboBox == NULL) return;

	::SendMessage(ComboBox, CB_RESETCONTENT, 0, 0);

	i = SoundMap.begin();
	while(i != SoundMap.end())
	{
		::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(i->first.c_str()));
		i++;
	}

	::SendMessage(Window, CB_SETCURSEL, 0, 0);
}


//+-----------------------------------------------------------------------------
//| Builds the spawn object list
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::BuildSpawnObjectList(HWND Window)
{
	HWND ComboBox;
	std::map<std::string, std::string>::iterator i;

	ComboBox = GetDlgItem(Window, DialogEventObjectCombo2);
	if(ComboBox == NULL) return;

	::SendMessage(ComboBox, CB_RESETCONTENT, 0, 0);

	i = SpawnObjectMap.begin();
	while(i != SpawnObjectMap.end())
	{
		::SendMessage(ComboBox, CB_ADDSTRING, 0, reinterpret_cast<LPARAM>(i->first.c_str()));
		i++;
	}

	::SendMessage(Window, CB_SETCURSEL, 0, 0);
}


//+-----------------------------------------------------------------------------
//| Registers a splat
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::RegisterSplat(CONST std::string& Data, CONST std::string& Name)
{
	SplatMap.insert(std::make_pair(Name, Data));
}


//+-----------------------------------------------------------------------------
//| Registers an uber splat
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::RegisterUberSplat(CONST std::string& Data, CONST std::string& Name)
{
	UberSplatMap.insert(std::make_pair(Name, Data));
}


//+-----------------------------------------------------------------------------
//| Registers a sound
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::RegisterSound(CONST std::string& Data, CONST std::string& Name)
{
	SoundMap.insert(std::make_pair(Name, Data));
}


//+-----------------------------------------------------------------------------
//| Registers a spawn object
//+-----------------------------------------------------------------------------
VOID WINDOW_EVENT_OBJECT_DIALOG::RegisterSpawnObject(CONST std::string& Data, CONST std::string& Name)
{
	SpawnObjectMap.insert(std::make_pair(Name, Data));
}


//+-----------------------------------------------------------------------------
//| Returns the combobox index for a certain data
//+-----------------------------------------------------------------------------
INT WINDOW_EVENT_OBJECT_DIALOG::GetComboIndex(HWND Window, CONST std::string& Data, std::map<std::string, std::string>& Map)
{
	INT Index;
	HWND ComboBox;
	std::map<std::string, std::string>::iterator i;

	ComboBox = GetDlgItem(Window, DialogEventObjectCombo2);

	i = Map.begin();
	while(i != Map.end())
	{
		if(i->second == Data)
		{
			Index = static_cast<INT>(::SendMessage(ComboBox, CB_FINDSTRINGEXACT, -1, reinterpret_cast<LPARAM>(i->first.c_str())));
			if(Index == LB_ERR) return 0;
			
			return Index;
		}

		i++;
	}

	return 0;
}

⌨️ 快捷键说明

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