本文中我们将尝试着控制窗口中的小圆跟随者上下左右键的操作来移动,会涉及键盘事件响应,游戏帧数控制等一些类问题,废话少说,先贴上源码:
#include "main2.h"
#include "MENUs.h"
#define WIN32_LEAN_AND_MEAN
#include <stdlib.h>
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#include <mmsystem.h>
#define WINDOW_CLASS_NAME "MY_CLASS"
#define WINDOW_WIDTH GetSystemMetrics(SM_CXFULLSCREEN)
#define WINDOW_HEIGHT GetSystemMetrics(SM_CYFULLSCREEN)
// 图形的移动距离
int xv = 50;
int yv = 50;
// 图形的开始坐标
int ball_x = WINDOW_WIDTH/2;
int ball_y = WINDOW_HEIGHT/2;
int ball_x_old=WINDOW_WIDTH/2;
int ball_y_old=WINDOW_HEIGHT/2;
HWND hwnd=NULL;
HPEN black_pen=NULL;
HBRUSH black_brush=NULL;
HPEN white_pen=NULL;
HBRUSH green_brush=NULL;
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
PAINTSTRUCT ps;//图形绘制结构体
HDC hdc=NULL;//句柄
switch(msg)
{
case WM_CREATE: //窗口创建时
{
return(0);
} break;
case WM_PAINT: //窗口重绘时
{
hdc = BeginPaint(hwnd,&ps); //开始绘制
EndPaint(hwnd,&ps);//结束绘制
return(0);
} break;
case WM_DESTROY://窗口销毁时
{
PostQuitMessage(0);
return(0);
} break;
case WM_COMMAND:
{
switch(LOWORD(wparam))
{//老实说:我也不知道这个函数是什么意思,从何而来,起什么作用
case MENU_FILE_ID_EXIT:
{
// 退出
PostQuitMessage(0);
} break;
case MENU_FILE_ID_OPEN:
{
} break;
// handle each of sounds
case MENU_FILE_ID_CLOSE:
{
} break;
case MENU_FILE_ID_SAVE:
{
} break;
}
}
case WM_KEYDOWN:
{
switch(wparam)
{
case VK_RIGHT:
{
ball_x_old=ball_x;
ball_y_old=ball_y;
//移动图形
ball_x+=xv;printf("ball_x_old:%d ball_x:%d\n",ball_x_old,ball_x);
} break;
case VK_LEFT:
{
ball_x_old=ball_x;
ball_y_old=ball_y;
//移动图形
ball_x-=xv;printf("ball_x_old:%d ball_x:%d\n",ball_x_old,ball_x);
} break;
case VK_UP:
{
ball_x_old=ball_x;
ball_y_old=ball_y;
//移动图形
ball_y-=yv;printf("ball_y_old:%d ball_y:%d\n",ball_y_old,ball_y);
} break;
case VK_DOWN:
{
ball_x_old=ball_x;
ball_y_old=ball_y;
//移动图形
ball_y+=yv;printf("ball_y_old:%d ball_y:%d\n",ball_y_old,ball_y);
} break;
case VK_ESCAPE:
{
PostQuitMessage(0);
return(0);
}break;
}
}
default:break;
}
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));
}
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
int ncmdshow//指明窗口如何显示
)
{
WNDCLASSEX winclass;//声明窗体信息结构体
MSG msg;
HDC hdc;
winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_DBLCLKS | CS_OWNDC;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=WindowProc;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空。
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hInstance=hinstance;//系统传给winmain函数的句柄
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄。
winclass.lpszClassName=WINDOW_CLASS_NAME;//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.lpszMenuName=NULL;//菜单资源,以后再作解释
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标
//注册结构体
if(!RegisterClassEx(&winclass)){
return(0);
}
int x=GetSystemMetrics(SM_CXFULLSCREEN);//获取全屏 x的宽度
int y=GetSystemMetrics(SM_CYFULLSCREEN);//获取全屏 y的高度
//创建窗口
hwnd=CreateWindowEx(
NULL,
WINDOW_CLASS_NAME,
"哥的第一个窗口",
WS_POPUP|WS_VISIBLE,
0,
0,
x,
y,
NULL,
NULL,
hinstance,
NULL
);
if(NULL==hwnd){
return(0);
}
//得到图形设备描述表
hdc = GetDC(hwnd);
//创建花笔和刷子
white_pen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
black_pen = CreatePen(PS_SOLID, 1, RGB(0,0,0));
green_brush = CreateSolidBrush(RGB(0,255,0));
black_brush = CreateSolidBrush(RGB(0,0,0));
// 循环发送消息
while(TRUE)
{ DWORD startTime=GetTickCount();//记录系统启动之后运行到现在的时间
// 获取消息
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// 是否退出
if (msg.message == WM_QUIT)
break;
//转换消息
TranslateMessage(&msg);
// 发送消息
DispatchMessage(&msg);
}
// 图形设备描述表选择画笔和刷子
SelectObject(hdc, black_pen);
SelectObject(hdc, black_brush);
//画圆
Ellipse(hdc, ball_x_old, ball_y_old, ball_x_old + 50, ball_y_old + 50);
// 边界检测
if (ball_x < 0 ){
ball_x=0;
}
if(ball_x > WINDOW_WIDTH - 50)
{
ball_x=WINDOW_WIDTH - 50;;
}
// 边界检测
if (ball_y < 0){
ball_y=0;
}
if(ball_y > WINDOW_HEIGHT - 50)
{
ball_y=WINDOW_HEIGHT - 50;
}
// 图形设备描述表选择画笔和刷子
SelectObject(hdc, white_pen);
SelectObject(hdc, green_brush);
// 画圆
Ellipse(hdc, ball_x, ball_y, ball_x +50, ball_y + 50);
//设置游戏帧数为1000/33,即每秒30帧
while((GetTickCount()-startTime)<33);
}
//释放所有笔和刷子
DeleteObject(white_pen);
DeleteObject(black_pen);
DeleteObject(green_brush);
DeleteObject(black_brush);
//释放图形设备描述表
ReleaseDC(hwnd,hdc);
return(msg.wParam);
}
当你运行商上面的代码会看到一个小圆,用上下左右键去控制他,看看效果如何?
同时这也是我们后面编写程序的主要框架,也就是说,后面的代码都会在这个基础之上来修改,下一文中我们将会开始研究DirectX.
分享到:
相关推荐
c/c++完整视频教程(三)——–Linux服务器编程
C_C++语言硬件程序设计——基于TMS320C5000系列DSP
——代码完成于2021-11-12 整体思路: 用两个数组分别模拟 A->B 和B->A间通讯的信道。A、B两主机各自拥有独立线程。线程move用来模拟信道中信号的移动。线程show用于打印信道。其中线程move和show detach()后作为...
1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...
C语言C++零基础到实战——大新企业内部技术免费公开课文档.doc
本程序是采用带头结点的单向循环链表写成的,当指针指到要出列的结点时,先输出结点的序列号,再删除之,直到所有结点都出列完
大一上学期,C语言/C++结课大作业——交并补运算+Gui界面
虚拟机的设计与实现——C/C++.pdf
简要实现了C/C++中调用Lua脚本的技术。 通过用Lua脚本输出一个便签,来研究C/C++与Lua的交互技术。
在sublime 和其他需要自己配置c/c++环境时所需要的文件
c/c++完整视频教程(四)——–数据库(MySQL,Oracle)
c/c++中文帮助文档(API),包含c和c++所有的库函数
虚拟机的设计与实现——C/C++
c/c++完整视频教程(二)——–Cocos2dX跨平台游戏开发
C/C++程序员实用大全-C/C++最佳编程指南
所以通常我们会选择MinGW作为编译环境,这是一个开源免费的C/C++编译器配合一些第三方支持代码提示的编辑器(如VSCode)进行开发学习,然而,mingw-w64.org只能下载到32位安装器,mingw.org部分人反映域名被劫持,...
图书信息管理系统(可运行),C/C++实现,文件模拟数据库(没有使用mysql),upc2020年课程报告
通讯录程序含多项功能,且有基本备注,适合非专业学生课程设计,自己学习等
“Turbo C++ 3.0”软件是Borland公司在1992年推出的强大的——C语言程序设计与C++面向对象程序设计 的集成开发工具。它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计...
生死枪战游戏目前以3个模式运行(持续更新),玩家可以通过自己的喜好来选择,如:新手训练营,无限闯关,打怪,以及能调用时间而改变战力的暗月阁长老。更多特殊技能、特殊武器等你发掘! 改进或交流该游戏的建议...