创建HWND的最简单方法

6
我需要在MSVC++中创建一个虚拟窗口,它永远不会被显示并且甚至在应用程序的主窗口之前就被创建。这是渲染引擎所需的。因此,如果可能的话,最好不要注册类。
为了测试,最好让它可见以证明它存在 - 我可以使用静态或按钮之类的东西吗?我一直在尝试使用CreateWindow(),但是虽然我得到了返回值,但没有任何可见的内容出现。

1
“required by a rendering engine” 表示此窗口用于创建渲染上下文。是这样吗?如果是这样,最好创建与应用程序窗口相同类的窗口。否则,您无法保证 a) 您是否能够创建上下文,以及 b) 上下文是否与稍后使用的上下文兼容。无论如何,您都必须为主窗口注册一个类,因此它实际上并不“额外费用”。 - Damon
我没有创建自己的主窗口,因此我没有可重用的类...这个窗口将被引擎用作虚拟渲染窗口...实际上不会被渲染。 - Mr. Boy
1
我赞同这个观点,因为我经常遇到需要一个虚拟的hWnd的情况。例如,我需要一个hwnd来使用一些win32字体API,以便将字体复制到2D内存数组中而不显示在窗口中。 - Ricky Lung
3个回答

16

我提交了自己的测试代码以供批评:

HWND dummyHWND = ::CreateWindowA("STATIC","dummy",WS_VISIBLE,0,0,100,100,NULL,NULL,NULL,NULL);
::SetWindowTextA(dummyHWND,"Dummy Window!");

它似乎起作用了...


7
为什么不行呢?这是对问题的回答,而且在stackoverflow上回答自己的问题原则上没有任何问题。 - CB Bailey
这是我对自己问题的回答 - 在提出问题后,我尝试了一下,它起作用了。所谓批评意见,是指它可以进行改进或其他方面的优化。 - Mr. Boy
CreateWindow的返回类型为void。CreateWindowEx返回一个HWND。 - Bernd Elkemann

2
创建窗口后,您需要调用ShowWindow使其可见。

5
请指定WS_VISIBLE标志。 - Cody Gray

1
NeHe的第一篇教程中,他们详细描述了设置OpenGL渲染上下文和创建窗口(以及HWND)所需做的工作。如果您需要使用它来处理除OpenGL上下文之外的其他事情,我相信他们提供的代码可以很容易地被采纳。

这差不多是我想要的,但是有没有默认的“空白窗口”类可以使用呢? - Mr. Boy
我没有看到那里。但是我认为删除不需要的代码比创建新代码更容易。这就是为什么我发帖的原因。 - CygnusX1
请不要引用 NeHe。 - RecursiveExceptionException
@itzJanuary 为什么不呢?还要注意,这是一个七年前的问题/答案。 - CygnusX1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接