基于 Win32 的应用程序
本文纯属记录http://msdn.microsoft.com/zh-cn/library/bb384843.aspx
创建基于 Win32 的项目
在“文件”菜单上,单击“新建”,然后单击“项目”。
在“新建项目”对话框的左侧窗格中,单击“已安装的模板”,单击“Visual C++”,然后选择“Win32”。 在中间窗格中,选择“Win32 项目”。
在“名称”框中,键入项目名称,例如 win32app。 单击“确定”。
在“Win32 应用程序向导”的“欢迎”页上,单击“下一步”。
在“应用程序设置”页上的在“应用程序类型”下,选择“Windows 应用程序”。 在“附加选项”下,选择“空项目”。 单击“完成”创建项目。
在“解决方案资源管理器”中,右击 Win32app 项目,单击“添加”,然后单击“新建项”。 在“添加新项”对话框中选择“C++ 文件(.cpp)”。 在“名称”框中,键入文件名称,例如GT_HelloWorldWin32.cpp。 单击“添加”。
启动基于 Win32 的应用程序
就像每个 C 应用程序和 C++ 应用程序都以 main 函数作为起点那样,每个基于 Win32 的应用程序同样必须要有 WinMain 函数。 WinMain 具有以下语法。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow);
有关此函数的参数和返回值的信息,请参见 WinMain 函数。
由于应用程序代码必须使用现有定义,因此应将 include 语句添加到文件中。
#include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h>
除 WinMain 函数外,每个基于 Win32 的应用程序还必须具有一个窗口过程函数。 此函数通常名为 WndProc。 WndProc 具有以下语法。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
此函数处理应用程序从操作系统接收的许多消息。 例如,在具有对话框(该对话框中有一个“确定”按钮)的应用程序中,如果用户单击该按钮,操作系统就会向该应用程序发送一条消息,告知已单击该按钮。 WndProc 负责响应该事件。 在此示例中,相应的响应可能是关闭该对话框。
有关更多信息,请参见窗口过程。
向 WinMain 函数添加功能
在 WinMain 函数中,创建 WNDCLASSEX 类型的窗口类结构。 此结构包含有关该窗口的信息,例如,应用程序图标、窗口的背景色、要在标题栏中显示的名称、窗口过程函数的名称等等。 下面的示例演示一个典型 WNDCLASSEX 结构。
WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(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, MAKEINTRESOURCE(IDI_APPLICATION));
有关此结构的各字段的信息,请参见 WNDCLASSEX。
现在您已经创建一个窗口类,接下来必须将其注册。 使用 RegisterClassEx 函数,并将窗口类结构作为参数进行传递。
if (!RegisterClassEx(&wcex)){MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);return 1;}
现在可以创建一个窗口。 使用 CreateWindow 函数。
static TCHAR szWindowClass[] = _T("win32app"); static TCHAR szTitle[] = _T("Win32 Guided Tour Application");// The parameters to CreateWindow explained: // szWindowClass: the name of the application // szTitle: the text that appears in the title bar // WS_OVERLAPPEDWINDOW: the type of window to create // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) // 500, 100: initial size (width, length) // NULL: the parent of this window // NULL: this application does not have a menu bar // hInstance: the first parameter from WinMain // NULL: not used in this application HWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 100,NULL,NULL,hInstance,NULL ); if (!hWnd) {MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);return 1; }
此函数返回 HWND,它是某个窗口的句柄。 有关更多信息,请参见 Windows 数据类型。
现在,使用下列代码来显示窗口。
// The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd,nCmdShow); UpdateWindow(hWnd);
此时,所显示的窗口不会有太多内容,因为您尚未实现 WndProc 函数。
现在添加一个消息循环以侦听操作系统发送的消息。 如果应用程序收到一条消息,则此循环会将该消息调度至 WndProc 函数以接受处理。 消息循环类似于下列代码。
MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int) msg.wParam;
有关消息循环中各结构和函数的更多信息,请参见 MSG、GetMessage、TranslateMessage 和 DispatchMessage。
此时,WinMain 函数应与下列代码类似。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(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, MAKEINTRESOURCE(IDI_APPLICATION));if (!RegisterClassEx(&wcex)){MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);return 1;}hInst = hInstance; // Store instance handle in our global variable// The parameters to CreateWindow explained:// szWindowClass: the name of the application// szTitle: the text that appears in the title bar// WS_OVERLAPPEDWINDOW: the type of window to create// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)// 500, 100: initial size (width, length)// NULL: the parent of this window// NULL: this application dows not have a menu bar// hInstance: the first parameter from WinMain// NULL: not used in this applicationHWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 100,NULL,NULL,hInstance,NULL);if (!hWnd){MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);return 1;}// The parameters to ShowWindow explained:// hWnd: the value returned from CreateWindow// nCmdShow: the fourth parameter from WinMainShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);// Main message loop:MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int) msg.wParam; }
向 WndProc 函数添加功能
若要启用 WndProc 函数来处理应用程序所收到的消息,请实现 switch 语句。
要处理的第一条消息是 WM_PAINT 消息。 如果必须更新所显示的应用程序窗口的一部分,该应用程序就会收到此消息。 (首次显示该窗口时,必须将其全部更新。)
若要处理 WM_PAINT 消息,请首先调用 BeginPaint,然后处理用于布局该窗口中的文本、按钮和其他控件的所有逻辑,再调用 EndPaint。 对于此应用程序,开始调用和结束调用之间的逻辑会在窗口中显示字符串“Hello, World!”。 在下列代码中,请注意 TextOut 函数用于显示该字符串。
PAINTSTRUCT ps; HDC hdc; TCHAR greeting[] = _T("Hello, World!");switch (message) { case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// Here your application is laid out.// For this introduction, we just print out "Hello, World!"// in the top left corner.TextOut(hdc,5, 5,greeting, _tcslen(greeting));// End application-specific layout section.EndPaint(hWnd, &ps);break; }
应用程序通常会处理许多其他消息,例如 WM_CREATE 和 WM_DESTROY。 下列代码展示了一个基本但完整的 WndProc 函数。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = _T("Hello, World!");switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// Here your application is laid out.// For this introduction, we just print out "Hello, World!"// in the top left corner.TextOut(hdc,5, 5,greeting, _tcslen(greeting));// End application specific layout section.EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0; }
生成此示例
创建本演练中之前“创建基于 Win32 的项目”中的基于 Win32 的项目。
复制这些步骤之后的代码,然后将其粘贴到 GT_HelloWorldWin32.cpp 源文件中。
在“生成”菜单上,单击“生成解决方案”。
若要运行该应用程序,请按 F5。 在显示屏的左上角应出现一个窗口,窗口中含有文本“Hello World!”。
代码
// GT_HelloWorldWin32.cpp // compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c#include <windows.h> #include <stdlib.h> #include <string.h> #include <tchar.h>// Global variables// The main window class name. static TCHAR szWindowClass[] = _T("win32app");// The string that appears in the application's title bar. static TCHAR szTitle[] = _T("Win32 Guided Tour Application");HINSTANCE hInst;// Forward declarations of functions included in this code module: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) {WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(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, MAKEINTRESOURCE(IDI_APPLICATION));if (!RegisterClassEx(&wcex)){MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);return 1;}hInst = hInstance; // Store instance handle in our global variable// The parameters to CreateWindow explained:// szWindowClass: the name of the application// szTitle: the text that appears in the title bar// WS_OVERLAPPEDWINDOW: the type of window to create// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)// 500, 100: initial size (width, length)// NULL: the parent of this window// NULL: this application does not have a menu bar// hInstance: the first parameter from WinMain// NULL: not used in this applicationHWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,500, 100,NULL,NULL,hInstance,NULL);if (!hWnd){MessageBox(NULL,_T("Call to CreateWindow failed!"),_T("Win32 Guided Tour"),NULL);return 1;}
基于 Win32 的应用程序相关推荐
- 基于win32控制台应用程序的双人俄罗斯方块小游戏
1. 课题概述 1.1 课题目标和主要内容 使用visual studio 2015在win32控制台应用程序下用多线程实现双人同时进行俄罗斯方块的桌面游戏.最终将要完成的效果如图1.1所示,左右共两 ...
- [C++] [SFML] 基于Win32的SFML程序
前言 看了下SFML的官方示例,发现SFML竟然还能这么玩 explicit RenderWindow(WindowHandle handle, const ContextSettings& ...
- 基于Win32框架的OpenGL程序
本示例提供一个稳定的基于Win32的OpenGL程序框架结构,开发工具是Visual Studio 2010,编程之前应该确保OpenGL所使用的库函数都已被正确配置: 第一步,安装GLUT工具包: ...
- 基于C++的《元素战争》基于win32框架的电脑游戏设计
资源下载地址:https://download.csdn.net/download/sheziqiong/85628397 一.游戏介绍 <元素战争>是一款基于 win32 框架的电脑 ...
- 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发
基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...
- java聊天程序步骤解析_java网络之基于UDP的聊天程序示例解析
基于UDP的Socket通信 UDP协议不是一种基于稳定连接的协议,是一种面向数据报包的通信协议,不需要通信双方建立稳定的连接,也没有所谓服务端和客户的概念,数据报包在传输的时候不保证一定及时到达,也 ...
- 基于Python分析深圳程序员工资有多高?
基于Python分析深圳程序员工资有多高? 概述 前言 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 多图预警.多图预警.多图预警.校招季,毕业也多,跳槽也多.我们的职业发展还是要顺 ...
- 基于富盛SBO程序开发框架的自动序列生成器
很多时候,我们期望系统中的某些关键字段可以按照我们期望的条件自动生成,比如,员工代码,商品序列号,商品条形码等.的确,针对个体业务,要实现这种自动生成方法很多,那么是否可以实现可以支持所有业务的序列生 ...
- Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序...
Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序).没错,Robocopy的功能是拷贝文件,你也许会觉得无聊并且要翻阅下一篇文章 ...
- bmob php支付,基于Bmob在小程序端实现一键支付
基于Bmob在小程序端实现一键支付教程: 几个容易忽略的细节 1.需要先拿到openid var openId = Bmob.User.current().get('authData').weapp. ...
最新文章
- CSS中的margin的三种写法
- go语言中变量的定义和使用
- 1060 爱丁顿数 (25 分)(思维)
- 《构架之美》阅读笔记四
- HDU - 3126 Nova(最大流+二分+简单几何)
- dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
- Java实现正整数数组的最小拼接数
- [导入]哀悼与感动同在[转载]
- win7鼠标指针主题包_轻松办公之全局鼠标手势软件
- c++双向列表释放_SAIL-C-R-T4-A1-V0-B1温度控制仪-老友网
- 结对编程——自动生成数学试卷的系统(javaswing,mysql)by 陈松刘宇航
- .Net使用DES解密发生“数据不正确”的错误
- 相应的游戏服务器组件信息不存在,房间创建失败
- JavaWeb项目在Tomcat中的部署
- Cannot load driver class: com.mysql.cj.jdbc.Driver 错误解决
- CVE-2019-3648漏洞分析
- FF05期末作业成品代码——美食汇-美食菜谱(5页) HTML+CSS+JS网页设计期末课程大作业
- STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭
- python抓取百度妹子图
- APICloud App开发教程之云修复功能