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

📄 windows窗口.cpp

📁 Astar windows版本 Astar windows版本
💻 CPP
字号:
#include <windows.h>
#include "resource.h"
#include <stdio.h>
#include <fstream>
#include <time.h>
#include "Astart.h"
#include "List.h"
#include "List.cpp"

using namespace std;
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
const int WINDOW_WIDTH = 1280;
const int WINDOW_HEIGHT = 770;
HINSTANCE hInst;	// 当前实例
HWND hStatic;
HWND hWnd;
HBRUSH bluebrush;
HBRUSH greenbrush;
HBRUSH redbrush;
HPEN pen,bluepen,greenpen,redpen;
HDC hdc;
bool start = false;
bool over = false;
int begin = 0;
int end = 0;
int map[37][64];
int direction[4][2]={{0,1},{1,0},{-1,0},{0,-1}}; 
// 此代码模块中包含的函数的前向声明:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void Update();
void ReadMap();
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: 在此放置代码。
	MSG msg;
	// 初始化全局字符串
	MyRegisterClass(hInstance);
	// 执行应用程序初始化:
	if (!InitInstance (hInstance, nCmdShow)) 
	{
		return FALSE;
	}
	for(int i=0;i<37;i++)
	{
		for(int j=0;j<64;j++)
		{
			map[i][j] = 0;
		}
	}
	ReadMap();
	hdc = GetDC(hWnd);
	pen = ::CreatePen(PS_SOLID,1,RGB(255,255,255));
	bluepen = ::CreatePen(PS_SOLID,1,RGB(0,0,255));
	greenpen = ::CreatePen(PS_SOLID,1,RGB(0,255,0));
	redpen = ::CreatePen(PS_SOLID,1,RGB(255,0,0));
	bluebrush = ::CreateSolidBrush(RGB(0,0,255));
	greenbrush = ::CreateSolidBrush(RGB(0,255,0));
	redbrush = ::CreateSolidBrush(RGB(255,0,0));
	SelectObject(hdc,pen);
	for(int i=0;i<=37*20;i+=20)
	{
		MoveToEx(hdc,0,i,NULL);
		LineTo(hdc,1280,i);
	}
	for(int i=0;i<=1280;i+=20)
	{
		if(i==1280)
		{
			MoveToEx(hdc,i-1,0,NULL);
			LineTo(hdc,i-1,740);
		}
		else
		{
			MoveToEx(hdc,i,0,NULL);
			LineTo(hdc,i,740);
		}
	}
	Update();
	while (true) 
	{
		if(KEYDOWN(VK_ESCAPE))
		{
			SendMessage(hWnd,WM_DESTROY,0,0);
		}
		if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )
       {
			if(msg.message==WM_QUIT)
				break;
            TranslateMessage( &msg );
            DispatchMessage( &msg );
       }
	}
	return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(NULL, IDI_INFORMATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDR_MENU1);
	wcex.lpszClassName	= "LuJian";
	wcex.hIconSm		= LoadIcon(wcex.hInstance, NULL);
	return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // 将实例句柄存储在全局变量中

   hWnd = CreateWindow(	"LuJian",
						"windows",
						WS_POPUP,
						GetSystemMetrics(SM_CXSCREEN),
						GetSystemMetrics(SM_CYSCREEN),
						CW_USEDEFAULT,
						CW_USEDEFAULT,
						NULL,
						NULL,
						hInstance,
						NULL);
   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd,SW_MAXIMIZE);
   UpdateWindow(hWnd);

   return TRUE;
}

void Update()
{
	SelectObject(hdc,pen);
	for(int i=0;i<=37*20;i+=20)
	{
		MoveToEx(hdc,0,i,NULL);
		LineTo(hdc,1280,i);
	}
	for(int i=0;i<=1280;i+=20)
	{
		if(i==1280)
		{
			MoveToEx(hdc,i-1,0,NULL);
			LineTo(hdc,i-1,740);
		}
		else
		{
			MoveToEx(hdc,i,0,NULL);
			LineTo(hdc,i,740);
		}
	}
	for(int i=0;i<37;i++)
	{
		for(int j=0;j<64;j++)
		{
			int x = j*20;
			int y = i*20;
			if(map[i][j] == 1)
			{
				SelectObject(hdc,bluepen);
				SelectObject(hdc,bluebrush);
				if(x == 63*20)
				{
					Rectangle(hdc,x+1,y+1,x+19,y+20);
				}
				else
				{
					Rectangle(hdc,x+1,y+1,x+20,y+20);
				}
			}
			else if(map[i][j] == 2)
			{
				SelectObject(hdc,greenpen);
				SelectObject(hdc,greenbrush);
				if(x == 63*20)
				{
					Rectangle(hdc,x+1,y+1,x+19,y+20);
				}
				else
				{
					Rectangle(hdc,x+1,y+1,x+20,y+20);
				}
				start = true;
				begin = i*64 + j;
			}
			else if(map[i][j] == 3)
			{
				SelectObject(hdc,redpen);
				SelectObject(hdc,redbrush);
				if(x == 63*20)
				{
					Rectangle(hdc,x+1,y+1,x+19,y+20);
				}
				else
				{
					Rectangle(hdc,x+1,y+1,x+20,y+20);
				}
				over = true;
				end = i*64 + j;
			}
		}
	}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId;
	switch (message) 
	{
	case WM_PAINT:
		Update();
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_COMMAND:
		{
			wmId = LOWORD(wParam); 
			switch(wmId)
			{
			case ID_SAVE:
				{
					ofstream out("try.map");
					for(int i=0; i<37; i++)
					{
						for(int j=0; j<64; j++)
						{
							out<<map[i][j]<<" ";
						}
						out<<endl;
					}
					out.close();
				}
				break;
			case ID_RESET:
				{
					HBRUSH backbrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
					SelectObject(hdc,backbrush);
					RECT rect;
					GetClientRect(hWnd,&rect);
					Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);
					SelectObject(hdc,pen);
					for(int i=0;i<=37*20;i+=20)
					{
						MoveToEx(hdc,0,i,NULL);
						LineTo(hdc,1280,i);
					}
					for(int i=0;i<=1280;i+=20)
					{
						if(i==1280)
						{
							MoveToEx(hdc,i-1,0,NULL);
							LineTo(hdc,i-1,740);
						}
						else
						{
							MoveToEx(hdc,i,0,NULL);
							LineTo(hdc,i,740);
						}
					}
					for(int i=0;i<37;i++)
					{
						for(int j=0;j<64;j++)
						{
							map[i][j] = 0;
						}
					}
					start = false;
				}
				break;
			case ID_START:
				{
					SetBkColor(hdc,RGB(0,0,0));
					SetTextColor(hdc,RGB(255,255,255));
					TextOut(hdc,400,745,"                                  ",(int)strlen("                                  "));
					Astart astart(map,64,37,begin,end);
					if(!astart.Find())
					{
						SetBkColor(hdc,RGB(0,0,0));
						SetTextColor(hdc,RGB(255,255,255));
						TextOut(hdc,400,745,"没有可以到达的路线",(int)strlen("没有可以到达的路线"));
						break;
					}
					astart.GetResult();
					for(int i=astart.value_list.Length(); i>=1; i--)
					{
						DWORD w1 = GetTickCount();
						Rect a;
						astart.value_list.Find(i,a);
						int x = a.map_x *20;
						int y = a.map_y *20;
						SelectObject(hdc,redpen);
						SelectObject(hdc,redbrush);
						if(x == 63*20)
						{
							Rectangle(hdc,x+1,y+1,x+19,y+20);
						}
						else
						{
							Rectangle(hdc,x+1,y+1,x+20,y+20);
						}
						while(GetTickCount() - w1 <= 10);
					}
				}
				break;
			default:
				return DefWindowProc(hWnd, message, wParam, lParam);
			}
		}
		break;
	case WM_MOUSEMOVE:
		{
			char buffer[13] = {};
			sprintf(buffer,"X=%d,Y=%d",LOWORD(lParam),HIWORD(lParam));
			SetBkColor(hdc,RGB(0,0,0));
			SetTextColor(hdc,RGB(255,255,255));
			TextOut(hdc,10,745,buffer,(int)strlen(buffer));
		}
		break;
	case WM_LBUTTONDOWN:
		{
			char buffer[15] = {};
			int x = LOWORD(lParam);
			int y = HIWORD(lParam);
			x=x/20*20;
			y=y/20*20;
			if(map[y/20][x/20] == 1)
			{
				map[y/20][x/20] = 0;
				SelectObject(hdc,pen);
				SelectObject(hdc,GetStockObject(BLACK_BRUSH));
				Rectangle(hdc,x,y,x+21,y+21);
			}
			else if(map[y/20][x/20] == 2)
			{
				start = false;
				map[y/20][x/20]=1;
				SelectObject(hdc,bluepen);
				SelectObject(hdc,bluebrush);
				Rectangle(hdc,x+1,y+1,x+20,y+20);
			}
			else
			{
				map[y/20][x/20]=1;
				SelectObject(hdc,bluepen);
				SelectObject(hdc,bluebrush);
				Rectangle(hdc,x+1,y+1,x+20,y+20);
			}
			sprintf(buffer,"X=%d,Y=%d",LOWORD(lParam),HIWORD(lParam));
			SetBkColor(hdc,RGB(0,0,0));
			SetTextColor(hdc,RGB(255,255,255));
			TextOut(hdc,10,745,buffer,(int)strlen(buffer));
		}
		break;
	case WM_RBUTTONDOWN:
		{
			char buffer[15] = {};
			int x = LOWORD(lParam);
			int y = HIWORD(lParam);
			x=x/20*20;
			y=y/20*20;
			if(!start)
			{
				start = true;
				SelectObject(hdc,greenpen);
				SelectObject(hdc,greenbrush);
				Rectangle(hdc,x+1,y+1,x+20,y+20);
				sprintf(buffer,"X=%d,Y=%d",LOWORD(lParam),HIWORD(lParam));
				SetBkColor(hdc,RGB(0,0,0));
				SetTextColor(hdc,RGB(255,255,255));
				TextOut(hdc,10,745,buffer,(int)strlen(buffer));
				map[y/20][x/20]=2;
				begin = y/20*64 + x/20;
			}
			else
			{
				if(!over)
				{
					SelectObject(hdc,redpen);
					SelectObject(hdc,redbrush);
					Rectangle(hdc,x+1,y+1,x+20,y+20);
					sprintf(buffer,"X=%d,Y=%d",LOWORD(lParam),HIWORD(lParam));
					SetBkColor(hdc,RGB(0,0,0));
					SetTextColor(hdc,RGB(255,255,255));
					TextOut(hdc,10,745,buffer,(int)strlen(buffer));
					map[y/20][x/20]=3;
					end = y/20*64 + x/20;
				}
				else
				{
					map[end/64][end%64] = 0;
					SelectObject(hdc,pen);
					SelectObject(hdc,GetStockObject(BLACK_BRUSH));
					Rectangle(hdc,(end%64)*20,(end/64)*20,(end%64*20)+21,(end/64*20)+21);
					over = false;
				}
			}
		}
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}
void ReadMap()
{
	ifstream in("try.map");
	for(int i=0;i<37;i++)
	{
		for(int j=0;j<64;j++)
		{
			in>>map[i][j];
		}
	}
	in.close();
}

⌨️ 快捷键说明

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