C语言 如何使用Windows创建窗口,h?

kulphzqa  于 2023-04-29  发布在  Windows
关注(0)|答案(2)|浏览(200)

我一直在阅读有关创建基于Windows的应用程序的教程。他们中的每一个都告诉我使用某种库或框架。现在,我明白了为什么使用库和框架是一条正确的道路,我也明白了,从我被告知的情况来看,每个人都在使用它们,所以这样做没有什么错。但是,我真的很想深入了解它,并找出窗口是如何创建和操纵从一个非常低的水平。
在C/C教程中,我看到有人包括windows.h文件。里面到底有什么魔法?不就是C/C代码吗?如果是的话,那么是否可以创建不包含任何内容的窗口?

o2g1uqev

o2g1uqev1#

TL;DR:程序要求Windows为其创建窗口

Windows。h头包含允许C或C++程序轻松与Win32 API交互的定义。Win32 API是Windows提供的主要API,允许程序从底层操作系统请求服务和信息。它为很多事情提供服务;从窗口管理到存储器分配到设备枚举到文件处理。在Windows上运行的每个程序都运行在Win32 API之上,无论您是直接使用它还是间接使用它(例如,通过编程语言的标准库)。当你的代码使用Win32 API“创建一个窗口”时,你实际上是要求Windows操作系统代表你创建一个窗口。
但为什么呢?
在屏幕上绘制窗口并向其提供输入需要与几个不同的组件进行交互。在过去(甚至在今天,在嵌入式系统中),这并不是一件大事。您针对特定型号的计算机编写程序,因此您确切地知道它有什么硬件以及如何管理它。在内存中输入一些数据,在那里插入一个寄存器,然后砰的一声,一个图像出现在屏幕上。
这已经不够了。PC是难以置信的模块化,每个系统都是不同的。不同的CPU,不同的GPU,不同的鼠标等等,我们希望我们的程序可以在其中任何一个上运行。正确管理和控制所有不同的硬件是一项艰巨的任务。不要介意多个程序正在争夺对同一底层硬件的同时控制。您需要某种中央管理系统,它确切地知道存在哪些硬件,并且可以调解来自多个程序的请求,以允许它们安全有效地共享该硬件。这是Windows(和其他现代操作系统)提供的服务。

好的,但是Windows如何创建窗口呢?

Windows可能也不知道。它记录每个窗口在屏幕上的位置,并找出哪些窗口在其他窗口之上,并找出鼠标刚才点击的窗口,它最终会将所有这些信息转化为图像绘制在屏幕上。即使从Windows的Angular 来看,所有这些信息都只是内存中的数据。数据如何到达那里或将如何处理它是由专门的硬件驱动程序决定的。其中一些与Windows操作系统(i.即USB鼠标驱动程序),而一些来自第三方(即。即nVidia GPU驱动程序)。这些驱动程序最终负责控制系统中的每个硬件。鼠标驱动程序将告诉Windows鼠标刚刚单击的位置,GPU驱动程序将告诉GPU在屏幕上绘制什么。

3qpi33ja

3qpi33ja2#

头文件(包括窗口。h)只是已经存在的事物的列表。例如,stdio.h有一行类似于下面的代码(但可能使用了各种特定于编译器的繁琐代码):

int printf(const char *fmt, ...);

如果你写过很多代码,你可能已经知道了!)告诉编译器**有一个名为printf的函数,它的第一个参数是const char*,然后是变量参数,然后返回int
它没有说明函数做什么。它没有说明函数在哪里或如何工作。
这与在包含多个源文件的程序中使用头文件(或不使用头文件)的情况完全相同。操作系统头文件与您自己的头文件没有什么不同,只是它们要大得多。
在每个源文件被编译之后,linker 获取所有编译的源文件(目标文件),可能还有库文件。在Windows上,你有一堆来自Windows操作系统的库文件。如果使用函数CreateWindowA(这是CreateWindow的实际调用),链接器将查找所有的目标文件和库文件,以查看它是在哪里定义的,它将在user32.lib中找到它。如果您使用的是Visual Studio,则会自动添加user32.lib。如果你正在使用其他东西,那么也许你必须自己添加它。
user32.lib不是一个真实的的库文件。这是一个Windows的东西,称为 * 导入库 *,这意味着代码实际上是在一个DLL和。lib文件只是指向DLL的路标。所以最后发生的是程序没有CreateWindowA的代码,但是它有一个注解,说当加载程序时,在user32.dll中查找CreateWindowA
当操作系统加载程序时,它也会加载程序使用的所有DLL,例如user32.dll
那么user32.dll中的代码是什么呢?有一堆C代码,最终它会到达一个叫做 system call 的指令,这是一个CPU指令,它告诉CPU停止运行程序,去告诉操作系统用操作系统权限做一些事情。你不能用C或C++编写系统调用指令,所以这部分是用汇编代码或内联汇编代码编写的。操作系统收到请求,然后做任何它需要做的事情来创建一个窗口。
(Yes,你可以用汇编代码在你的程序中编写一个,但是要注意,在每个Windows版本中所需的指令是不同的,这就是为什么它们在DLL中-所以如果你想让你的程序真正工作,最好不要这样做)

相关问题