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

📄 mybar.cpp

📁 CMUD源码 用来玩MUD游戏的 没开发完
💻 CPP
字号:
// mybar.cpp : implementation file
//

#include "stdafx.h"
//#include "mybar.h"
#include "resource.h"
#include "GDoc.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyBar

CMyBar::CMyBar()
{
	m_nState=0;
}

CMyBar::~CMyBar()
{
	for (int i=0; i<m_listArray.GetSize(); i++)
		delete m_listArray[i];
}


BEGIN_MESSAGE_MAP(CMyBar, baseCMyBar)
	//{{AFX_MSG_MAP(CMyBar)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
	ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
    ON_CBN_SELENDOK(IDC_COMBO1, OnRefresh)
	//}}AFX_MSG_MAP
	ON_COMMAND_RANGE(IDM_LISTFONT1, IDM_LISTFONT3,OnListFont)
	ON_COMMAND_RANGE(IDM_LISTMENU, IDM_LISTMENU+10,OnListMenu)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CMyBar message handlers

int CMyBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (baseCMyBar::OnCreate(lpCreateStruct) == -1)
		return -1;

	m_btRefresh.Create("更新",WS_VISIBLE|WS_CHILD,CRect(0,0,0,0),this,IDC_REFRESH);

	if (!m_wndMap.Create(WS_CHILD|WS_HSCROLL|WS_VSCROLL|ES_NOHIDESEL|
		ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL|ES_AUTOHSCROLL|ES_READONLY,
		CRect(0,0,0,0), this, IDC_RICHEDIT2))
		return -1;
	m_wndMap.SetTextFmt(180);

	if (!m_wndDoor.Create(WS_CHILD|WS_VISIBLE|ES_MULTILINE|
		ES_WANTRETURN|ES_READONLY, CRect(0,0,0,0), this, 0))
		return -1;
	m_wndDoor.SetTextFmt(220);

	if (!m_mapBox.Create(WS_CHILD|WS_VSCROLL|WS_VSCROLL|
		CBS_AUTOHSCROLL|CBS_DROPDOWN|CBS_HASSTRINGS,
		CRect(0,0,0,0), this, IDC_COMBO1))
		return -1;
	m_mapBox.SetHorizontalExtent(100);

	CString tmp;
	int i;
	const int list_num = AfxGetApp()->GetProfileInt("list", "num", 1);
	m_listArray.SetSize(list_num);
	for (i=0; i<list_num; i++)
	{
		m_listArray[i] = new CMyList;
		if (!m_listArray[i]->Create(WS_CHILD|WS_HSCROLL|WS_VSCROLL|
			LVS_SMALLICON|LVS_SHOWSELALWAYS|LVS_SINGLESEL,
			CRect(0,0,0,0), this, 0))
			return -1;
		m_listArray[i]->Init();

		tmp.Format("name%d", i+1);
		ReadData(m_listArray[i]->m_name, "list", tmp);
		tmp.Format("cmd%d", i+1);
		ReadData(m_listArray[i]->m_cmd, "list", tmp);
		tmp.Format("start%d", i+1);
		ReadData(m_listArray[i]->m_start, "list", tmp);
		tmp.Format("end%d", i+1);
		ReadData(m_listArray[i]->m_end, "list", tmp);
		tmp.Format("menu%d", i+1);
		ReadData(m_listArray[i]->m_menu, "list", tmp);
		if (m_listArray[i]->m_menu.IsEmpty())
			m_listArray[i]->m_menu = "rmenu.txt";
	}
	m_listArray[0]->ShowWindow(SW_NORMAL);
	
	if (!m_tab.Create(WS_CHILD|WS_VISIBLE,
		CRect(0,0,0,0), this, IDC_TAB1))
		return -1;
	m_tab.SetPadding(CSize(6,3));
	m_tab.SetMinTabWidth(40);

	for (i=0; i<list_num; i++)
		m_tab.InsertItem(i, m_listArray[i]->m_name);
	m_tab.InsertItem(list_num,"地图");
	
	if(m_font.CreatePointFont(100, "宋体"))
	{
		m_tab.SetFont(&m_font);
		m_btRefresh.SetFont(&m_font);
		m_mapBox.SetFont(&m_font);
	}


	return 0;
}

void CMyBar::OnSize(UINT nType, int cx, int cy)
{
	const int H = 2 * cy / 3;
	m_tab.MoveWindow(0,0,cx,cy);
	m_wndMap.MoveWindow(0,25,cx, H-30);
	m_mapBox.MoveWindow(2,H+1,cx-4,320);
	m_wndDoor.MoveWindow(0, H+25, cx, cy-H-50);
	for (int i=0; i<m_listArray.GetSize(); i++)
		m_listArray[i]->MoveWindow(0, 25, cx, H);
	m_btRefresh.MoveWindow(cx-53,cy-26,50,24);
}

void CMyBar::OnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	int n=m_tab.GetCurSel();

	for (int i=0; i<m_listArray.GetSize(); i++)
		m_listArray[i]->ShowWindow(n==i);
	m_mapBox.ShowWindow(n==m_listArray.GetSize());
	m_wndMap.ShowWindow(n==m_listArray.GetSize());
	
//	m_btRefresh.ShowWindow(n<LIST_NUM);

}

void CMyBar::Init(LPCTSTR sMapFile)
{
	CString data;
	ReadData(m_strPrompt, "data1", "prompt");
	ReadData(m_strPage1, "data1", "page1");
	ReadData(m_strPage2, "data1", "page2");
	ReadData(m_strRoom1, "data1", "room1");
	ReadData(m_strRoom2, "data1", "room2");
	
	ReadData(m_wndDoor.m_start, "data1", "door1");
	ReadData(m_wndDoor.m_end, "data1", "door2");
	ReadData(m_wndMap.m_start, "data1", "map");
	ReadData(m_wndMap.m_end, "data1", "buff");

	m_mapBox.ResetContent();
	CStdioFile file(sMapFile, CFile::modeCreate| CFile::modeNoTruncate | CFile::modeRead);
	while(file.ReadString(data))
		m_mapBox.AddString(data);
	file.Close();
	m_mapBox.SetExtendedUI(FALSE);
	m_mapBox.SetCurSel(0);

}

void CMyBar::OnRefresh()
{	
    int n=m_tab.GetCurSel(); 
	if (n<m_listArray.GetSize())
		SendCmd(m_listArray[n]->m_cmd);
	else
	{
		CString send;
		int i=m_mapBox.GetCurSel();
		if(i!=-1)
			m_mapBox.GetLBText(i,send);
		else
			m_mapBox.GetWindowText(send);
		send.Format("help %s",send.SpanExcluding(":"));
		SendCmd(send);
		m_wndMap.m_crOld.cpMax = m_wndMap.m_crOld.cpMin = -1;
	}
	m_nState=n+1;
	m_str.Empty();
	CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
	pFrame->FocusOnSend();
	
}


CString CMyBar::Process(CString s)
{
	// - 房间名称 找位置
	if(m_nState<2)
	{
		CString ss=s;
		int n;
		while(Exclude1(ss,CString((char)0x1b),ALETTER));
		if(-1!=(n=ss.Find(m_strRoom2)))  
		{
			ss=ss.Mid(m_strRoom1.GetLength(),n-m_strRoom1.GetLength());//房间名称
			m_wndMap.FindPlace(ss);//地图窗口
			if(!m_nState)
				m_nState=1;
		}
	}

	if(m_nState)
	{
		m_str+=s;
		while(Exclude1(m_str,CString((char)0x1b),ALETTER));
		if(-1!=m_str.Find(m_strPage1))     //未完继续
			SendCmd("");	
		if(-1!=m_str.Find(m_strPrompt))  //发现结束符
		{
			int n = m_nState-1;
			while(Exclude(m_str,m_strPage1,m_strPage2));//未完 下一页
			if(!n) // 房间list
			{
				m_wndDoor.UpdateLine(m_str);
				m_listArray[0]->Update(m_str);
			}
			else if(n<m_listArray.GetSize())
				s=m_listArray[n]->Update(m_str);
			else
				s=m_wndMap.Update(m_str);

			m_nState=0;
		}
		else if(m_nState>1)
			s.Empty();
	}

	return s;
}
void CMyBar::SendCmd(CString s)
{ 
	CFrameWnd* pFrame=(CFrameWnd*)AfxGetMainWnd();
	CGDoc* pDoc=(CGDoc*)pFrame->GetActiveDocument();
    pDoc->SendCmd(s,FALSE);
}

BOOL CMyBar::Exclude(CString &s, CString e1, CString e2, BOOL space)
{
	int i,j;
	i=s.Find(e1);
	if(i!=-1)
	{
		j=s.Find(e2,i);
		if(j!=-1)
		{
			s=space?s.Left(i)+' '+s.Mid(j+e2.GetLength())
				:s.Left(i)+s.Mid(j+e2.GetLength());
			return TRUE;
		}
	}

	return FALSE;
}

void CMyBar::ChangeList(CString s)
{
	CMainFrame* pFrame=(CMainFrame*)AfxGetMainWnd();
	pFrame->SetWhoEdit(s);
}

void CMyBar::OnListFont(UINT nID)
{
	int n;
	if(nID==IDM_LISTFONT1)
		n=110;
	else if(nID==IDM_LISTFONT3)
		n=90;
	else
		n=100;
	m_font.DeleteObject();
	if(m_font.CreatePointFont(n, "宋体"))
	{
		m_tab.SetFont(&m_font);
		m_btRefresh.SetFont(&m_font);
		m_mapBox.SetFont(&m_font);
		for (int i=0; i<m_listArray.GetSize(); i++)
			m_listArray[i]->SetFont(&m_font);
	}
}

void CMyBar::OnListMenu(UINT nID)
{
	int i=nID-IDM_LISTMENU;
	SendCmd(m_sListMenu[i]);
}

BOOL CMyBar::Exclude1(CString &s, CString e1, CString es)
{
	CString temp;
	int n=s.Find(e1);
	if(n!=-1)
	{
		temp=s;
		s=temp.Left(n);
		for(int i=n+e1.GetLength();i<temp.GetLength();i++)
		{
			for(int j=0;j<es.GetLength();j++)
			{
				if(temp[i]==es[j])
				{
					s+=temp.Mid(i+1);
					return TRUE;
				}
			}
		}
	}

	return FALSE;

}

void CMyBar::ReadData(CString &str, LPCTSTR sect, LPCTSTR key)
{
	str = AfxGetApp()->GetProfileString(sect, key, "");
	str.Replace("\\r", "\r");
	str.Replace("\\n", "\n");
}

⌨️ 快捷键说明

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