windows游戏编程 创建WIN32一个HelloWOrld程序
本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22449085
作者:jadeshu 邮箱: jadeshu@qq.com 欢迎邮件交流
一开始我们得大致了解一个程序的运行过程,运行时得先启动一个程序,如下启动过程
1.WIN32程序启动过程就是进程的创建过程,系统调用CreateProcess函数创建新的进程(当一个线程调用CreateProcess函数时,系统会创建一个进程内核对象,其使用计数初始化为1.此进程内核对象不是进程本身,仅仅是一个系统用来管理这个进程的小的数据结构)
2.系统然后为新的进程创建一个虚拟地址空间,加载应用程序运行时所需的代码和数据
3.系统接着为新进程创建一个主线程(这个主线程通过执行C/C++运行期启动代码开始运行,C/C++运行期启动代码又会调用main函数。如果系统能够成功创建新的进程和进程的主线程,CreateProcess函数会返回TRUE,否则返回FALSE)
....运行程序
#include <windows.h>
#include <tchar.h>
HINSTANCE hInst; //窗口实例句柄
TCHAR szTitle[MAX_PATH] = _T("HelloWorld"); //窗口类名
TCHAR szWindowClass[MAX_PATH] = _T("szClass"); //窗口标题名
ATOM MyRegisterClass(HINSTANCE hInstance); //注册窗口类函数声明
BOOL InitInstance(HINSTANCE, int); //初始化实例函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //窗口回调函数声明
int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
MSG msg; //消息结构体
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0)) //消息循环
{
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(hInstance, IDI_APPLICATION); //加载图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //加载光标
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //窗口背景填充颜色
wcex.lpszMenuName = NULL; //菜单
wcex.lpszClassName = szWindowClass; //窗口类名
wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION); //加载小图标
return RegisterClassEx(&wcex); //注册窗口类
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); //创建窗口
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow); //显示窗口
UpdateWindow(hWnd); //更新窗口
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0); //退出
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
具体可以参看windows游戏编程<一>
需要了解的有以下几点:
1.Windows窗口类结构WNDCLASS WNDCLASSEX
2.注册窗口类
3.创建窗口
4.事件处理程序(窗口回调函数)
5.主事件循环(该实例的消息循环)
对于游戏是一个实时的循环,即你所需要的是一种检测在消息队列中是否有消息,如果有就处理它,没有就进行处理游戏逻辑等!
下面介绍几个函数的区别
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);
其唯一用途就是从事件对列中获得消息,并进行处理。当程序在等待通过
GetMessage 传递的消息时,主事件循坏基本上是锁定的。即,如果消息队列中没有消息,则GetMessage()不会返回,一直等待..
BOOL PeekMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax,
UINT wRemoveMsg
);
处理之后,消息已经从序列中去除怎样来实现实时事件循坏呢?通过利用PeekMessage 来判断消息序列中是否有消息,如果有,就处理它;否则直接返回,并不等待。
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
向窗口传递一个要求立即处理的消息。接收窗口处理完该消息后,该函数便紧接着 WinProc 返回。是同步的。
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
VC创建WIN32框架程序
1.打开VC
or
or....
2.
3.新建项目
4.选择WIN32项目点击确定 一直下一步直至完成
5.完成
接着编译运行即可
windows游戏编程 创建WIN32一个HelloWOrld程序的更多相关文章
- Windows Azure入门教学系列 (一): 创建第一个WebRole程序
原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言 ...
- SpringMVC基础入门,创建一个HelloWorld程序
ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要 ...
- 图解使用IDEA创建第一个Java程序HelloWorld
前几次给大家分享了怎么在自己的电脑上配置 java 环境,准备工作做好了,我们就要开始我们真正的编码学习了.下面介绍使用 IDEA 创建我们的第一个 HelloWorld 程序. 1.打开 IDEA, ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存
第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
- (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
- 76-Java安装Eclipse并创建第一个HelloWorld.md
76-Java安装Eclipse并创建第一个HelloWorld.md 首先确定已经安装Java系统环境,若未安装,请参考博客Java环境windows搭建 访问Eclipse官网 下载完成直接发送快 ...
- Node.js入门以及第一个helloworld程序
1.概念:简单的说 Node.js 就是运行在服务端的 JavaScript.学之前需要明白Node.js是无法挑战jsp.php或者asp这种老牌网站的地位的,是永远不会出现在证券.金融这种领域的. ...
- (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...
随机推荐
- javascript 垃圾回收机制和内存管理
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 垃圾回收机制的原理是找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大,所 ...
- js之split拆分字符串
js之split拆分字符串 1.单字符拆分 let arr = str.split(',') 2.多字符拆分 let arr = str.split(/[(),]/)
- sql计算两个时间之间的差,并用时分秒表示
这是自己写的方法,总觉得会有更好的办法实现这个效果呢? SELECT then ))))+'秒' then )))+'秒' then ))+'秒' else CONVERT(nvarchar,DATE ...
- Ubuntu的apt-get代理设置
三种方法 -o选项 # sudo apt-get -o Acquire::http::proxy="http://127.0.0.1:8080/" update 配置文件 # vi ...
- Java中程序、进程、线程的区别。
程序.进程.线程的区别. 程序(program):是一个指令的集合.程序不能独立执行,只有被加载到内存中,系统为他分配资源后才能执行. 进程(process):一个执行中的程序称为进程. 进程是系统分 ...
- flask自有转换器:int、float、path。默认string
flask自有转换器:int.float.path.默认string # 路由传递的参数默认当做string处理,这里指定int,尖括号中冒号后面的内容是动态的 # -*- coding: utf-8 ...
- Django中使用缓存
settings中的配置 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache ...
- NORDIC 关闭浮点运算FPU
1.打开FPU中断 NVIC_SetPriority(FPU_IRQn, APP_IRQ_PRIORITY_LOW);NVIC_EnableIRQ(FPU_IRQn); 2.中断中关闭FPU void ...
- 用js刷剑指offer(跳台阶)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 牛客网链接 思路 这一题和斐波那契数列思路完全一样. 假如青蛙从第n个 ...
- Hive系统函数之collect_list和collect_set
转自:https://www.cnblogs.com/cc11001100/p/9043946.html Hive中collect相关的函数有collect_list和collect_set. 它们都 ...