windows游戏编程<七> 创建WIN32一个HelloWOrld程序
2014-03-29 00:18
337 查看
本系列文章由jadeshu编写,转载请注明出处。/article/10929250.html
作者: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
or
or....
2.
3.新建项目
4.选择WIN32项目点击确定 一直下一步直至完成
5.完成
接着编译运行即可
相关文章推荐
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 创建一个不显示窗口的Win32程序
- Maven+MyBatis 基础程序创建<1>
- unity3D ShaderLab <五>漫反射光照改善技巧之使用2D ramp texture来创建一个假的BRDF(双向反射分布函数)
- 【技术】创建一个 <input> 元素,同时设定 type 属性、属性值,以及一些事件
- 如何在linux下创建一个简单的JNI程序HelloWorld
- Java - SpringMVC基础入门,创建一个HelloWorld程序
- 【Virtual C++ 3D游戏开发】前置知识 三 <Win32窗口程序剖析>
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- PYQT5+python3.6+QT编写一个带ui的加密解密小程序<凯撒加密><维吉尼亚加密><仿射加密><培根加密>
- 泛型系列<6>:创建一个可以被初始化为空的值类型
- c语言:有一函数:当x&lt;0,y=-1;x=0,y=0;x&gt;0,y=1;编一程序,输入一个x值,要求输出相应的y值。
- 6个变态的C语言HelloWorld程序<转载>
- java:<创建一个MyInteger类>
- [翻译] - <Entity Framework> - 快速入门: 用 EMD 工具在已有数据库的基础上创建一个模型
- 编写一个程序,将两个字符串s1和s2比较,如果s1 > s2,输出一个正数;s1 = s2,输出0,;s1 < s2输出一个负数。不要使用strcmp函数。
- Maven+MyBatis 基础程序创建<3>
- SpringMVC基础入门,创建一个HelloWorld程序
- 创建一个完整Win32程序
- win32只创建一个对话框的程序(很有趣)