📄 scndlg.cpp
字号:
// SCNDlg.cpp : implementation file
//
#include "stdafx.h"
#include "SCNGenerator.h"
#include "SCNDlg.h"
#include "AddExitDlg.h"
#include "AddRoleDlg.h"
#include "AddObjDlg.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSceneDlg dialog
CSceneDlg::CSceneDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSceneDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSceneDlg)
m_MapFile = _T("");
m_szName = _T("");
m_dwWidth = 0;
m_dwHeight = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CSceneDlg::~CSceneDlg()
{
}
void CSceneDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSceneDlg)
DDX_Control(pDX, IDC_LISTROLE, m_RoleList);
DDX_Control(pDX, IDC_LISTOBJ, m_ObjList);
DDX_Control(pDX, IDC_LISTEXIT, m_ExitList);
DDX_Text(pDX, IDC_EDIT_MAPFILE, m_MapFile);
DDV_MaxChars(pDX, m_MapFile, 31);
DDX_Text(pDX, IDC_EDIT_SCENENAME, m_szName);
DDV_MaxChars(pDX, m_szName, 15);
DDX_Text(pDX, IDC_EDIT_WIDTH, m_dwWidth);
DDV_MinMaxDWord(pDX, m_dwWidth, 0, 999999);
DDX_Text(pDX, IDC_EDIT_HEIGHT, m_dwHeight);
DDV_MinMaxDWord(pDX, m_dwHeight, 0, 999999);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSceneDlg, CDialog)
//{{AFX_MSG_MAP(CSceneDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_GENERATE, OnButtonGenerate)
ON_BN_CLICKED(IDC_BUTTON_BRC, OnButtonBrowseMAP)
ON_BN_CLICKED(IDC_BUTTONDE, OnButtonDelExit)
ON_BN_CLICKED(IDC_BUTTONDO, OnButtonDelObj)
ON_BN_CLICKED(IDC_BUTTONDR, OnButtonDelRole)
ON_BN_CLICKED(IDC_BUTTONAE, OnButtonAddExit)
ON_BN_CLICKED(IDC_BUTTONAO, OnButtonAddObj)
ON_BN_CLICKED(IDC_BUTTONAR, OnButtonAddRole)
ON_BN_CLICKED(IDC_BUTTON_LOAD, OnButtonLoad)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSceneDlg message handlers
BOOL CSceneDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSceneDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSceneDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
//////////////////////////// 生成场景文档 ////////////////////////////
void CSceneDlg::OnButtonGenerate()
{
UpdateData(TRUE);
CString DefaultName=(m_szName=="")?"未命名场景.SCN":(m_szName+".SCN");
CFileDialog dlg(FALSE,"SCN",(LPCTSTR)DefaultName,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"RPG场景文件(*.SCN)|*.SCN|所有文件(*.*)|*.*||",
this);
if(dlg.DoModal()==IDOK)
{
CFile cf;
if(!cf.Open(dlg.GetPathName(),CFile::typeBinary|CFile::modeWrite|CFile::modeCreate))
AfxMessageBox(dlg.GetPathName()+"写入失败!");
//WRITE TO FILE
SceneHeader SCNHeader={{'G','S','C','N'},0x0106};
SCNHeader.Width = m_dwWidth;
SCNHeader.Height = m_dwHeight;
SCNHeader.HCells = m_dwWidth/16;
SCNHeader.VCells = m_dwHeight/16;
memset(SCNHeader.szName,0,16);
memset(SCNHeader.szMapName,0,32);
strncpy(SCNHeader.szName,m_szName,15);
strncpy(SCNHeader.szMapName,m_MapFile,31);
cf.Write(&SCNHeader,sizeof(SCNHeader));
LONG Count;
Count = m_ObjList.GetCount();
cf.Write(&Count,4);
for(int i=0;i<Count;i++)
{
OBJECT *pData=(OBJECT *)m_ObjList.GetItemDataPtr(i);
ASSERT(pData);
cf.Write(pData,sizeof(OBJECT));
}
Count = m_ExitList.GetCount();
cf.Write(&Count,4);
for(i=0;i<Count;i++)
{
EXIT *pData=(EXIT *)m_ExitList.GetItemDataPtr(i);
ASSERT(pData);
cf.Write(pData,sizeof(EXIT));
}
Count = m_RoleList.GetCount();
cf.Write(&Count,4);
for(i=0;i<Count;i++)
{
ROLE *pData=(ROLE *)m_RoleList.GetItemDataPtr(i);
ASSERT(pData);
cf.Write(pData,sizeof(ROLE));
}
cf.Close();
}
}
//////////////////////////// 浏览MAP文件 /////////////////////////////
void CSceneDlg::OnButtonBrowseMAP()
{
UpdateData(TRUE);
CFileDialog dlg(TRUE,"MAP","*.MAP",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"RPG地图文件(*.MAP)|*.MAP|所有文件(*.*)|*.*||",
this);
if(dlg.DoModal()==IDOK)
{
m_MapFile = dlg.GetFileName();
UpdateData(FALSE);
}
}
void CSceneDlg::OnButtonDelExit()
{
UpdateData(TRUE);
int idx=m_ExitList.GetCurSel();
if(idx!=LB_ERR)
{
EXIT *pData = (EXIT *)m_ExitList.GetItemDataPtr(idx);
m_ExitList.SetItemDataPtr(idx,NULL);
delete pData;
m_ExitList.DeleteString(idx);
}
}
void CSceneDlg::OnButtonDelObj()
{
UpdateData(TRUE);
int idx=m_ObjList.GetCurSel();
if(idx!=LB_ERR)
{
OBJECT *pData = (OBJECT *)m_ObjList.GetItemDataPtr(idx);
m_ObjList.SetItemDataPtr(idx,NULL);
delete pData;
m_ObjList.DeleteString(idx);
}
}
void CSceneDlg::OnButtonDelRole()
{
UpdateData(TRUE);
int idx=m_RoleList.GetCurSel();
if(idx!=LB_ERR)
{
ROLE *pData = (ROLE *)m_RoleList.GetItemDataPtr(idx);
m_RoleList.SetItemDataPtr(idx,NULL);
delete pData;
m_RoleList.DeleteString(idx);
}
}
void CSceneDlg::OnButtonAddExit()
{
UpdateData(TRUE);
CAddExitDlg dlg(this);
dlg.m_CellW = m_dwWidth/16;
dlg.m_CellH = m_dwHeight/16;
if(dlg.DoModal()==IDOK)
{
EXIT *data=new EXIT;
ASSERT(data);
memset(data->SCNName,0,32);
strncpy(data->SCNName,dlg.m_strFName,31);
CString item;
item.Format("%s\tFROM(%d,%d,%d,%d)\tTO(%d,%d)",
data->SCNName,
data->X1 = dlg.m_lX1,
data->Y1 = dlg.m_lY1,
data->X2 = dlg.m_lX2,
data->Y2 = dlg.m_lY2,
data->TX = dlg.m_lX,
data->TY = dlg.m_lY
);
int idx=m_ExitList.AddString(item);
if(idx!=LB_ERR)
{
m_ExitList.SetItemDataPtr(idx,data);
}
else delete data;
}
}
void CSceneDlg::OnButtonAddObj()
{
UpdateData(TRUE);
CAddObjDlg dlg(this);
dlg.m_W = m_dwWidth;
dlg.m_H = m_dwHeight;
if(dlg.DoModal()==IDOK)
{
OBJECT *data=new OBJECT;
ASSERT(data);
data->Enable = dlg.m_bEnable;
CString item;
item.Format("OBJIndex=%d\tAT(%d,%d)\t",
data->Idx = dlg.m_uIDX,
data->X = dlg.m_lX,
data->Y = dlg.m_lY
);
item+=data->Enable?"ENABLED":"DISABLED";
int idx=m_ObjList.AddString(item);
if(idx!=LB_ERR)
{
m_ObjList.SetItemDataPtr(idx,data);
}
else delete data;
}
}
void CSceneDlg::OnButtonAddRole()
{
UpdateData(TRUE);
CAddRoleDlg dlg(this);
dlg.m_W = m_dwWidth;
dlg.m_H = m_dwHeight;
if(dlg.DoModal()==IDOK)
{
ROLE *data=new ROLE;
ASSERT(data);
memset(data->ROLName,0,32);
strncpy(data->ROLName,dlg.m_strFName,31);
CString item;
item.Format("%s\tAT(%d,%d)\tDIR=(%d)",
data->ROLName,
data->X = dlg.m_lX,
data->Y = dlg.m_lY,
data->Dir = dlg.m_iDir
);
int idx=m_RoleList.AddString(item);
if(idx!=LB_ERR)
{
m_RoleList.SetItemDataPtr(idx,data);
}
else delete data;
}
}
void CSceneDlg::OnOK()
{
UpdateData(TRUE);
for(int i=0;i<m_RoleList.GetCount();i++)
{
ROLE *pData=(ROLE *)m_RoleList.GetItemDataPtr(i);
if(pData) delete pData;
}
for(i=0;i<m_ExitList.GetCount();i++)
{
EXIT *pData=(EXIT *)m_ExitList.GetItemDataPtr(i);
if(pData) delete pData;
}
for(i=0;i<m_ObjList.GetCount();i++)
{
OBJECT *pData=(OBJECT *)m_ObjList.GetItemDataPtr(i);
if(pData) delete pData;
}
CDialog::OnOK();
}
void CSceneDlg::OnButtonLoad()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -