本系列文章由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. js入门之函数

    一. 函数 函数可以封装一段特定功能的代码,然后通过函数名可以重复调用 1 .函数的定义 funcation 函数名 (){ 函数体 } 函数名() 调用函数 2. 函数的参数 funcation f ...

  2. C# 中 Linq 操作 DataTable

    方法一:更简洁 Console.WriteLine(dt.Rows.OfType<DataRow>().First(x => x.Field<string>(" ...

  3. 关于NavigationBar的笔记

    1常用几个方法 全局 //设置navigationBar 的类型 ,ps: status bar的状态受navigationbar控制(当用navigationcontroller时,通过设置此属性改 ...

  4. nohub

    nohup command > myout.file 2>&1 & nohup command > /dev/null 2>&1 &

  5. Linux——CentOS7安装gcc编译器详解 查看内核版本

    [root@localhost ~]# uname -a Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:3 ...

  6. 使用url_for()时,会自动调用转换器的to_url()方法

    视图反推url,在动态url(转换器)反推中的应用 # -*- coding: utf-8 -*- from flask import Flask, url_for, redirect from we ...

  7. 【python】python configparser模块

    ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section), 每个节可以有多个参数(键=值).使用的配置 ...

  8. 新版mysql的配置文件my.ini位置

    在网上的博客上找了好久的my.ini,一直找不到.最后发现原来新版本的mysql已经不把my.ini放在原始的安装目录了.而是放在了C:/ProgramData下.

  9. 将mysql从5.5.25升级到8.0.12

    将mysql从5.5.25升级到8.0.12过程中遇到几个问题,记录如下: 将数据库安装好后,导入原来的数据,启动tomcat,报错unable to load authentication   ca ...

  10. 玩深度学习选哪块英伟达 GPU?有性价比排名还不够!

    本文來源地址:https://www.leiphone.com/news/201705/uo3MgYrFxgdyTRGR.html 与“传统” AI 算法相比,深度学习(DL)的计算性能要求,可以说完 ...