本系列文章由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 比 GetMessage 多了一个参数:UINT wRemoveMsg // removal flags。对于wRemoveMsg ,有效的标志有PM_NOREMOVE,PeekMessage 处理之后,消息没有从序列中去除PM_REMOVE,PeekMessage
处理之后,消息已经从序列中去除怎样来实现实时事件循坏呢?通过利用PeekMessage 来判断消息序列中是否有消息,如果有,就处理它;否则直接返回,并不等待。
LRESULT SendMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
SendMessage根据窗口句柄发送一个消息给窗口,SendMessage
向窗口传递一个要求立即处理的消息。接收窗口处理完该消息后,该函数便紧接着 WinProc 返回。是同步的。
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
PostMessage 将消息发往窗口的消息序列,而后直接返回。如果不在意在消息被处理以前的时间延迟,或者该消息的优先级较低,就可以使用该函数。是异步的。

VC创建WIN32框架程序

1.打开VC

oror....

2.

3.新建项目

4.选择WIN32项目点击确定  一直下一步直至完成

5.完成

接着编译运行即可

windows游戏编程 创建WIN32一个HelloWOrld程序的更多相关文章

  1. Windows Azure入门教学系列 (一): 创建第一个WebRole程序

    原文 Windows Azure入门教学系列 (一): 创建第一个WebRole程序 在第一篇教学中,我们将学习如何在Visual Studio 2008 SP1中创建一个WebRole程序(C#语言 ...

  2. SpringMVC基础入门,创建一个HelloWorld程序

    ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要 ...

  3. 图解使用IDEA创建第一个Java程序HelloWorld

    前几次给大家分享了怎么在自己的电脑上配置 java 环境,准备工作做好了,我们就要开始我们真正的编码学习了.下面介绍使用 IDEA 创建我们的第一个 HelloWorld 程序. 1.打开 IDEA, ...

  4. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  5. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  6. (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

  7. 76-Java安装Eclipse并创建第一个HelloWorld.md

    76-Java安装Eclipse并创建第一个HelloWorld.md 首先确定已经安装Java系统环境,若未安装,请参考博客Java环境windows搭建 访问Eclipse官网 下载完成直接发送快 ...

  8. Node.js入门以及第一个helloworld程序

    1.概念:简单的说 Node.js 就是运行在服务端的 JavaScript.学之前需要明白Node.js是无法挑战jsp.php或者asp这种老牌网站的地位的,是永远不会出现在证券.金融这种领域的. ...

  9. (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

    每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件.配置.应用启动流程代码和界面代码.然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始 ...

随机推荐

  1. hdu 6182

    A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. MH-P虚拟机DSR中安装SQL2008

    双击下载好的安装文件setup.exe.(注意:安装之前请确认是否有安装SQL Server 2008 R2需要的.NET Framework 3.5 SP1,我的环境由于之前有配置安装过,在这里不具 ...

  3. (十五)Activitivi5之多用户任务分配

    一.概念 我们在开发的时候,有一种情况是这样的, 我们有一个任务,可以让多个用户中的任何一个人办理即可,比如某个审批任务, 张三,李四,王五他们中的任何一人办理下都行,这时候,我们用到多用户任务分配. ...

  4. 数据格式转换string.Format

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  5. XML-RPC-1概述

    XML-RPC是一个远程过程调用(远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制.   中文名 XML- ...

  6. 学HTML第二晚 登录框的制作

    进天来弄个登录框 首先,登录框要有登录的账号.密码.和确定.取消的,密码也是要隐藏的. 然后,我们就做: 这是理想中的样子,有了想法,就开始写了 <!dotcype html> <h ...

  7. LeetCode:626.换座位

    题目链接:https://leetcode-cn.com/problems/exchange-seats/ 题目 小美是一所中学的信息科技老师,她有一张 seat 座位表,平时用来储存学生名字和与他们 ...

  8. perl判断文件是否存在 perl -e

    perl 有很多的命令  其中有  -e   是判断文件和目录是否存在 代码如下: #!/usr/bin/perl $fileExist = -e "/var/log/messages&qu ...

  9. 在nuxt项目中使用component组件

    编写组件页面 1.在components下新建一个新建组件页面,如下所示 2.新建完成之后初始页面的代码如下所示: 3.下面从element-ui上找一个顶部导航菜单写到组件页面. <el-me ...

  10. flask小结

    http通讯过程 https://www.cnblogs.com/andy9468/p/10871079.html 1.flask开发环境 https://www.cnblogs.com/andy94 ...