Win32 程序开发:创建一个应用程序窗口

一、创建一个应用程序窗口

代码如下:

// 头文件
#include <windows.h>

// 全局变量
WCHAR g_lpszClassName[] = L"CLASSNAME";
WCHAR g_lpszWindowName[] = L"哈喽,新的征程";

// 函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// 应用程序主函数
INT APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, INT nCmdShow)
{
    // 1.设计一个窗口类
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.lpfnWndProc = WndProc;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = g_lpszClassName;
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    // 2.注册这个窗口类
    if (RegisterClassEx(&wcex) == ((ATOM)0))
    {
        MessageBox(NULL, L"注册窗口类失败!", L"错误", MB_YESNO | MB_ICONERROR);
        exit(-1);
    }

    // 3.创建窗口
    HWND hWnd = CreateWindowEx(NULL, g_lpszClassName, g_lpszWindowName, WS_OVERLAPPEDWINDOW, 10, 10, 800, 800, NULL, NULL, hInstance, NULL);
    if (hWnd == NULL)
    {
        MessageBox(NULL, L"创建窗口失败!", L"错误", MB_YESNO | MB_ICONERROR);
        exit(-1);
    }

    // 4.更新和显示窗口
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // 5.应用程序消息循环
    MSG msg = { 0 };
    BOOL bRet;
    // 调用 GetMessage 函数从调用线程的消息队列中取得一个消息
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet != -1)
        {
            TranslateMessage(&msg); // 将虚拟键消息转换为字符消息
            DispatchMessage(&msg); // 将消息分发到窗口处理
        }
    }

    return msg.wParam;
}

// 应用程序消息处理回调函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0); // 程序退出
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam); // 默认的窗口处理程序
    }
    return 0;
}

二、程序分析

1.首先设计一个窗口类。

不懂可以看我的这篇文章:Win32 程序开发:窗口类结构体 WNDCLASS 和 WNDCLASSEX?,此处就不多赘述了。

2.注册先前设计的窗口类。

调用 RegisterClassEx 函数注册窗口。函数原型:

// 返回值(ATOM,原子):成功返回注册的原子,失败返回 0。
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *); // 参数:为我们设计的窗口类

3.创建窗口。

调用 CreateWindowEx 函数创建窗口。函数原型:

// 返回值:创建成功返回创建的窗口句柄,失败返回NULL
HWND WINAPI CreateWindowExW(
    _In_ DWORD dwExStyle, // 窗口扩展风格
    _In_opt_ LPCWSTR lpClassName, // 我们注册的窗口类的名称
    _In_opt_ LPCWSTR lpWindowName, // 窗口的名称(说白了就是窗口的标题)
    _In_ DWORD dwStyle, // 窗口创建的风格(跟dwExStyle不同)
    _In_ int X, // 窗口左上角的点位于屏幕的横坐标
    _In_ int Y, // 窗口左上角的点位于屏幕的纵坐标
    _In_ int nWidth, // 窗口的宽度
    _In_ int nHeight, // 窗口的高度
    _In_opt_ HWND hWndParent, // 窗口所有者的句柄
    _In_opt_ HMENU hMenu, // 菜单句柄
    _In_opt_ HINSTANCE hInstance, // 所在模块的实例句柄
    _In_opt_ LPVOID lpParam); // 在WM_CREATE中进行传递的参数

4.更新和显示窗口。

调用 ShowWindow 函数显示窗口。函数原型:

// 返回值:成功返回非0,失败返回0
BOOL WINAPI ShowWindow(
    _In_ HWND hWnd, // 显示的窗口句柄
    _In_ int nCmdShow); // 窗口显示的方式(全屏,最大化窗口,最小化窗口,······)

调用 UpdateWindow 函数更新窗口。函数原型:

// 返回值:成功返回非0,失败返回0
BOOL WINAPI UpdateWindow(
    _In_ HWND hWnd); // 更新的窗口

5.应用程序消息循环。

调用 GetMessage 函数从调用线程的消息队列中取得一个消息。函数原型:

// 返回值:获取错误返回-1,消息为WM_QUIT返回0,其他为非0
BOOL WINAPI GetMessageW(
    _Out_ LPMSG lpMsg, // 接收从消息队列中获取的消息
    _In_opt_ HWND hWnd, // 接收消息的窗口句柄
    _In_ UINT wMsgFilterMin, // 指定被检测的最小消息值
    _In_ UINT wMsgFilterMax); // 指定被检测的最大消息值

调用 TranslateMessage 函数将虚拟键消息转换为字符消息。函数原型:

// 返回值:成功返回非0,失败返回0
BOOL WINAPI TranslateMessage(
    _In_ CONST MSG *lpMsg); // 接收的消息

调用 DispatchMessage 函数将消息分发到窗口处理。函数原型:

// 返回值:窗口处理过程的返回值
LRESULT WINAPI DispatchMessageW(
    _In_ CONST MSG *lpMsg); // 分发的消息

示例中的使用:

while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
    if (bRet != -1)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

while 循环的结束,当 GetMessage 获取到的消息为 WM_QUIT 窗口退出,则返回 0(false) 当 GetMessage 的返回值不为 -1(获取消息失败)的时候,进行虚拟键转换和分发消息。

6.窗口消息处理过程。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0); // 程序退出
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam); // 默认的窗口处理程序
    }

    return 0;
}

参数:

  • hWnd:窗口处理过程的窗口句柄
  • message:消息ID
  • wParam:附加消息
  • lParam:附加消息

参考:

Win32 程序开发:创建一个应用程序窗口

原文地址:https://www.cnblogs.com/linuxAndMcu/p/12075434.html

时间: 2024-10-13 16:12:24

Win32 程序开发:创建一个应用程序窗口的相关文章

[Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序

本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(PaaS开发平台),也就是Rails教程中介绍的Cloud 9平台,该平台已经自动为我们作好了环境配置的工作:只要你有一个浏览器就可以使用该云端开发环境.非常的方便快捷!简直赞!平台网址如下:https://c9.io/ Cloud 9开发平台的实质是为每一个注册的开发者在服务器端分配一个Linux虚拟机

SpringMVC基础入门,创建一个HelloWorld程序

ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!--configure the setting of springmvcDispatcherServlet and configure the ma

Django 创建一个应用程序

1. 认识Django Django是一个高级的Python Web框架,它鼓励快速开发和清洁,务实的设计. 由经验丰富的开发人员构建,它负责Web开发的许多麻烦,因此您可以专注于编写应用程序,而无需重新创建轮子. 它是免费的和开源的. 被官方称之为完美主义者的Web框架. Django可以更快地构建更好的Web应用程序并减少代码. 2. Django框架的特点: 快速开发:Django的宗旨在于帮助开发人员快速从概念到完成应用程序. 安全可靠:Django认真对待安全性,帮助开发人员避免许多常

(4opencv)如何基于GOCW,创建一个实时视频程序

直接使用提供的代码框架进行修改,是最快得到效果的方法:但是这样的灵活性较差,而且真正的程序员从来都不会停滞在这一步:我们需要的是"将框架解析到最小化.理清楚每个构建之间的关系",只有这样才能灵活运用. 一.准备工作 1.高拍仪已经接通,如果需要的话,还要安装驱动: 2.vs2012编程环境,能够编写Csharp和OpenCV程序(具体不清楚可以回过头来看配置): 3.是DirectShow.net(http://directshownet.sourceforge.net/docs.ht

三分钟创建一个小程序-每天三分钟玩转小程序 1

点击上方"编程三分钟",马上关注,每周1.3.5定时更新. 好险,还有几分钟,差点没有赶上周五的尾巴.这次带来的是1. 小程序开发前的准备,非常的简单,让我们花三分钟创建一个小程序! 1. 注册账号 访问微信公众平台网站:https://mp.weixin.qq.com 鼠标放到小程序上 发现图案变成了,下面这样,点击[查看详情],进入小程序注册页面. 拉到最下面,出现前往注册 填写一个没有注册过公众号,也没有注册过小程序的邮箱,来注册. . 2. 激活邮箱 这个时候你会收到一封邮件(

[转]Struts1.x系列教程(1):用MyEclipse开发第一个Struts程序

转载地址:http://www.blogjava.net/nokiaguy/archive/2009/01/13/251101.html 本系列教程将详细介绍Struts 1.x的基本原理和使用方法,读者可以参阅<Struts 2系列教程>来比较Struts 1.x和Struts 2.x的相同点和不同点.    在这篇文章中将以一个简单的例子(mystruts)来演示如何使用MyEclipse来开发.运行Struts程序,并给出了解决ActionForm出现乱码问题的方法.读者可以从本文中了解

DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表

原文:DevExpress XtraReports 入门六 控件以程序方式创建一个 交叉表 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 在继续本示例之前,要把所有 必需的程序集 添加到项目的 引用 列表中,并且把一个按钮拖放到窗体上. 然后,以下列方式接管此按钮的

创建一个简单的窗口(eclipse c++)

玩了几天的C++,突然发现一个问题,为啥我借的这本书C++教程800多页,但是到结束都没有介绍一点窗口的代码呢?哪怕可以创建一个提示窗口呢? 我比较愚笨,想在网上找个在WINDOWS的窗口的程序,但是把代码复制进去,都不能用.一看都是VC的,可是当时配置的环境就用的是eclipse+CDT+MinGW.一看到函数入口都是int WINAPI WinMain 而不是main的时候,就慌了.什么情况. 为此翻了一下午网站,都说的不详不细的(时间都足够装几遍VC的了),按道理说像我这样环境的人应该很多

小程序开发公司,小程序开发看这里

小程序开发公司,小程序开发看这里,分销商城系统开发找梁经理(153微2202电6891),分销商城软件开发,分销商城系统平台. 在网络经济中,由于外界环境的变化极其迅速,推动公司发展的不再是效率,而是高度的适应性.应该把公司看成是有机体,它可以感受环境.适应环境,甚至改变环境.市场环境则是一种选择机制,它可以判定哪种有机体更适合生存.公司可通过下列几种手段来设计自己的组织结构,使之具有高度的适应性. 1.实现订单监控.处理 通过不同的角度,订单添加,物流,支付等各方面对订单进行监控和处理,能有效