📄 winmain.cpp
字号:
/**************************************************
WinMain.cpp
Chapter 14 Mad Lib Script Editor
Programming Role-Playing Games with DirectX
by Jim Adams (01 Jan 2002)
**************************************************/
#include <windows.h>
#include <stdio.h>
#include "resource.h"
#include "Action.h"
// Application variables ////////////////////////////////////////////
HWND g_hWnd; // Window handle
char g_szClass[] = "MLSEDIT"; // Class name
cActionTemplate g_Actions; // Action template class
long g_NumScriptActions = 0; // # script actions
sScript *g_ScriptParent = NULL; // Script data
sScript *g_ModifyScript = NULL; // Pointer to script to modify
BOOL g_ShowCancel = FALSE;
OPENFILENAME g_ofn; // Open/Save dialog data
char g_ActionFile[MAX_PATH]; // Filename for action files
char g_ScriptFile[MAX_PATH]; // Filename for script files
// Application prototypes ///////////////////////////////////////////
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow);
long FAR PASCAL WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK ModifyDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void SetModifyDialogText(HWND hWnd, sScript *Script, long Entry);
void UpdateEntry(HWND hWnd, sScript *Script, long Entry);
BOOL LoadActions(char *Filename = NULL);
BOOL NewScript();
BOOL LoadScript();
BOOL SaveScript();
// Application //////////////////////////////////////////////////////
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int nCmdShow)
{
WNDCLASS wc;
MSG Msg;
// Register window class
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = DLGWINDOWEXTRA;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClass;
RegisterClass(&wc);
// Create the dialog box window and show it
g_hWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_EDIT), 0, NULL);
UpdateWindow(g_hWnd);
ShowWindow(g_hWnd, nCmdShow);
// Force a load of actions in Default.mla
LoadActions("..\\Data\\Default.mla");
// Message loop
while(GetMessage(&Msg, NULL, 0, 0)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
// Free script actions
delete g_ScriptParent;
// Free any actions
g_Actions.Free();
// Clean up
UnregisterClass(g_szClass, hInst);
return 0;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int Selection, Pos;
char Text[2048];
sScript *Script;
sAction *ActionPtr;
switch(uMsg) {
case WM_COMMAND:
switch(LOWORD(wParam)) {
// New script file
case IDC_NEW:
NewScript();
break;
// Load a script file
case IDC_LOAD:
LoadScript();
break;
// Save a script file
case IDC_SAVE:
SaveScript();
break;
// Load an action file
case IDC_LOADACTIONS:
LoadActions();
break;
// Edit a script action
case IDC_SCRIPT:
if(HIWORD(wParam) != LBN_DBLCLK)
break;
case IDC_EDIT:
// See if a script action was selected
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Get pointer to script entry
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_GETTEXT, Selection, (LPARAM)Text);
Script = (sScript*)atol(Text);
// Setup the action to edit
g_ModifyScript = Script;
// Call the modify script action dialog
g_ShowCancel = FALSE;
DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), hWnd, ModifyDialogProc);
// Update script action
ActionPtr = g_Actions.GetAction(Selection);
g_Actions.ExpandActionText(Text, Script);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_INSERTSTRING, Selection, (LPARAM)Text);
break;
// Add a script action
case IDC_ACTIONS:
if(HIWORD(wParam) != LBN_DBLCLK)
break;
case IDC_ADD:
// Make sure an action is selected
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_ACTIONS), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Create a new script action and add it
Script = g_Actions.CreateScriptAction(Selection);
g_ModifyScript = Script;
// Call the modify script action dialog
g_ShowCancel = TRUE;
if(DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), hWnd, ModifyDialogProc) == TRUE) {
// Add the script action to script
Script->Next = g_ScriptParent;
if(g_ScriptParent != NULL)
g_ScriptParent->Prev = Script;
g_ScriptParent = Script;
// Display script action text
ActionPtr = g_Actions.GetAction(Selection);
g_Actions.ExpandActionText(Text, Script);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_ADDSTRING, 0, (LPARAM)Text);
// Add pointer to script list
sprintf(Text, "%lu", Script);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_ADDSTRING, 0, (LPARAM)Text);
// Increase count
g_NumScriptActions++;
} else {
delete Script;
}
break;
// Insert a script action
case IDC_INSERT:
// Get location to insert action
if((Pos = SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Make sure an action is selected
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_ACTIONS), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Create a new script action and add it
Script = g_Actions.CreateScriptAction(Selection);
g_ModifyScript = Script;
// Call the modify script action dialog
g_ShowCancel = TRUE;
if(DialogBox(NULL, MAKEINTRESOURCE(IDD_MODIFY), hWnd, ModifyDialogProc) == TRUE) {
// Add the script action to script
Script->Prev = NULL;
Script->Next = g_ScriptParent;
g_ScriptParent->Prev = Script;
g_ScriptParent = Script;
// Display script action text
ActionPtr = g_Actions.GetAction(Selection);
g_Actions.ExpandActionText(Text, Script);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_INSERTSTRING, Pos, (LPARAM)Text);
// Add pointer to script list
sprintf(Text, "%lu", Script);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_INSERTSTRING, Pos, (LPARAM)Text);
// Increase count
g_NumScriptActions++;
} else {
delete Script;
}
break;
// Delete a script action
case IDC_DELETE:
// Make sure there's a selection
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Get pointer to script entry
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_GETTEXT, Selection, (LPARAM)Text);
Script = (sScript*)atol(Text);
// Remove script action from linked list
if(Script->Prev != NULL)
Script->Prev->Next = Script->Next;
else
g_ScriptParent = Script->Next;
if(Script->Next != NULL)
Script->Next->Prev = Script->Prev;
Script->Next = NULL; // So whole list isn't deleted
delete Script;
// Clear from script and script list
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_DELETESTRING, Selection, 0);
// Decrease count
g_NumScriptActions--;
break;
// Move script action up in list
case IDC_UP:
// Make sure there's a selection
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Make sure it's not topmost selection
if(!Selection)
break;
// Swap selection and one above
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETTEXT, Selection, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_INSERTSTRING, Selection-1, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_GETTEXT, Selection, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_INSERTSTRING, Selection-1, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_SETCURSEL, Selection-1, (LPARAM)Text);
break;
// Move script action down in list
case IDC_DOWN:
// Make sure there's a selection
if((Selection = SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCURSEL, 0, 0)) == LB_ERR)
break;
// Make sure it's not bottommost
if(Selection >= SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETCOUNT, 0, 0)-1)
break;
// Swap selection and one below
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_GETTEXT, Selection, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_INSERTSTRING, Selection+1, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_GETTEXT, Selection, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_DELETESTRING, Selection, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_INSERTSTRING, Selection+1, (LPARAM)Text);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_SETCURSEL, Selection+1, (LPARAM)Text);
break;
}
break;
case WM_CREATE:
// Initialize the save/load dialog box info
ZeroMemory(&g_ofn, sizeof(OPENFILENAME));
g_ofn.lStructSize = sizeof(OPENFILENAME);
g_ofn.nMaxFile = MAX_PATH;
g_ofn.nMaxFileTitle = MAX_PATH;
g_ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;
// Clear script filename
g_ScriptFile[0] = 0;
g_ActionFile[0] = 0;
// Clear all list boxes
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPT), LB_RESETCONTENT, 0, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_SCRIPTLIST), LB_RESETCONTENT, 0, 0);
SendMessage(GetDlgItem(g_hWnd, IDC_ACTIONS), LB_RESETCONTENT, 0, 0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
BOOL CALLBACK ModifyDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static long EntryNum = 0;
switch(uMsg) {
case WM_INITDIALOG:
// Return an error if there's no script to modify
if(g_ModifyScript == NULL) {
EndDialog(hWnd, FALSE);
return FALSE;
}
// Edit first entry
EntryNum = 0;
// Display entry text
SetModifyDialogText(hWnd, g_ModifyScript, EntryNum);
// Show/Hide Cancel button
ShowWindow(GetDlgItem(hWnd, IDC_CANCEL), g_ShowCancel);
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDC_OK:
UpdateEntry(hWnd, g_ModifyScript, EntryNum);
EndDialog(hWnd, TRUE);
return TRUE;
case IDC_CANCEL:
EndDialog(hWnd, FALSE);
return TRUE;
case IDC_PREV:
// Only bother if not first entry
if(EntryNum > 0) {
// Apply changes
// Go to previous entry
UpdateEntry(hWnd, g_ModifyScript, EntryNum);
EntryNum--;
SetModifyDialogText(hWnd, g_ModifyScript, EntryNum);
}
break;
case IDC_NEXT:
// Only bother if not last entry
if(EntryNum < g_ModifyScript->NumEntries-1) {
// Apply changes
// Go to next entry
UpdateEntry(hWnd, g_ModifyScript, EntryNum);
EntryNum++;
SetModifyDialogText(hWnd, g_ModifyScript, EntryNum);
}
break;
}
break;
}
return FALSE;
}
void SetModifyDialogText(HWND hWnd, sScript *Script, long Entry)
{
sAction *ActionPtr;
char Text[2048];
long i;
// Get pointer to action
ActionPtr = g_Actions.GetAction(Script->Type);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -