📄 recognise.cpp
字号:
#include <windows.h>
#include "DFA.h"
static SYMBOL GetSymbolType(TCHAR);
static TCHAR RecogniseState[][30] =
{
TEXT("未完成的数"),
TEXT("正确的整数形式"),
TEXT("未完成的小数"),
TEXT("正确的小数形式"),
TEXT("未完成的指数"),
TEXT("正确的指数形式"),
TEXT("错误的输入")
};
static int GetRecogniseState(STATE state)
{
switch(state)
{
case Q0: case Q1: return 0;
case Q2: return 1;
case Q3: return 2;
case Q4: return 3;
case Q5:case Q6: return 4;
case Q7: return 5;
case MISTAKE: return 6;
}
return 6;
}
static SYMBOL GetSymbolType(TCHAR ch)
{
SYMBOL type;
type = WRONG;
if (ch == '+' || ch == '-') type = SIGN;
else if (ch >= '0' && ch <= '9') type = DIGIT;
else if (ch == '.') type = DOT;
else if (ch == 'e' || ch == 'E') type = EXP;
return type;
}
LRESULT CALLBACK RecogniseWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
static TCHAR szInput[BUFFER_LEN + 1];
static int nSymbols;
static STATE oldstate,newstate;
static DFA machine;
int highlight;
SYMBOL input;
TCHAR ch;
TCHAR szOut[MAX_PATH];
HFONT hFont;
switch(msg)
{
case WM_CREATE:
ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
nSymbols = 0;
oldstate = newstate = machine.GetState();
return 0;
case WM_CHAR:
ch = (TCHAR)wParam;
input = GetSymbolType(ch);
if (input != WRONG) // 输入的符号合法
{
if (nSymbols < BUFFER_LEN) szInput[nSymbols++] = ch;
else
{
ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
nSymbols = 0;
szInput[nSymbols++] = ch;
}
oldstate = newstate;
highlight = machine.Input(input);// 向自动机输入
newstate = machine.GetState(); // 取回新状态
PostMessage(GetDlgItem(GetParent(hwnd),2),WM_HIGHLIGHT,0,highlight);
InvalidateRect(hwnd,NULL,FALSE);
}
if (ch == VK_ESCAPE || ch == VK_RETURN)
{
ZeroMemory(szInput,sizeof(TCHAR) * (BUFFER_LEN + 1));
nSymbols = 0;
oldstate = newstate = machine.Reset();
InvalidateRect(hwnd,NULL,FALSE);
highlight = -1;
PostMessage(GetDlgItem(GetParent(hwnd),2),WM_HIGHLIGHT,0,highlight);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
FillRect(hdc,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
// 准备设备描述表
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,-200,-200,NULL);
SetViewportExtEx(hdc,rect.right,rect.bottom,NULL);
SetViewportOrgEx(hdc,rect.right,rect.bottom / 2,NULL);
hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SelectObject(hdc,hFont);
SetTextColor(hdc,RGB(0,255,0));
SetTextAlign(hdc,TA_RIGHT);
SetBkMode(hdc,TRANSPARENT);
// 原状态
rect.left = 5; rect.top = 20;
rect.right = 80; rect.bottom = 35;
if (oldstate != MISTAKE)
wsprintf(szOut,TEXT("原状态: Q%d"),oldstate);
else
{
rect.right = 120;
SetTextColor(hdc,RGB(255,0,0));
wsprintf(szOut,TEXT("原状态: ERROR"));
}
DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// 新状态
rect.left = 5; rect.top = -20;
rect.right = 80; rect.bottom = -35;
if (newstate != MISTAKE)
wsprintf(szOut,TEXT("新状态: Q%d"),newstate);
else
{
rect.right = 120;
SetTextColor(hdc,RGB(255,0,0));
wsprintf(szOut,TEXT("新状态: ERROR"));
}
DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
// 输入的字符串
if (nSymbols != 0)
{
TextOut(hdc,5,8,szInput,lstrlen(szInput));
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,5,8,szInput + lstrlen(szInput) - 1,1);
}
// 识别状态
rect.left = 50; rect.top = -80;
rect.right = 180; rect.bottom = -50;
SetTextColor(hdc,RGB(0,255,255));
DeleteObject(SelectObject(hdc,GetStockObject(SYSTEM_FONT)));
if (newstate != Q0)
{
int i;
i = GetRecogniseState(newstate);
if (i % 2 == 0) SetTextColor(hdc,RGB(255,0,0));
DrawText(hdc,RecogniseState[i],-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
else
DrawText(hdc,TEXT("等待输入……"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
DeleteObject(SelectObject(hdc,GetStockObject(NULL_PEN)));
EndPaint(hwnd,&ps);
return 0;
case WM_NCHITTEST:
return HTTRANSPARENT;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -