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

📄 statetable.cpp

📁 这是一个编译原理中
💻 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 + -