Lesson 2: 基本窗口

qt opengl lesson1 建立一个opengl窗口 这是一个系列的文章,这个系列来自于github上的一个开源项目 https://github.com/chenzilin/qt-opengl 之前也看到其它的博客上有翻译到这些文章,但是那些实例都比较旧,到新版本qt creator中不大不能运行,所以就有了新翻译一个系列的方法。 还有就是git上的提交相比于之前增加了很多lesson,有助于想学习qt opengl的程序员更深入学习理解op 阅读详情

原文地址:
http://www.directxtutorial.com/Lesson.aspx?lessonid=11-1-2

运行环境:Visual Studio 2015

Win32 Console Programs vs. Windows Programs
这里写图片描述

Win32控制台程序和Windows程序
两项的区别:
我们在学习C++时,用cin、cout那一套写出来的程序通常都是一个黑洞洞的基于DOS的窗口,那就是所谓的【Win32控制台程序】
而我们现在学习编写在Windows下运行的Win32窗口程序。Windows下绝大多数的游戏程序,都是基于在新建工程时创建Win32项目,在这个类型程序的基础上进行开发的。
所以,新建工程时一定要确认好选择的是Win32项目。

接下来,在资源管理器中展开Hello World项目,并在源文件一栏中单击鼠标右键,添加新建项。在弹出来的对话框找到C++文件(cpp),一般情况下默认为该文件类型,选定后,为准备新建的源文件取一个名称,比如main.cpp。
这里写图片描述

The WinMain() Function
WinMain()函数:
这个函数等同于在Win32控制台中的main函数,是所有Windows程序的入口点函数。当WinMain函数结束或返回时,Windows应用程序也就结束了。

WinMain()函数的原型如下:

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow);

WINAPI
宏定义如下:

 #define WINAPI  _stdcall
 #define CALLBACK _stdcall

也就是说WINAPI其实就是_stdcall,只是为了让我们清楚知道这里的_stdcall表示的是一种调用约定,它让编译器知道了应当以Windows兼容的方式来产生机器命令(In short, what it does is reverse the order the parameters are passed. They normally pass from right to left, but with WINAPI, they are passed from left to right.)意同CALLBACK,即要求编译器从右向左传递参数。为什么要这样并不是很重要,只是Windows要求我们需要这样做。

HINSTANCE hInstance,
HINSTANCE类型的hInstance,它表示该程序当前运行的实例句柄。一个句柄是一个32位整数,用来表示某物的身份,就像一个对象一样。而instance是一个实例的拷贝,其实也就是一个数值。由于多任务和执行多个重复程序的需要,Windows需要通过这个方法来保持程序身份的跟踪。当一个程序在Windows下运行时,它唯一对应一个运行中的实例,也只有运行中的程序实例,才有资格分配到实例句柄。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个句柄值,并通过hInstance参数传递给程序的入口点WinMain函数。

HINSTANCE hPrevInstance,
HINSTANCE类型的hPrevInstance,表示当前实例的前一个实例的句柄。意味着,如果有一个运行中的应用程序被多次拷贝,hPrevInstance就会保存上一个被创造的实例的值。在Windows 95之前,一个相同应用程序的多重拷贝是共享内存空间的,而如今在32位环境下的话,Windows给每个应用程序都分配了自己的内存空间,hPrevInstance也因此废弃。这里只是为了与过去版本兼容的方便,所以我们现在在任何应用程序里都把这个参数设为NULL。

LPSTR lpCmdLine
LPSTR类型的lpCmdLine,lp意味着这个参数是一个指针,指向一个以空终止的字符串,指定传递给应用程序的命令行参数。例如,如果你有一个应用程序为MyApp.exe,然后你在命令提示符中运行它,你可以像这样运行“MyApp.exe” or “MyApp.exe RunA” or “MyApp.exe RunB”。
不管哪一种方式,lpCmdLine会存储你输入的整一个字符串,用来允许程序检查特殊参数。
这对于游戏编程运行特殊的模式很有帮助。

int nCmdShow
int类型的nCmdShow,指定程序窗口如何显示,是最大化、最小化还是隐藏等等。
这个参数可有如下取值:
这里写图片描述

MessageBox函数:
先看一个实际的例子,“Hello World!”

#include <windows.h>    // include the basic windows header file

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    // create a "Hello World" message box using MessageBox()
    MessageBox(NULL,
               L"Hello World!",
               L"Just another Hello World program!",
               MB_ICONEXCLAMATION | MB_OK);

    // return 0 to Windows
    return 0;
}

运行如下:
这里写图片描述

#include <windows.h>

我们编写Windows程序中所说的API函数,就是指系统提供的函数,主要的Windows函数都在windows.h这个头文件中进行声明了。

MessageBox()
函数原型如下:

int MessageBox(HWND hWnd,
               LPCTSTR lptext,
               LPCTSTR lpcaption,
               UINT utype);

HWND hWnd,
HWND类型的hWnd,表示我们显示的消息框所属的窗口的句柄。在这个例子中,因为我们没有创建任何窗口,所以我们设为NULL,表示消息框是从属于桌面的。

LPCTSTR lptext,
LPCTSTR类型的lptext,lp表明它是一个指针,指向所要显示的消息的内容。

LPCTSTR lpcaption,
LPCTSTR类型的lpcaption,lp表明它是一个指针,指向我们要显示的消息框的标题的内容。

UINT utype
UINT类型的utype,表示我们消息窗口需要什么样的样式。当需要多种样式时,使用逻辑or操作符“|”连接

这个参数可有以下取值:
这里写图片描述

常用的图标我们也是通过一些标识名来指定,有如下几种:
这里写图片描述

当然,像大多数Win32函数一样,MessageBox函数也有返回值。在游戏编程里,我们一般不需要这个返回值,因为错误信息只有一个去向:退出。而如果我们创建了具有对应按钮的消息框,就涉及到按下具体的按键,就需要给出按键的返回值,这样我们就需要判断哪个键被按下了,再对应作出相应的响应。
返回值的列表如下:
这里写图片描述

DM-VIO论文精读:从‘延迟边缘化’到‘位姿图BA’,手把手拆解单目VIO性能超越双目的秘密 本文深入解析DM-VIO技术如何通过延迟边缘化和位姿图BA创新,解决单目视觉惯性里程计(VIO)的尺度不可观性问题,并在精度上超越传统双目系统。文章详细介绍了延迟边缘化的双因子图结构设计、位姿图BA的多级初始化策略,以及系统级优化带来的性能提升,为VIO研究与实践提供了重要参考。 阅读详情

相关推荐

深入解析Apollo Lattice Planner:自动驾驶轨迹规划的核心算法与实践

本文深入解析了百度Apollo自动驾驶平台中的核心轨迹规划算法——Lattice Planner。文章详细阐述了其作为车辆“即时决策者”的工作原理,通过“采样-评估”的六步流程(Frenet坐标转换、状态采样、轨迹生成、硬约束过滤、代价函数打分及决策平滑),在复杂路况下实时规划出安全、舒适、高效的行驶轨迹。该算法是自动驾驶实现智能决策与精准控制的关键技术。

weixin_29090677的博客 830

Windows编程学习笔记 lesson2 窗口创建

Windows编程学习 窗口创建

judy的博客 403

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6039

Lesson8_窗口

【代码】Lesson8_窗口。

2501_91319803的博客 120

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译

FMT(基于rtthread)开源代码编译 win10下编译环境搭建及编译 什么是Firmament? Firmament (FMT) 是一款基于模型设计 (Model-Based-Design, MBD) 的开源自驾仪,可被用来快速构建无人机,无人车,无人船,机器人等平台的控制系统。 系统主要由两部分构成. FMT-Firmware: 一个基于C/C++开发的稳定、高性能的嵌入式系统. FMT-Model: 一个基于MATLAB/Simulink开发的仿真框架以及算法库. 昨天得知FMT开源飞控项目已经开

weixin_45786595的博客 2873

高精度SAR ADC设计实战:从建模到版图的16位1MSPS实现

本文详细介绍了16位1MSPS高精度SAR ADC的设计过程,从建模到版图实现的完整流程。重点探讨了分段电容阵列设计、校准算法实现及版图匹配等关键技术,展示了如何在180nm工艺下实现92.5dB SNDR和109.6dB SFDR的高性能指标。文章特别强调了整数桥接电容设计对提升匹配精度的关键作用,为高精度模数转换器设计提供了实用参考。

weixin_33724046的博客 437

lesson 2 在窗口上显示图像

//本教程的地一个垫脚石:一个弹出窗口 //现在SDL已经设置好了, 是时候做一个梗概使SDL图形程序在屏幕上渲染显示 //使用 SDL 和标准 IO #include #include //屏幕尺寸常数 const int SCREEN_WIDTH = 640; const int SCREEN_HEIGHT = 480;  /* 我们在顶部包含SDL的头文件,因为我们需要SDL函数和数据类

Antlook的博客 731

HALCON卡尺模型实战:5分钟搞定工件尺寸测量(附完整代码)

本文详细介绍了HALCON卡尺模型在工件尺寸测量中的实战应用,通过5分钟快速搭建测量系统的完整指南,包括基础配置、高级参数调优和完整代码示例。卡尺模型能自动识别边缘并计算精确尺寸,显著提升工业视觉检测的效率和一致性,特别适用于实时测量场景。

weixin_42570296的博客 462

孙鑫VC++深入详解:Lesson9 Part2---修改窗口光标,图表,背景

一. 窗口创建之前修改,用自定义的窗口类WNDCLASS wc 由于窗口的图标,光标,背景是在窗口类设计是指定的,因此要改的话, 就自己定义一个WNDCLASS wc,按照自己的需要填充wc,并注册RegisterClass(&wc) 1. 在MFC程序中,要修改出现窗口图表只能在框架类进行(CMainFrame) 2. 要修改背景和光标,应该在视类中进行,在框架类修改则看不见

-----------------------------不要在跟自己无关的事情上浪费时间 2555

阅文集团大数据面试题及参考答案

在 Flink 中,watermark 是一种用于处理乱序事件时间的机制。实现接口:通常需要实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks 接口。前者会周期性地生成 watermark,后者则是基于某些特定事件来生成 watermark ,比如接收到某个特定值的消息时。定义位置:可以在数据源处或者在流处理的中间操作中定义 watermark。在数据源定义时,能更精准地根据数据的产生特性设置 watermark;

大模型大数据攻城狮的专栏 1088

22、狭义相对论与曲线坐标空间相关知识解析

本文深入解析了狭义相对论与曲线坐标空间的核心概念,涵盖能量-动量张量的定义与守恒、曲线坐标系下的度量张量与基向量性质、协变与逆变张量的变换规则,并介绍了克里斯托费尔符号与协变导数的计算方法。进一步探讨了在弯曲空间中进行微积分运算的基础理论及其在广义相对论中的关键应用,如爱因斯坦场方程如何描述物质-能量对时空曲率的影响,为理解黑洞等引力现象提供了理论框架。

lambda的博客 116

ECS学习笔记 Lesson2 <使用Job生成Cube>

本文主要介绍如何使用Job替代System的方式来创建实体,并且比较了两种方式的优缺点。而且介绍了过程中涉及的其他一些ecs知识

Mxiaojf的博客 1172

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题5)-网络部分解析-附详细代码

bfq05234214的博客 416

孙鑫VC++深入详解:Lesson9 Part1---修改应用程序窗口

一. 在窗口创建之前修改:       要在MainFrame中的虚函数PreCreateWindow(CREATESTRUCT& cs)中修改CREATESTRUCT      修改窗口标题,2个步骤    step1:抹去窗口样式中的FWS_ADDTOTITLE,该样式是指示框架将文档标题添加到窗口标题中          cs.style &=~FWS_ADDTOTITLE;

-----------------------------不要在跟自己无关的事情上浪费时间 1250

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Lesson2

#ifdef __cplusplus #include <cstdlib> #else #include <stdlib.h> #endif #include <SDL/SDL.h> #include <string> const int SCREEN_WIDTH=640; const int SCR...

dh7995的博客 94

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java GUI编程lesson03-多个Frame窗口

问题引入:有时候需要创建好几个同样或者类似的窗口,我们应该怎样做? 解决此类问题,首当其冲应该想到继承,由于初学java所以顺便复习一下类的封装和继承。 首先,这是我们原本想要的窗口的实现 public class TestFrame { public static void main(String[] args) { Frame frame = new Frame("我的第一个Java图像界面窗口"); frame.setVisible(true);

weixin_43624635的博客 546

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

lesson 2 Gradle基本语法

lesson 2 Gradle基本语法 之前说过,gradle是基于Groovy语言的,那么现在来说一说他的一些基本语法,和在gradle中常用的一些方法。 如果小伙伴们使用了eclipse或者idea那么都可以使用IDE中安装的groovy插件进行操作。下面以idea为例。 在idea中工具栏中选择tools-&amp;amp;gt;Groovy console就可以打开一个groovy的窗口了。 然后可以在里...

wwjjhh的博客 242

Lesson2-1:OpenCV基本操作

我们通过加载灰度图像,显示图像,如果按’s’并退出则保存图像,或者按ESC键直接退出而不保存。

一名混沌的大学生 893

lesson 2

#创建三角形 #include <iostream> //GLEW #define GLEW_STATIC #include <GL/glew.h> //GLFW #include <GLFW/glfw3.h> using namespace std; //创建一个窗口,定义窗口的宽高常亮 const GLint WIDTH = 800, HEIGHT = 6...

qq_43427624的博客 207

lesson2turtle库

turtle库

qq_74738573的博客 358

Lesson2_Inspector窗口可编辑变量

【代码】Lesson2_Inspector窗口可编辑变量。

2501_91319803的博客 148

Lesson1: Windows程序运行原理及程序编写流程

1. Windows API与Win32 SDK 操作系统提供了各种方便开发Windows应用程序的编程接口,所有的函数都在Windows.h头文件中声明。 Win32 SDK(Software Development Kit): 即Windows 32位平台下的软件开发包,包括API函数,帮助文档,微软提供的一些辅助开发工具。 2.  窗口与句柄 窗口是是屏幕上一块矩形区域,是Windo

2023

Lesson 3: 创建窗口

原文地址: http://www.directxtutorial.com/Lesson.aspx?lessonid=11-1-3与Lesson2一样,我们使用WinMain函数开始我们的程序。另外,我们将使用另一个叫WinProc()的函数。这个函数将在程序运行的时候处理所有Windows发送给我们的事件消息。下面这个代码用来创建以及运行一个窗口:// include the basic wind

Nim的辙迹 460

Lesson5-2:OpenCV视频操作---视频追踪

Meanshift和camshift算法都各有优势,自然也有劣势:Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。camshift算法:可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。总结meanshift原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。

一名混沌的大学生 718

sdl lesson

#include <iostream> #include <SDL.h> #include <windows.h> /* * Lesson 0: Test to make sure SDL is setup properly */ //#define LESSON_5 //#define LESSON_4 //#define LESSON...

weixin_30387339的博客 101

学习Nehe Lesson1

Nehe Lesson1

九洲幻域 423
上一篇: Lesson 1: 游戏程序的组成
下一篇: Lesson 3: 创建窗口
Nim的辙迹
博客等级 码龄10年 17粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值