本节内容主要介绍 Windows 窗口创建 的第二步,如何真正的创建一个窗口。在 Windows 中创建新的窗口实例,需要调用 CreateWindowEx 函数。

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

函数详细的描述可以参考 MSDN 文档,这里简要的做一下概述:

  • dwExStyle 是一个窗口扩展样式(例如让窗口透明),一般直接传空。

  • lpClassName 是在 填充窗口类 的时候所起的名字,它是用来告诉你建立的窗体和那个窗口类进行关联。

  • lpWindowsName,这个就是窗口的标题名。

  • dwStyle,窗口的样式,具体的很多样式组合非常丰富。这里用正常的窗口参数 WS_OVERLAPPEDWINDOW ,它是一堆窗口样式的组合。

  • 第五个和第六个参数表示窗体在建立时的在桌面的位置。从左往右是 x 轴,坐标依次增大,从上到下是 y 轴,坐标依次增大。窗口的左上角是坐标(0,0),当然这里指的是客户区,不算标题栏菜单栏和窗体边界之类的。

  • 第七个和第八个参数分别带表窗体的宽和高。

  • hWndparent 是代表窗体是否有父窗体,填 NULL。

  • hMenu 代表着菜单句柄,表示是否窗体有的菜单,填 NULL。

  • hinstance 一样是窗体应用实例句柄,只要传进 WinMain 函数 的第一个参数即可。

  • 最后一个参数是一个附加参数,类型为 void*。你可以通过该参数将一些自定义数据传递给窗口过程函数。

如果函数执行成功会返回一个窗口的句柄,如果失败则会返回 NULL。