我们必须注册一个对话框吗?
时间:2020-03-05 18:45:42 来源:igfitidea点击:
因此,我是所有与Windows相关的编程的初学者。我一直在使用Windows API 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); }
第二个示例不包含对register函数的任何调用。它只是创建带有DialogProc进程的DialogBox。
这可以正常工作,但是我想知道注册窗口类然后创建对话框是否有好处(如果可以的话)。
解决方案
回答
我们不必注册对话框。
对话框是预定义的,因此(如我们所述),在创建对话框时没有对窗口类的引用。如果要对对话框进行更多控制(如创建自己的窗口类时所获得的),则可以将对话框子类化,这是一种用自己的方法替换对话框窗口过程的方法。调用过程时,我们将修改对话框窗口的行为。然后,我们可能会或者可能不会调用原始窗口过程,具体取决于我们要执行的操作。
回答
这仅与问题相关,但是如果我们不熟悉Windows编程,为什么要使用Win32?除非有很多低端代码(无论如何都应与GUI分开),否则使用.NET可能更有意义,因为它也应该减少头部受伤。
回答
自从我这样做已经有一段时间了,但是IIRC,第一种情况是从内存中的模板动态创建对话框。第二个示例用于使用资源创建对话框的更为常见的情况。 Win32中的动态对话框内容相当复杂,但是它允许我们创建一个真正的数据驱动界面,并避免将资源与DLL捆绑在一起的问题。
至于为什么要使用Win32,如果我们需要Windows应用程序并且不想依赖MFC或者.NET运行时,那就使用了Win32.