/*
创建窗口
win32窗口的创建过程主要有6部分
1.头文件与主函数、2.创建窗口结构体、3.注册窗口、4.创建窗口、5.显示窗口、6.消息循环、7.回掉函数
头文件:windows.h
主函数:int WINAPI WinMain( HINSTANCE hlnstance, //句柄:一个数,窗口唯一标识
HINSTANCE hPrevlnstance, //前一个句柄
LPTSTR lpCmdLine,//传递给应用程序的命令行参数
int nCmdShow)//指定窗口的显示方式 隐藏 最大最小显示
返回值:int
WINAPI:调用约定, 主要是参数的入栈顺序,这个栈空间的清理者,__stdcall,APIENTRY,本质都是一样的
WinMain:主函数的写法,注意不是main
*/
#include<time.h>
#include<stdlib.h>
#include<windows.h>
//定时器ID
#define DEF_TIMER1 1234
//创建兼容性DC
void OnPaint(HDC hDc);
//显示方块
void PaintSpare(HDC hMemDC);
//随机小方块
int CreateRandmSqare();
//随机小方块贴进背景
void CopySqareToBack();
//初始化
void OnCreate();
//回车键函数
void OnReturn(HWND hWnd);
//方块下落
void SqareDwon();
//定时器相应函数
void OnTimer(HWND hWnd);
//方块停在最底下 0 不可以下落 1可以下落
int CanSgareDown();
//下落
int CanSgareDown2();
//将1变成2
void Change1To2();
//显示2
void ShowSqare2(HDC hMemDC);
//左键
void OnLeft(HWND hWnd);
//左移
void SqareLeft();
//方块在最左面 0 不可以左移 1可以左移
int CanSgareLeft();
//左移限制
int CanSgareLeft2();
//右键
void OnRight(HWND hWnd);
//右移
void SqareRight();
//方块在最右面 0 不可以右移 1可以右移
int CanSgareRight();
//右移限制
int CanSgareRight2();
//加速向下
void OnDown(HWND hWnd);
//变形 上键
void OnUp(HWND hWnd);
//3 * 3变形
void ChangeSqare();
//3 * 3变形限制
int CanSqareChangeSape();
//长条变形
void ChangeLineSqare();
//长条变形限制
int CanLineSqareChange();
//消除已满的行数
void DestroyOneLineSqare();
//显示分数
void ShowScore(HDC hMemDC);
//游戏结束
int CanGomeOver();
//7.回掉函数
// 回调函数 一个窗口对应一个窗口句柄
//long类型 调用约定 函数名字(窗口句柄,无符号整形消息的ID, 参数 3无符号整形 4long 传递信息自己定可以)
LRESULT CALLBACK PELouSi(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParan)
{
PAINTSTRUCT pt;
HDC hDC;//可以画的范围 也就是用户窗口可操作的范围(标识)
switch (nMsg)
{
case WM_CREATE://窗口消息处理程序接收的第一个消息-也是回掉函数的第一个消息-是WM_CREATE 这个消息只产生一次,一般用于初始化一些数据
OnCreate();
break;
//回掉函数的第二个消息
//当窗口显示区域的一部分显示内容或者全部变为“无效”,以至于必须“更新画面”时,将由这个消息通知程序
//窗口结构体的最后那个成员CS_HREDRAW | CS_VREDRAW,目的就是窗口大小发生变化的时候,产生WM_PAINT消息
//窗口重叠时,重叠部分渐渐出现时
case WM_TIMER://定时器消息
OnTimer(hWnd);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd, &pt);//画窗口内容开始 有用getDC的
OnPaint(hDC);//画图的函数
EndPaint(hWnd, &pt);//画窗口内容结束
break;
case WM_KEYDOWN://WM_KEYDOWN键盘安下
switch (wParam)//wParam回掉函数第三个参数 区分是按得那个键
{
case VK_RETURN://回车键
OnReturn(hWnd);//开始
break;
case VK_LEFT://左键
OnLeft(hWnd);//左移
break;
case VK_RIGHT://右键
OnRight(hWnd);//右移
break;
case VK_UP://上键
OnUp(hWnd);//变形
break;
case VK_DOWN://下键
OnDown(hWnd);//加速
break;
}
break;
case WM_DESTROY://点×三种消息依次产生: WM_CLOSE -> WM_DESTROY销毁窗口 -> WM_QUIT退出消息 W:windows M:消息
KillTimer(hWnd, DEF_TIMER1);
PostQuitMessage(0);//传递退出消息
break;
}
return DefWindowProc(hWnd, nMsg, wParam, lParan);//功能 没有处理的消息系统自动处理 保证系统的连贯性 什么都不做 每次在窗口有点击、输入都会有消息
}
//1.头文件与主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) //错误C2731“WinMain”: 无法重载函数
//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//2.创建窗口结构体
//初始化窗口类
WNDCLASSEX wc;
HWND hWnd;
MSG mSg; //MSG 消息的结构体
//12个成员不能多不能少 要不 失败
wc.cbClsExtra = 0;//紧跟在窗口类尾部的一块额外的空间,不用设为0。
wc.cbSize = sizeof(WNDCLASSEX);//类的大小
wc.cbWndExtra = 0;//拓展窗口对话框
wc.hbrBackground = (HBRUSH)COLOR_SCROLLBAR;//背景颜色COLOR_BACKGROUND
wc.hCursor = NULL;//光标样式 LoadCursor(句柄系统定义填NULL 加载自定义填hInstance,样式 自定义添加资源文件)
wc.hIcon = NULL;//任务栏显示的图标 LoadIcon(句柄系统定义填NULL 加载自定义填hInstance,样式 自定义添加资源文件)
wc.hIconSm = NULL;//窗口左上角的图标 如果为空则默认为任务栏的图标
wc.hInstance = hInstance;//当前窗口的句柄 //句柄又系统传递
wc.lpfnWndProc = PELouSi;//回掉函数函数地址
wc.lpszClassName = "elsfk";//窗口类的名字 名字不要重复 给系统看的 不是最上面那个名字
wc.lpszMenuName = NULL; //菜单
wc.style = CS_HREDRAW | CS_VREDRAW;///窗口显示风格 垂直刷新 水平刷新 最大化等
//3.注册窗口对象
if (0 == RegisterClassEx(&wc))//如果注册失败
{
//出错 不知道什么原因
int a = GetLastError();//用这个函数 返回一个值
return 0;
}
//4.创建窗口
hWnd = CreateWindowEx(WS_EX_TOPMOST, "elsfk", "俄罗斯方块", WS_OVERLAPPEDWINDOW, 100, 100, 500, 646, NULL, NULL, hInstance, NULL);
//(附加属性 (WS_EX_TOPMOST总是在最前端),
//窗口类的名字 名字不要重复 给系统看的 不是最上面那个名字 与上面的一样,
//窗口的名字 左上角的 人你看的... ,
//指定窗口的风格,
//int x;相对于桌面 坐标 是像素 左,
------------华丽的分割线--------------
最近两天,我没有坚持发文章,我想要不断给大家更新内容,可是我真的不知道要发什么内容。每次发源码的时候很多人都会因为编译器的原因运行不出来,这个也不排除,因为每个人使用的编译器都不一样。
我发现很多人都会问这几个问题
1、什么是编程?
答:编程=语言+平台
2、新手应该学什么语言?
答:新手建议先从C语言开始学,因为C语言是计算机入门语言,c++ 、Java、c#等都是借鉴了C语言的语法。
3、我到底该学什么语言?
答:----别问,学就对了;任何语言都是从基础开始学习!
经过长时间精心备课,杨老师的C语言系统已经上线,本期共包含22节课,课程为标准C语言课程,课程内容见下图,希望大家能把握好这期课,达到完美的学习效果。
课程包含内容:
数据类型、进制转换、运算符、循环语句、开关分支语句、函数、数组、字符串、指针、结构体、内存管理、文件操作函数指针、指针函数、多维数组、高级指针、
这期课程上课时间是:
每天晚上一节课
每节课是一个小时共:22节课
前20名支付是20元,优惠名额过了后面报名的学员是50元。
满30人开班,早点报名早点学习!
已付款的同学提供转账截图并微信联系我。最后希望大家都能学到更多的技术和知识。本期课会重新建微信课堂群,以便共享学习资料和杨老师与大家的提问和互动。
小编的微信号:ma146009
零基础入门点击原文阅读
我来说两句排行榜