我们必须注册一个对话框吗?

时间: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.