我的第一个 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 ...
 
随机推荐
- Balanced Number
			
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
 - VNC ( Virtual Network Computing )
			
VNC is used to display an X windows session running on another computer. Unlike a remote X connectio ...
 - Python之Mysql及SQLAlchemy操作总结
			
一.Mysql命令总结 1.创建库 create database test1; 2.授权一个用户 grant all privileges on *.* to 'feng'@'%' identifi ...
 - EL表达式无法被解析
			
刚困死了,但是手上还在debug一个东西.然后就发现
 - requireJS文件夹
			
前言 对于像我这样的requireJS刚開始学习的人而言,requireJS最难理解的部分应该是它的路径问题.晚上随便折腾了一下,算是略微理清了这个文件夹问题吧. requireJS学习网址:requ ...
 - Spring技术内幕:SpringIOC原理学习总结
			
前一段时候我把Spring技术内幕的关于IOC原理一章看完,感觉代码太多,不好掌握,我特意又各方搜集了一些关于IOC原理的资料,特加深一下印象,以便真正掌握IOC的原理. IOC的思想是:Spring ...
 - 积跬步,聚小流------界面经常使用的jeecms标签
			
* JEECMS初印象 第一次接触JEECMS,突然脑海就浮现了一句话"20元建站,立等可取",原来这都是真的... * JEECMS的界面经常使用标签 临时忽略掉环境搭建.栏目配 ...
 - 2015年趋势科技笔试A卷
			
题目原题来源:url=BHz9dr7Dbql5Ai0fTaUsi8QH-ieA9UAtw8kpf-Us_cGUnsz7ZIU1SfHIp33Cphcp0n6uPikWL6r8n0a0zQ0wNOMLG ...
 - luogu2606 排列计数
			
题目大意 求满足下列条件的排列$P$的数量:$\forall P_i, P_i>P_{\lfloor \frac{i}{2}\rfloor}$. 思路 从下标入手 反过来想,也就是对$\fora ...
 - Windows 10 MBR转GPT分区
			
注意:分区有风险,操作需谨慎,提前备份好数据. 说明: 1.有“系统保留”的分区,可以直接删除,用来做GPT分区的UEFI启动分区. 2.没有“系统保留”分区的,需要在分区最前面调整分区大小,留出30 ...