`

C/C++游戏之旅(一)————创建第一个win32窗体程序

阅读更多
好吧,废话少说,开始我们win32游戏编程,期待我们能够创造出赏心悦目的游戏。
首先,打开vs2010创建如下工程:

加上如下代码:
   
#define WIN32_LEAN_AND_MEAN 

#include <windows.h>       
#include <windowsx.h>      

//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
			       HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
			       LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
			       int ncmdshow//指明窗口如何显示
				   )
{
//显示消息框
MessageBox(
	NULL, //标识将被创建的消息框的拥有窗口。如果此参数为NULL,则消息框没有拥有窗口
	"哥的第一个窗口程序!!!",//消息框显示的文本信息
    "MY FIRST WINDOWS PROGRAM",//标题
    MB_OK | MB_ICONEXCLAMATION//决定显示哪种信息框
	);
//退出
return(0);
}


好了,开始运行吧!看看什么效果,如果出现了这个东东:

那就说明,你的环境没有问题了,可以继续我们下面的工作了,如果没有出现(找美丽的度娘吧!)。
做个简单的说明:WinMain是win32操作系统调用我们编写的程序的入口,MessageBox是显示消息框的函数,具体函数的入参、返回值和定义位置,可以查询winAPI文档,(如果没有找度娘。)
显然,这么弱智的东西,没什么好说的,下面为我们要编写的游戏做些准备吧!我需要一个窗口来展现游戏画面:
    第一步:创建窗体信息结构体(我坚信你的C语言相当棒),
            WNDCLASSEX winclass;//声明窗体信息结构体
            WNDCLASSEX的定义如下所示:
typedef struct tagWNDCLASSEXA {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;
,下面我来逐项赋值并解释其含义。
winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小
winclass.style=CS_VREDRAW|CS_HREDRAW;//设置窗口风格,宽和高改变时刷新窗口
winclass.lpfnWndProc=NULL;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空
//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0
winclass.cbClsExtra=0;
winclass.cbWndExtra=0;
winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标
winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标
winclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄
winclass.lpszClassName=NULL;//菜单资源,以后再作解释
winclass.lpszMenuName="WINCLASS_MY";//为自己创建的结构体赋别名,将来用它可以来引用该结构体
winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标
至此,结构体创建完毕。
     第二步:注册windows结构体
//注册结构体
RegisterClassEx(&winclass);
    第三步:创建窗口
//创建窗口
HWND hwnd=NULL;
if(!(hwnd==CreateWindowEx(
NULL,
"WINCLASS_MY",
"哥的第一个窗口",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
0,
0,
400,
400,
NULL,
NULL,
hinstance,
NULL
))){
return(0);
}
至此,是不是可以运行程序得到窗体了哪?事实上是不可以的!
windows操作系统是基于消息事件机制的,还记得winclass.lpfnWndProc=NULL;这个属性吗?现在我们要给我们创建的窗体程序设置回调函数:
      第四步:窗体程序设置回调函数
//系统进程回调函数
LRESULT CALLBACK WindowProc(HWND hwnd,
    UINT msg,
                            WPARAM wparam,
                            LPARAM lparam)
{
PAINTSTRUCT ps;//图形绘制结构体
HDC hdc;//句柄
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;

default:break;

    }
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));

}
第五步:处理事件消息:
if(NULL==hwnd){
return(0);
}
//循环处理消息
while(TRUE)
{//获取消息
if (GetMessage(&msg,NULL,0,0))
   {
   //
       if (msg.message == WM_QUIT)
           break;
   //转换消息
   TranslateMessage(&msg);
   //发送消息给系统
   DispatchMessage(&msg);
   }
}
return(msg.wParam);
好了,现在可以编译,并运行程序了,出现窗口了吧!
最后给您贴上完整的程序:
#define WIN32_LEAN_AND_MEAN

#include <windows.h>       
#include <windowsx.h>
#include <stdio.h>
#include <math.h>
#define WINDOW_CLASS_NAME "MY_CLASS"

//系统进程回调函数
LRESULT CALLBACK WindowProc(HWND hwnd, 
						    UINT msg, 
                            WPARAM wparam, 
                            LPARAM lparam)
{
PAINTSTRUCT		ps;//图形绘制结构体	
HDC				hdc;//句柄	
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;

	default:break;

    }
//将消息队列中 不属于该进程的消息发送给系统进程
return (DefWindowProc(hwnd, msg, wparam, lparam));

}
//程序入口
int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄
			       HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL
			       LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine
			       int ncmdshow//指明窗口如何显示
				   )
{
WNDCLASSEX winclass;//声明窗体信息结构体
HWND hwnd=NULL;
MSG		   msg;		 

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);
}

//创建窗口
hwnd=CreateWindowEx(
	NULL,
	WINDOW_CLASS_NAME,
	"哥的第一个窗口",
	WS_OVERLAPPEDWINDOW|WS_VISIBLE,
	0,
	0,
	400,
	400,
	NULL,
	NULL,
	hinstance,
	NULL
	);
if(NULL==hwnd){
	return(0);
}
//循环处理消息
while(TRUE)
	{//获取消息
	if (GetMessage(&msg,NULL,0,0))
	   { 
	   //
       if (msg.message == WM_QUIT)
           break;
	   //转换消息
	   TranslateMessage(&msg);
	   //发送消息给系统
	   DispatchMessage(&msg);
	   }
	}
return(msg.wParam);
}
  • 大小: 45.8 KB
  • 大小: 9.8 KB
分享到:
评论

相关推荐

    C_C++语言硬件程序设计——基于TMS320C5000系列DSP

    《C/C++语言硬件程序设计——基于TMS320C5000系列DSP》是一本深入探讨如何使用C和C++编程语言进行数字信号处理(DSP)的专著,特别关注德州仪器(TI)的TMS320C5000系列 DSP 芯片。该书涵盖了从基础概念到高级应用的...

    Qt和C/C++实现的可视化景点旅游信息系统——包含详细注释与txt说明文件

    1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...

    MinGW64与32——C/C++快速配置编译环境

    所以通常我们会选择MinGW作为编译环境,这是一个开源免费的C/C++编译器配合一些第三方支持代码提示的编辑器(如VSCode)进行开发学习,然而,mingw-w64.org只能下载到32位安装器,mingw.org部分人反映域名被劫持,...

    C/C++源程序去注释工具

    标题 "C/C++源程序去注释工具" 暗示了这个压缩包包含一个用于删除C或C++源代码中的注释的程序。这样的工具在特定情况下可能会有用,例如在进行代码分析、保密处理或者简化代码阅读时。C/C++编程语言允许开发者通过...

    C/C++程序员实用大全-C/C++最佳编程指南

    《C/C++程序员实用大全——C/C++最佳编程指南》是一本专为C/C++开发者设计的详尽参考资料,旨在帮助读者深入理解这两种强大的编程语言,并掌握高效的编程实践。本书涵盖了从基础知识到高级特性的全面内容,对于初学...

    C++ Win32创建窗体

    在C++编程中,Win32 API是一种底层的编程接口,用于开发Windows操作系统上的应用程序。本文将深入探讨如何使用Win32 API创建窗体以及添加菜单,并实现菜单命令的功能。 一、Win32窗体的基本概念 Win32窗体是用户与...

    c/c++语言程序设计课件

    【标签】"C/C++" 标签明确了本课件的主题,C/C++是一种通用的、高级的编程语言,广泛应用于系统软件、嵌入式系统、游戏开发、高性能计算等多个领域。学习C/C++能为理解计算机工作原理提供坚实基础,并且为学习其他...

    C/C++程序四书五经

    本书分为两大部分,第一部分聚焦于C语言的核心特性,第二部分则详述了C标准库的使用。 - **内容亮点**:本书全面覆盖了C99、C89、传统C语言、各版本C运行库以及编写与C++兼容的C代码等知识体系,无论是初学者还是...

    C语言 C++程序设计完整版——谭浩强

    《C语言 C++程序设计完整版——谭浩强》是一份综合性的编程学习资源,包含了谭浩强教授编写的C语言和C++编程教程。这个压缩包中的内容旨在为初学者提供全面的基础知识,帮助他们掌握这两门重要的编程语言。 首先,...

    零基础学C/C++01——第一个程序Hello World!

    零基础学C/C++01——第一个程序Hello World! 答案很简单 只要学过c++ #include using namespace std; int main() { cout !" ; return 0; }

    Win32 C/C++编写的斗地主游戏程序源码

    Win32 C/C++编写的斗地主游戏程序源码,包括服务器与客户端程序,VS2005开发。 支持服务器定制(添加、删除、编辑所选服务器参数), 支持游戏大厅功能,支持常规的斗地主游戏及旁观功能,支持基本聊天功能。

    C语言C++零基础到实战——大新企业内部技术免费公开课文档.doc

    C++的设计目标是提供一个既支持过程化编程,又支持面向对象编程的系统,使得程序员可以灵活地选择编程范式。 1. **数据类型**: - 基本数据类型,如int、char、float、double等,用于表示整型、字符型和浮点型数据...

    达内 C/C++课件 适合初学者

    《C/C++编程初学者指南——达内科技课件解析》 C/C++是计算机科学领域中的基础且强大的编程语言,对于任何想要深入理解计算机工作原理或者追求高性能应用开发的人来说,学习C/C++是必不可少的步骤。达内科技作为...

    密码学:C/C++语言实现(第2版)

    作为一本密码学的书籍,本书叙述了一个重要的对称加密算法AES的理论及实现,还完整地实现了一个重要的非对称密码系统——RSA加密和RSA签名。作为一本算法实现的书籍,本书严格遵循软件开发原则,详细描述了设计思想...

    turbo c/c++ 3.0

    它只需要修改一个设置选项,就能够在同一个IDE集成开发环境下设计和编译以标准 C 和 C++ 语法设计的程序文件。 Turbo C++ 3.0 与 Turbo C 2.0 的主要区别: 1、Turbo C++ 3.0不仅能设计和编译C程序文件,而且修正...

    虚拟机的设计与实现——C/C++.pdf

    虚拟机的设计与实现——C/C++.pdf

    C/C++头文件包含

    在C/C++中,不要在同一条语句中包含一个变量的多个++/——,因为它们的解析在C/C++标准中没有规定,完全取决于编译器的个人行为。 平台无关性 C/C++是平台无关性语言,因此系统相关的process/GUI等不在标准C/C++库...

    c语言/c++信息管理系统 考勤管理系统

    本项目名为“C语言/C++信息管理系统——考勤管理系统”,它是一个适合课程设计或程序实训的实践项目,旨在帮助学习者掌握C语言和C++编程技能,同时理解信息管理系统的基本原理。 首先,我们来了解一下C语言和C++这...

    第一个c++程序(csdn)————程序.pdf

    这个标题提到的“第一个C++程序”通常是指初学者接触C++时编写的入门级代码,旨在介绍语言的基本结构和概念。 C++的起源可以追溯到C语言,它在C的基础上添加了类和面向对象特性。因此,C++能够兼容C语言的语法,如...

    win32窗体贪吃蛇c++代码

    【标题】"win32窗体贪吃蛇c++代码"是一个基于Windows 32 API开发的C++项目,它实现了一个经典的贪吃蛇游戏。这个项目不仅提供了基础的贪吃蛇游戏功能,而且在代码中包含了详尽的注释,帮助读者理解每个部分的作用,...

Global site tag (gtag.js) - Google Analytics