rst*_*t12 1 c++ window createwindowex
当我单击主窗口上的按钮时,我试图创建一个弹出窗口,而我正在使用CreateWindowEX函数。但是,CreateWindowEx函数将HINSTANCE类型变量作为倒数第二个参数。假设单击按钮时我是从WndProcedure内部创建此新窗口的,所以WinMain函数中的HINSTANCE变量对我来说将不可用,因为它不是全局变量。
从WndProcedure回调函数获得以下代码:
case IDC_BUTTON PRESSED:
{
const char g_szClassName2[] = "POPWIND";
const char WndName2[] = "POPUP WINDOW";
HWND invisWindowHandle = CreateWindowEx(0,
g_szClassName2,
WndName2,
WS_OVERLAPPEDWINDOW,
200,
200,
800,
500,
NULL,
NULL,
hInstance,//THIS IS THE VARIABLE I AM HAVING TROUBLE GETTING
NULL);
ShowWindow(invisWindowHandle, 3);// SW_SHOWNORMAL);
UpdateWindow(invisWindowHandle);
}
Run Code Online (Sandbox Code Playgroud)
我该如何获取所需的hInstance变量,以便CreateWindowEx函数从WndProcedure回调函数内部运行?
注意:我考虑过将hInstance变量设置为全局变量,但是我不确定我的应用程序创建的每个窗口是否都必须使用相同的hInstance。
Winapi具有从Windows版本1到3继承的一些负担。它们使用协作式多任务处理,通过使用相同程序并向其传递不同的hInstance值来实现运行相同的“任务”。使多任务GUI操作系统挤入640 KB RAM的重要技巧。
在21年前,随着Windows NT的发布,此后就不再相关了,紧接着是Windows95。Windows版本首先支持进程的概念。作为安全性和系统稳定性的重要概念,正在运行的程序之间存在非常强烈的隔离。因此,HINSTANCE的相关性消失了,每个进程都获得了相同的值。一个伪句柄。对于HMODULE几乎一样,它只是模块加载到内存中的地址。
因此,为hInstance参数传递NULL是可以的。它表示“当前进程”,您不能为另一个进程创建窗口。并且将从WinMain()获得的hInstance存储在一个全局变量中也是可以的,只有一个。