📄 statetable.cpp
字号:
#include <windows.h>
#include "DFA.h"
extern int RULE_NUM;
extern STATE_CHANGE StateChangeTable[];
static HFONT PrepareFont();
static RECT GetGrid(int,int);
static void WriteTableHead(HDC);
static void WriteTable(HDC);
LRESULT CALLBACK StateTableWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc,hMemDC;
HBITMAP hBitmap;
RECT rect;
int x,y;
HPEN hPen;
HFONT hFont;
HBRUSH hBrush;
static int highlight = -1;
STATE oldstate;
SYMBOL input;
switch(msg)
{
case WM_PAINT:
// 设置源设备描述表
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
// 设置目标设备描述表
hMemDC = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
SelectObject(hMemDC,hBitmap);
FillRect(hMemDC,&rect,(HBRUSH)GetStockObject(BLACK_BRUSH));
SetMapMode(hMemDC,MM_ISOTROPIC);
SetWindowExtEx(hMemDC,200,220,NULL);
SetViewportExtEx(hMemDC,rect.right,rect.bottom,NULL);
SetViewportOrgEx(hMemDC,10,10,NULL);
hPen = CreatePen(PS_SOLID,0,RGB(0,0,255));
SelectObject(hMemDC,hPen);
// 画表格
for(x = 0; x < 6; x++)
{
MoveToEx(hMemDC, x * 40,0,NULL);
LineTo(hMemDC,x * 40,180);
}
for(y = 0; y < 10; y++)
{
MoveToEx(hMemDC,0,y * 20,NULL);
LineTo(hMemDC,200,y * 20);
}
// 高亮显示转换使用的项
if (highlight >= 0)
{
oldstate = StateChangeTable[highlight].oldstate;
input = StateChangeTable[highlight].input;
rect = GetGrid(input + 2,oldstate + 2);
hBrush = CreateSolidBrush(RGB(255,0,0));
FillRect(hMemDC,&rect,hBrush);
DeleteObject(hBrush);
}
// 填写状态转换表
hFont = PrepareFont();
SelectObject(hMemDC,hFont);
SetTextColor(hMemDC,RGB(255,255,0));
SetBkMode(hMemDC,TRANSPARENT);
WriteTable(hMemDC);
// 位图复制
GetClientRect(hwnd,&rect);
SetMapMode(hdc,MM_ISOTROPIC);
SetWindowExtEx(hdc,200,220,NULL);
SetViewportExtEx(hdc,rect.right,rect.bottom,NULL);
SetViewportOrgEx(hdc,10,10,NULL);
BitBlt(hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY);
DeleteObject(SelectObject(hMemDC,GetStockObject(NULL_PEN)));
DeleteObject(SelectObject(hMemDC,GetStockObject(SYSTEM_FONT)));
DeleteDC(hMemDC);
DeleteObject(hBitmap);
EndPaint(hwnd,&ps);
return 0;
case WM_HIGHLIGHT:
highlight = lParam;
InvalidateRect(hwnd,NULL,FALSE);
return 0;
case WM_NCHITTEST:
return HTTRANSPARENT;
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
static HFONT PrepareFont()
{
LOGFONT font;
HFONT hFont;
font.lfHeight = 15;
font.lfEscapement = 0;
font.lfOrientation = 0;
font.lfWeight = FW_NORMAL;
font.lfItalic = FALSE;
font.lfUnderline = FALSE;
font.lfStrikeOut = FALSE;
font.lfCharSet = GB2312_CHARSET;
font.lfOutPrecision = OUT_DEFAULT_PRECIS;
font.lfClipPrecision = CLIP_DEFAULT_PRECIS;
font.lfQuality = DEFAULT_QUALITY;
font.lfPitchAndFamily = DEFAULT_PITCH;
lstrcpy(font.lfFaceName,TEXT("黑体"));
hFont = CreateFontIndirect(&font);
return hFont;
}
static RECT GetGrid(int x,int y)
{
RECT rect;
rect.left = (x - 1) * 40;
rect.top = (y - 1) * 20;
rect.right = x * 40;
rect.bottom = y * 20;
return rect;
}
static void WriteTableHead(HDC hdc)
{
TCHAR szOut[5];
RECT rect;
int x,y;
rect = GetGrid(2,1);
DrawText(hdc,TEXT("Sign"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect = GetGrid(3,1);
DrawText(hdc,TEXT("Digit"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect = GetGrid(4,1);
DrawText(hdc,TEXT("Point"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rect = GetGrid(5,1);
DrawText(hdc,TEXT("Exp"),-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
for(x = 1,y = 2; y <= 9; y++)
{
rect = GetGrid(x,y);
wsprintf(szOut,TEXT("Q%d"),y - 2);
DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
}
static void WriteTable(HDC hdc)
{
STATE oldstate,newstate;
SYMBOL input;
RECT rect;
TCHAR szOut[5];
int i;
SetTextColor(hdc,RGB(128,128,128));
WriteTableHead(hdc);
SetTextColor(hdc,RGB(255,255,0));
for(i = 0; i < RULE_NUM; i++)
{
oldstate = StateChangeTable[i].oldstate;
newstate = StateChangeTable[i].newstate;
input = StateChangeTable[i].input;
rect = GetGrid(input + 2,oldstate + 2);
wsprintf(szOut,TEXT("Q%d"),newstate);
DrawText(hdc,szOut,-1,&rect,DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -