📄 mybar.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 + -