我的第一个 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 ... 
随机推荐
- 暑假集训D12总结
			刷题 今天终于不考试= = 上午刷了一大圈线段树板子题,于是算是学会了Zkw线段树= = 下午昨天的dalao又来讲几何,然而仍然没有笔记= = 于是刷了一大圈计算几何的水题= =,并没哟啥可以写出题 ... 
- 在TOMCAT上手工生成及部署WAR包
			以前是用ECLIPSE或是其它IDE自动生成,不明了. 这次手写JAVA,先生成CALSS来部署, 之后用WAR包来部署.(查了资料,好像直接用JAR来部署TOMCAT的WEB项目,不得行) 就上次生 ... 
- RONOJ——PID204 / 特种部队 ☆
			题目描述 某特种部队接到一个任务,需要潜入一个仓库.该部队士兵分为两路,第一路士兵已经在正面 牵制住了敌人,第二路士兵正在悄悄地从后方秘密潜入敌人的仓库. 当他们到达仓库时候,发现这个仓库的锁是一把很 ... 
- 洛谷 P1560 [USACO5.2]蜗牛的旅行Snail Trails(不明原因的scanf错误)
			P1560 [USACO5.2]蜗牛的旅行Snail Trails 题目描述 萨丽·斯内尔(Sally Snail,蜗牛)喜欢在N x N 的棋盘上闲逛(1 < n <= 120). 她总 ... 
- 关联查询之map的延伸使用方法
			<select id="front.sort.selectListall" parameterType="myshop.services.front.sort.be ... 
- luogu1072 Hankson的趣味题
			题目大意 给出数a0, a1, b0, b1,求满足gcd(a0, x)=a1, lcm(b0, x)=b1的x的个数 解法一 枚举b1的因数,看看是否满足上述条件. 怎样枚举因数 试除法.对于1~s ... 
- linux下nmap工具的使用
			NMap,也就是Network Mapper,是Linux下的网络扫描和嗅探工 具包,其基本功能有三个,一是探测一组主机是否在线:其次是扫描主机端口,嗅探所提供的网络服务:还可以推断主机所用的操作系统 ... 
- 学习环境搭建2——安装django
			下载django https://www.djangoproject.com/download/ 选择最新的版本Latest release,下载后解压.在含有setup.py的文件夹中执行如下命令: ... 
- 织梦忘记密码DedeCMS密码重设工具radminpass找回密码
			本工具是用于新人忘记管理员密码重设所制作,只需要将radminpass.php文件拷贝到根目录,运行“http://yousite/radminpass.php(yousite为网站域名)”,按照操作 ... 
- jQuery中事件模块介绍
			事件模块 1.提供其他DOM方法 包括:next 和 nextAll方法 1.1 next方法实现 目标:扩展框架方法,获取当前元素的下一个元素 问题:如何获取下一个元素? 1.1.1 提供 next ... 
