当前位置:网站首页>els 键盘信息
els 键盘信息
2022-07-28 02:06:00 【joker_0030】
1、主函数(els_main.c)
#include<Windows.h>
#include"resource.h"
#include"els_h.h"
LRESULT CALLBACK PELouSi(HWND hWnd, UINT oMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR ipCmdLine,int nCmdShow)
{
//初始化窗口类。
WNDCLASSEX db;
HWND hWnd;
MSG msg;//结构体变量。
db.cbClsExtra = 0;
db.cbSize = sizeof(WNDCLASSEX);
db.cbWndExtra = 0;
db.hbrBackground = (HBRUSH)COLOR_BACKGROUND;//背景颜色。
//返回值:鼠标的句柄。
// 参数1:如果加载系统光标,NULL、如果加载自定义光标,填写实列句柄,hInstance;参数2:系统光标,直接填写定义好的宏、如果加载自定义光标,就用MAKEINTRESOURCE(240)加载相应的资源ID。
//db.hCursor = LoadCursor(NULL,IDC_HAND);//加载系统定义的光标。
db.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE (IDC_NODROP));//自定义的光标。资源文件->添加->资源->Cursor->IDC_NODROP->新建。
//返回值:图标的句柄。
// 参数1:如果加载系统光标,NULL、如果加载自定义光标,填写实列句柄,hInstance;参数2:系统光标,直接填写定义好的宏、如果加载自定义光标,就用MAKEINTRESOURCE(240)加载相应的资源ID。
//db.hIcon = LoadIcon(NULL,IDI_ASTERISK);//加载系统定义的光标。
db.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));//状态栏图标。
//db.hIconSm = NULL;//左上角图标为此定义。如果为空则默认为状态栏图标。
db.hIconSm = LoadIcon(NULL,IDI_HAND);
db.hInstance = hInstance;
db.lpfnWndProc = PELouSi;//回调函数名。
db.lpszClassName = "els";
db.lpszMenuName = NULL;
db.style = CS_HREDRAW | CS_VREDRAW;
if(0==RegisterClassEx(&db))
{
int a = GetLastError();
return 0;
}
//创建窗口。hWnd窗口句柄 失败返回NULL。
//窗口风格:参数4。
hWnd=CreateWindowEx(WS_EX_TOPMOST,"els","els方块",WS_OVERLAPPEDWINDOW,100,100,500,600,NULL,NULL,hInstance,NULL);
if (NULL == hWnd)//窗口句柄。 窗口的唯一标识。
{
return 0;
}
//显示窗口
ShowWindow(hWnd, nCmdShow);
//消息循环。队列。
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//回调函数
//返回值:LRESULT,CALLBACK调用约定。
//参数1:窗口句柄;参数2:消息ID。
LRESULT CALLBACK PELouSi(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)// LRESULT:long类型;UINT:无符号整型,消息的ID。
{
PAINTSTRUCT pt;//定义结构体。
HDC hDc;
//关闭窗口消息
switch (nMsg)
{
case WM_CREATE://窗口信息处理程序接受的第一个消息,也是回调函数处理的第一个消息(为WM_CREATE)。此消息只产生一次,一般是用于初始化一些数据。
//GetLastError();//优化。
Oncreate();//游戏数据初始化。
break;
//是回调函数处理的第二个消息(为WM_PAINT)。
//当窗口显示区域的一部分显示内容或者全部变为(无效),以致于必须(更新画面)时,将由这个消息通知程序。
//窗口结构的最后的那个成员CS_HREDRAW|CS_VREDRAW,目的就是窗口大小发生变化的时候,产生WM_PAINT消息。
//窗口重叠时,重叠部分渐渐出现时。
case WM_PAINT:
//GetLastError();//优化。
hDc=BeginPaint(hWnd,&pt);//getDC,窗口可操作区域的标识。
//在此之间画窗口的内容。
//画方块。
OnPaint(hDc);//增加代码可读性。
EndPaint(hWnd, &pt);//结束。
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
OnReturn();
break;
case VK_LEFT:
break;
case VK_RIGHT:
break;
case VK_UP:
break;
case VK_DOWN:
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);//调用PostQuitMessage(0)这个函数发出WM_QUIT消息。//点叉系统依次产生WM_CLOSE,WM_DESTROY,WM_QUIT。
break;
}//手动处理点叉关闭消息。
return DefWindowProc(hWnd, nMsg, wParam, lParam);
//LRESULT a=DefWindowProc(hWnd, oMsg, wParam, lParam);//功能
//return a;
}
2.函数实现(els.c)
#include"els_h.h"
//背景数组
char g_arrBackGroud[20][10] = {0};
char g_arrSqare[2][4] = {0};
void OnPaint(HDC hDc)
{
//创建兼容性DC。
HDC hMemDC = CreateCompatibleDC(hDc);//内存id为:HMemDc,窗口id hDc。
//创建兼容性位图。
HBITMAP hBitmapBack= CreateCompatibleBitmap(hDc, 500, 600);
//关联起来。
SelectObject(hMemDC, hBitmapBack);
PaintSqare(hMemDC);
//传递:
//返回值:失败返回0,成功返回非零。
//参数1:目标DC,窗口DC
//参数2,3:目标的起始位置,注意是基于我们的窗口。
//参数4,5:区域的大小。
//参数6:源DC,也就是我们的内存DC。
//参数7,8:内存图片的起始位置。
//参数9:传递方式。
//
BitBlt(hDc, 0, 0, 300, 600, hMemDC, 0, 0, SRCCOPY);
//释放DC
DeleteObject(hBitmapBack);
DeleteDC(hMemDC);
}
void Oncreate()
{
srand((unsigned int)time(NULL));//只执行一次。
CreateRandomSqare();
CopySqareToBack();
}
void PaintSqare(HDC hMemDC)
{
int i = 0,
j = 0;
//画大方块。
Rectangle(hMemDC, 0, 0, 300, 600);//矩形框距离运行窗口的开始位置坐标和截至位置坐标。
//指定一个方块。
/*g_arrBackGroud[2][4] = 1;
g_arrBackGroud[3][3] = 1;
g_arrBackGroud[3][4] = 1;
g_arrBackGroud[3][5] = 1;*/
//遍历
for (i=0 ; i < 20; i++)
{
for (j=0 ; j < 10; j++)
{
if (1 == g_arrBackGroud[i][j])
{
//画方块。
Rectangle(hMemDC, j*30, i*30, j*30 + 30, i*30 + 30);//矩形框距离运行窗口的开始位置坐标和截至位置坐标。
}
}
}
}
//创建随机块。
int CreateRandomSqare()
{
int nIndex=rand()%7;
switch (nIndex)
{
case 0:
g_arrBackGroud[0][0] = 1, g_arrBackGroud[0][1] = 1, g_arrBackGroud[0][2] = 0, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 0, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 1, g_arrBackGroud[1][3] = 0;
break;
case 1:
g_arrBackGroud[0][0] = 0, g_arrBackGroud[0][1] = 1, g_arrBackGroud[0][2] = 1, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 1, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 0, g_arrBackGroud[1][3] = 0;
break;
case 2:
g_arrBackGroud[0][0] = 1, g_arrBackGroud[0][1] = 0, g_arrBackGroud[0][2] = 0, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 1, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 1, g_arrBackGroud[1][3] = 0;
break;
case 3:
g_arrBackGroud[0][0] = 0, g_arrBackGroud[0][1] =0 , g_arrBackGroud[0][2] = 1, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 1, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 1, g_arrBackGroud[1][3] = 0;
break;
case 4:
g_arrBackGroud[0][0] = 0, g_arrBackGroud[0][1] = 1, g_arrBackGroud[0][2] = 0, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 1, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 1, g_arrBackGroud[1][3] = 0;
break;
case 5:
g_arrBackGroud[0][0] = 0, g_arrBackGroud[0][1] = 1, g_arrBackGroud[0][2] = 1, g_arrBackGroud[0][3] = 0;
g_arrBackGroud[1][0] = 0, g_arrBackGroud[1][1] = 1, g_arrBackGroud[1][2] = 1, g_arrBackGroud[1][3] = 0;
break;
case 6:
g_arrBackGroud[0][0] = 1, g_arrBackGroud[0][1] = 1, g_arrBackGroud[0][2] = 1, g_arrBackGroud[0][3] = 1;
g_arrBackGroud[1][0] = 0, g_arrBackGroud[1][1] = 0, g_arrBackGroud[1][2] = 0, g_arrBackGroud[1][3] = 0;
break;
}
return nIndex;
}
void CopySqareToBack()
{
int i = 0,
j = 0;
for (i = 0; i < 2; i++)
{
for (j = 0; j < 4; j++)
{
g_arrBackGroud[i][j + 3] = g_arrSqare[i][j];
}
}
}
void OnReturn()
{
}
3.头文件(els.h)
#ifndef N_d
#define N_d
#include<Windows.h>
#include<time.h>
void OnPaint(HDC hDc);
//显示方块。
void PaintSqare(HDC hMemDC);
//产生随机块。
int CreateRandomSqare();
//随机块贴近背景。
void CopySqareToBack();
void Oncreate();
//
void OnReturn();
#endif
边栏推荐
- Why is it that when logging in, you clearly use the account information already in the database, but still display "user does not exist"?
- Chapter III queue
- The applet has obtained the total records and user locations in the database collection. How to use aggregate.geonear to arrange the longitude and latitude from near to far?
- style=“width: ___“ VS width=“___“
- CNN循环训练的解释 | PyTorch系列(二十二)
- GAMES101复习:光线追踪(Ray Tracing)
- selenium+pytest+allure综合练习
- Collision and rebound of objects in unity (learning)
- tfx airflow 使用体验
- NPDP考生!7月31号考试要求在这里看!
猜你喜欢

Interpretation of cesium3dtilesets using customshader and examples of Omni effects

Selenium+pytest+allure comprehensive exercise

Deep residual learning for image recognition shallow reading and Implementation

CNN中的混淆矩阵 | PyTorch系列(二十三)

微服务架构统一安全认证设计与实践

Chapter III queue

PS simple to use

vscode debug显示多列数据

JS 事件对象2 e.charcode字符码 e.keyCode键码 盒子上下左右移动

Docker advanced -redis cluster configuration in docker container
随机推荐
Redis aof日志持久化
Data Lake: database data migration tool sqoop
Confusion matrix in CNN | pytorch series (XXIII)
Chapter III queue
NPDP考生!7月31号考试要求在这里看!
优炫数据库客户端如何认证
tfx airflow 使用体验
Pychart shortcut key for quickly modifying all the same names on the whole page
[stream] parallel stream and sequential stream
Why is it that when logging in, you clearly use the account information already in the database, but still display "user does not exist"?
入职华为od一个月的感受
【OpenGL】GLES20.glClear
Es6.--promise, task queue and event cycle
@Valid的作用(级联校验)以及常用约束注解的解释说明
【stream】stream流基础知识
CNN training cycle reconstruction - hyperparametric test | pytorch series (XXVIII)
Day 8 of DL
数据湖:海量日志采集引擎Flume
Using pytorch's tensorboard visual deep learning indicators | pytorch series (25)
Arm32进行远程调试