你必须注册一个对话框吗?

时间:2008-08-31 17:45:46

标签: c++ winapi

所以,我是任何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进程。

这很好用,但我想知道是否有注册窗口类然后创建对话框的好处(如果这是可能的话)。

3 个答案:

答案 0 :(得分:2)

您无需注册对话框。

对话框是预定义的(如您所述),在创建对话框时没有对窗口类的引用。如果您想要更多地控制对话框(就像您在创建自己的窗口类时所获得的那样),您可以继承对话框,这是一种方法,您可以使用自己的方法替换对话框窗口过程。调用过程时,您可以修改对话框窗口的行为;然后,您可能会或可能不会调用原始窗口过程,具体取决于您要执行的操作。

答案 1 :(得分:1)

我已经有一段时间了,但IIRC,第一种情况是从内存模板动态创建对话框。第二个示例是针对使用资源创建对话的更常见情况。 Win32中的动态对话框相当复杂,但它允许您创建一个真正的数据驱动的接口,并避免与DLL捆绑资源的问题。

至于为何使用Win32 - 如果你需要一个Windows应用程序并且你不想依赖于MFC或.NET运行时,那就是你使用的。

答案 2 :(得分:0)

这只是与问题相关,但如果您是Windows编程新手,为什么使用Win32?除非有很多低端代码(无论如何都应该与GUI分开),否则使用.NET可能更有意义,这也会导致头部伤害更少。