题
所以,我在任何方面都是一个完全的初学者 Windows
相关编程。我一直在玩 Windows
API
并遇到了几个关于如何初始化创建窗口等的示例。
一个示例创建一个常规窗口(我缩写了一些代码):
int WINAPI WinMain( [...] )
{
[...]
// Windows Class setup
wndClass.cbSize = sizeof( wndClass );
wndClass.style = CS_HREDRAW | CS_VREDRAW;
[...]
// Register class
RegisterClassEx( &wndClass );
// Create window
hWnd = CreateWindow( szAppName, "Win32 App",
WS_OVERLAPPEDWINDOW,
0, 0, 512, 384,
NULL, NULL, hInstance, NULL );
[...]
}
第二个示例创建一个对话框(除了 WinMain 参数之外没有缩写):
int WINAPI WinMain( [...] )
{
// Create dialog box
DialogBox(hInstance,
MAKEINTRESOURCE(IDD_MAIN_DLG),
NULL,
(DLGPROC)DialogProc);
}
第二个示例不包含对寄存器函数的任何调用。它只是创建 DialogBox 及其附加的 DialogProc 进程。
这工作正常,但我想知道注册窗口类然后创建对话框是否有好处(如果可能的话)。
解决方案
您不必注册对话框。
对话框是预定义的,因此(正如您所指出的)在创建对话框时没有对窗口类的引用。如果您想要对对话框进行更多控制(就像您创建自己的窗口类时获得的那样),您可以对对话框进行子类化,这是一种用您自己的对话框窗口过程替换对话框的方法。当您的过程被调用时,您可以修改对话框窗口的行为;然后,您可能会也可能不会调用原始窗口过程,具体取决于您想要执行的操作。
其他提示
我已经有一段时间没有这样做了,但是 IIRC,第一种情况是从内存模板动态创建对话框。第二个示例适用于使用资源创建对话框的更为常见的情况。Win32 中的动态对话框内容相当复杂,但它允许您创建真正的数据驱动界面,并避免将资源与 DLL 捆绑在一起的问题。
至于为什么使用 Win32 - 如果您需要 Windows 应用程序并且不想依赖 MFC 或 .NET 运行时,那么您就可以使用 Win32。
这与问题无关,但如果您是 Windows 编程新手,为什么要使用 Win32?除非有大量低端代码(无论如何都应该与 GUI 分开),否则使用 .NET 可能更有意义,这也会导致头部受伤少得多。
不隶属于 StackOverflow