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

📄 winmain.cpp

📁 [游戏开发参考书-用DirectX编写RPG游戏]这是一个系列的丛书如果你都看并且懂的话你就可以你工作啦!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**************************************************
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 + -