我的第一个 Windows 窗口程序(1)
一般来说,构建一个 Windows 程序可以分为如下几个步骤:
- 定义窗口类(WNDCLASS)
- 注册窗口类(RegisterClass)
- 创建窗口(CreateWindow)
- 更新显示窗口(UpdateWindow、ShowWindow)
- 建立消息循环(GetMessage)
- 处理消息(DispatchMessage)
消息处理由窗口过程(WndProc)来完成,消息分为队列消息和非队列消息两种:
- 队列消息:Windows 放入消息队列的消息,在消息循环中被检索(GetMessage),然后分发投递到窗口过程中(DispatchMessage)。
- 非队列消息:Windows 对窗口过程的直接调用(将消息直接发送到窗口过程)
Windows 示例程序代码:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
switch (message) {
case WM_CREATE:
/* 窗口创建时的消息处理 */
return ;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
/* 窗口重绘的消息处理 */
EndPaint(hwnd, &ps);
return ;
case WM_DESTROY:
/* 窗口销毁时的消息处理 */
PostQuitMessage();
return ;
}
/* 默认的窗口过程消息处理 */
return DefWindowProc(hwnd, message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
LPCTSTR lpszClassName = TEXT("demo");
/* 定义窗口类 */
WNDCLASS wndclass;
wndclass.cbClsExtra = ;
wndclass.cbWndExtra = ;
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hInstance = hInstance;
wndclass.lpszClassName = lpszClassName;
wndclass.lpszMenuName = NULL;
wndclass.lpfnWndProc = WndProc;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
/* 注册窗口类 */
if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This Program requires Windows NT!"), lpszClassName, MB_ICONERROR);
return ;
}
/* 创建窗口 */
HWND hwnd = CreateWindow(
lpszClassName,
TEXT("Demo Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
/* 更新显示窗口 */
UpdateWindow(hwnd);
ShowWindow(hwnd, nCmdShow);
/* 消息循环 */
MSG msg;
while (GetMessage(&msg, NULL, , )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
从上面的程序示例可以看出,WinMain函数完成了程序的基本配置,并且建立了消息循环,WndProc窗口过程则完成每一次消息循环的处理。这样,一个简单的Windows程序框架基本上就构建出来了,其中的细节值得回味。
我的第一个 Windows 窗口程序(1)的更多相关文章
- VC菜菜鸟:建立第一个基于Visual C++的Windows窗口程序
建立第一个基于VisualC++的Windows窗口程序: 发表于:http://blog.csdn.net/it1988888/article/details/10306585 a)执行命令:新建 ...
- 使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍
使用Visual Studio 2008创建你的第一个Windows Mobile程序介绍 Windows MobileMobileWindowsMicrosoftWinForm 介绍 Microso ...
- 第一个Windows窗口应用程序
学习目的 熟悉开发工具Visual C++ 6.0和MSDN 2001的使用. 应用Windows API函数, 手工编写具有最基本构成的Windows窗口应用程序(包含WinMain入口函数, 消息 ...
- [MFC]_在vs2019中使用MFC快速构建简单windows窗口程序
微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发 ...
- Windows窗口程序从创建到关闭产生的消息
Windows是消息驱动的,理解消息机制及消息循环是特别重要.知道在什么情况下产生什么消息会让我们对程序有更好的控制.Windows给应用程序发消息,有些会加入应用程序的消息队列,也是就是队列消息.有 ...
- 如何用C#做一个悬浮窗口程序
用C#做一个像FlashGet的悬浮窗口,其实很简单,不像以前需要调用很多系统API.大致的步骤如下. 首先是主窗体部分,即要判断窗体的状态来决定是否显示悬浮窗口. 局部成员声明: private F ...
- 第一个 Windows 界面程序
编译器 使用的编译器为 Visual Studio 2017 菜单栏 -> 文件 -> 新建 -> 项目 选择 Windows 桌面应用程序,然后填好相关信息后点击“确定” 在解决方 ...
- 创建一个Windows Service 程序
1.新建Windows项目,选择"Windows服务"类型的项目. 2.在生成的Service1.cs中代码中写你需要的代码,如下: using System; using Sys ...
- OpenGL Windows 窗口程序环境搭建
OpenGL环境搭建步骤: Downloading OpenGL 根据官网的说法: In all three major desktop platforms (Linux, macOS, and Wi ...
随机推荐
- Spring Boot-整合Mybatis(五)
原始的整合方式 1.添加依赖 <!--mybatis起步依赖--> <dependency> <groupId>org.mybatis.spring.boot< ...
- 转载 - KMP算法
出处:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一. ...
- 如何实现网卡bond
https://jingyan.baidu.com/article/375c8e19da666325f2a229f7.html
- EntityFramework:状态变化与方法的关系[转载]
原文地址 一.约定 OnModelCreating 有一些限制需要注意,例如: 1.表名不支持使用标签进行标注 2.最小长度在 OnModelCreating 中不支持 3.正则表达式在 OnMode ...
- spring-logback
<?xml version="1.0" encoding="UTF-8"?><!-- 说明: 1.日志级别及文件 日志记录采用分级记录,级别与 ...
- Web API接口设计(学习)
1.在接口定义中确定MVC的GET或者POST方式 由于我们整个Web API平台是基于MVC的基础上进行的API开发,因此整个Web API的接口,在定义的时候,一般需要显示来声明接口是[HttpG ...
- shell学习五十天----查看进程ps命令
进程列表 列出进程中最重要的命令便是进程状态命令:ps. ps命令是进程状态(Process Status)的缩写.ps命令用来列出系统中当前执行的那些进程.ps命令列出的是当前那些进程的快照,就是执 ...
- 获得拼凑SQL语句运行后的结果
拼凑式的SQL语句太普遍了,比如说,任意条件的查询. 这种拼凑SQL语句,如果在数据库端组装,必然是一条长长的字符串,然后 exec(@sql). 如果这条语句写在存储过程里边,存储过程的调用方会获得 ...
- session理解
Session,底层的实现就是一个Map<集合>,有些Data在Server内存中,APP要分层.Data在各个层之间肯定要以一种形态传递(泛型),之前Servlet dao.getLis ...
- 怎样才是一个基本水平的java程序员?
怎样才是一个基本水平的java程序员? 熟悉常用的数据结构,包括数组,链表,树,哈希表等. 熟悉结构化编程和面向对象编程. 能够阅读UML设计图,根据UML语义进行编码 了解RDBMS和SQL的使用, ...