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