【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(一)

简介: 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )(一)

文章目录

一、导入头文件

二、桌面程序入口函数

三、注册窗口

四、创建窗口

五、显示窗口

六、完整代码示例

七、相关资源


基于 【OpenGL】一、Visual Studio 2019 创建 Windows 桌面程序 ( Visual Studio Installer 安装 C++ 桌面开发库 | 创建桌面程序 ) 博客中创建的 Windows 桌面程序继续向下讲解 , Visual Studio 自动生成了空白的桌面程序 , OpenGL 系列开发基于该桌面程序进行 ;


本篇博客简单介绍下该桌面初始化的操作 , 注册桌面窗口 , 创建桌面窗口 , 显示桌面窗口 ;






一、导入头文件


Windows 窗口程序需要导入 windows.h 头文件 ;


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


下面的代码时 Visual Studio 创建桌面程序时 , 自动生成的头文件 , 其中包含了 windows.h 头文件 ;


// header.h: 标准系统包含文件的包含文件,
// 或特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN             // 从 Windows 头文件中排除极少使用的内容
// Windows 头文件
#include <windows.h>
// C 运行时头文件
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>






二、桌面程序入口函数


Windows 桌面程序的入口 是 wWinMain 函数 ,


该函数相当于命令行程序中的 void main() 函数 ;


完整的 wWinMain 函数格式 :


int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)






三、注册窗口


使用 WNDCLASSEXW 结构体注册窗口 ;


WNDCLASSEXW 结构体代码如下 :


typedef struct tagWNDCLASSEXW {
    UINT        cbSize;
    /* Win 3.x */
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
    /* Win 4.0 */
    HICON       hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;

下面是该结构体各个字段的含义 :


style : 窗口风格 ;

lpfnWndProc : 设置消息响应函数 , 如响应鼠标 , 键盘事件 ;

cbWndExtra : 窗口是否需要额外空间 ;

hInstance : 窗口实体 , 通过桌面程序入口函数传入 ;

hIcon : 生成的程序在文件夹中的样式 , 可执行程序的图标

hCursor : 设置鼠标光标样式 ;

hbrBackground : 设置背景 ;

lpszMenuName : 设置菜单 ;

lpszClassName : 设置窗口标识 ;


窗口注册代码示例 : 下面的代码时 Visual Studio 自动身


//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    // 注册窗口的结构体
    WNDCLASSEXW wcex;
    // 设置结构体的大小
    wcex.cbSize = sizeof(WNDCLASSEX);
    // 窗口风格 , CS 是 Class Style 缩写 , VREDRAW 垂直重绘 , HREDRAW 水平重绘
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    // 消息响应函数 , 鼠标点击窗口 , 或打字字后的回调函数
    wcex.lpfnWndProc    = WndProc;
    // 不需要额外的空间
    wcex.cbClsExtra     = 0;
    // 不需要额外的空间
    wcex.cbWndExtra     = 0;
    // 设置程序的实例, 通过桌面程序入口函数传入
    wcex.hInstance      = hInstance;
    // 生成的程序在文件夹中的样式 , 可执行程序的图标
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OPENGL));
    // 设置鼠标光标样式
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    // 设置背景
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    // 菜单
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_OPENGL);
    // 窗口的唯一标识符
    wcex.lpszClassName  = szWindowClass;
    // 设置窗口运行后显示在右上角的图标
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  // 设置完上述参数后 , 最后调用该方法注册窗口
    return RegisterClassExW(&wcex);
}



目录
相关文章
|
前端开发 JavaScript Java
一文了解主流开发语言都有哪些!
本文将综合探讨目前市场上最流行、最多人使用的几种主流开发语言,包括它们的特点、典型应用场景以及简单示例代码。
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
1225 56
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
数据采集 安全 API
如何获得淘宝/天猫淘宝商品详情 API接口
要获取淘宝商品详情 API 接口,主要途径包括:1) 淘宝开放平台注册账号、创建应用并获取 API 密钥;2) 使用淘宝提供的商品详情接口(如 taobao.item.get);3) 通过第三方数据服务平台获取封装后的 API 接口;4) 自行开发爬虫程序(不推荐)。
|
11月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
2886 11
|
Linux Python
Python获得本机本地ip地址的方法
【10月更文挑战第8天】 socket模块包含了丰富的函数和方法,可以获取主机的ip地址,例如gethostbyname方法可以根据主机名获取ip地址,gethostbyname_ex方法可以获得本机所有ip地址列表,也可以使用netifaces模块获取网卡信息。
397 0
安装VS Code报错:您选定的驱动器或UNC共享不存在或不能访问。请选择其他位置。
安装VS Code报错:您选定的驱动器或UNC共享不存在或不能访问。请选择其他位置。
我们需要安装`websockets`库(如果尚未安装)
我们需要安装`websockets`库(如果尚未安装)
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的无人机视角高精度太阳能电池板检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割
基于YOLOv8深度学习的无人机视角高精度太阳能电池板检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割
|
数据安全/隐私保护
sublime 如何安装ftp插件
sublime 如何安装ftp插件
386 1
sublime 如何安装ftp插件
|
Java 关系型数据库 MySQL
Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
【2月更文挑战第33天】Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
1639 2

热门文章

最新文章