CreateWindowExW 函数 (winuser.h)

创建具有扩展窗口样式的重叠、弹出窗口或子窗口;否则,此函数与 CreateWindow 函数相同。 有关创建窗口以及 CreateWindowEx 的其他参数的完整说明的详细信息,请参阅 CreateWindow

语法

HWND CreateWindowExW(
  [in]           DWORD     dwExStyle,
  [in, optional] LPCWSTR   lpClassName,
  [in, optional] LPCWSTR   lpWindowName,
  [in]           DWORD     dwStyle,
  [in]           int       X,
  [in]           int       Y,
  [in]           int       nWidth,
  [in]           int       nHeight,
  [in, optional] HWND      hWndParent,
  [in, optional] HMENU     hMenu,
  [in, optional] HINSTANCE hInstance,
  [in, optional] LPVOID    lpParam
);

参数

[in] dwExStyle

类型:DWORD

正在创建的窗口的扩展窗口样式。 有关可能值的列表,请参阅 扩展窗口样式

[in, optional] lpClassName

类型: LPCTSTR

由上一次对 RegisterClass 或 RegisterClassEx 函数的调用创建的终止字符串或类原子。 原子必须位于 lpClassName 的低序单词中;高序单词必须为零。 如果 lpClassName 是字符串,则指定窗口类名称。 类名可以是注册到 RegisterClassRegisterClassEx 的任何名称,前提是注册该类的模块也是创建窗口的模块。 类名也可以是任何预定义 的系统类 名称。

[in, optional] lpWindowName

类型: LPCTSTR

窗口名称。 如果窗口样式指定标题栏,则 lpWindowName 指向的窗口标题将显示在标题栏中。 使用 CreateWindow 创建控件(如按钮、复选框和静态控件)时,请使用 lpWindowName 指定控件的文本。 使用 SS_ICON 样式创建静态控件时,请使用 lpWindowName 指定图标名称或标识符。 若要指定标识符,请使用语法“#num”。

[in] dwStyle

类型:DWORD

正在创建的窗口的样式。 此参数可以是 窗口样式值的组合,以及“备注”部分中指示的控件样式。

[in] X

类型: int

窗口的初始水平位置。 对于重叠或弹出窗口, x 参数是窗口左上角的初始 x 坐标,以屏幕坐标表示。 对于子窗口, x 是窗口左上角相对于父窗口工作区左上角的 x 坐标。 如果 x 设置为 CW_USEDEFAULT,系统将选择窗口左上角的默认位置,并忽略 y 参数。 CW_USEDEFAULT 仅适用于重叠窗口;如果为弹出窗口或子窗口指定, 则 xy 参数设置为零。

[in] Y

类型: int

窗口的初始垂直位置。 对于重叠或弹出窗口, y 参数是窗口左上角的初始 y 坐标,以屏幕坐标表示。 对于子窗口, y 是子窗口左上角相对于父窗口工作区左上角的初始 y 坐标。 对于列表框 y ,是列表框工作区左上角相对于父窗口工作区左上角的初始 y 坐标。

如果使用 WS_VISIBLE 样式位集创建重叠窗口,并且 x 参数设置为 CW_USEDEFAULT,则 y 参数将确定窗口的显示方式。 如果 y 参数CW_USEDEFAULT,则窗口管理器会在创建窗口后使用SW_SHOW标志调用 ShowWindow。 如果 y 参数是其他一些值,则窗口管理器将使用该值作为 nCmdShow 参数调用 ShowWindow

[in] nWidth

类型: int

窗口的宽度(以设备单位为单位)。 对于重叠的窗口, nWidth 是窗口的宽度、屏幕坐标或 CW_USEDEFAULT。 如果 nWidth是CW_USEDEFAULT,则系统会为窗口选择默认宽度和高度;默认宽度从初始 x 坐标扩展到屏幕的右边缘;默认高度从初始 y 坐标扩展到图标区域的顶部。 CW_USEDEFAULT 仅适用于重叠窗口;如果为弹出窗口或子窗口指定 了CW_USEDEFAULT则 nWidthnHeight 参数设置为零。

[in] nHeight

类型: int

窗口的高度(以设备单位为单位)。 对于重叠窗口, nHeight 是窗口的高度(以屏幕坐标为单位)。 如果 nWidth 参数设置为 CW_USEDEFAULT,则系统将忽略 nHeight

[in, optional] hWndParent

类型:HWND

正在创建的窗口的父窗口或所有者窗口的句柄。 若要创建子窗口或拥有的窗口,请提供有效的窗口句柄。 对于弹出窗口,此参数是可选的。

若要创建 仅消息窗口,请向现有仅消息窗口提供 HWND_MESSAGE 或句柄。

[in, optional] hMenu

类型: HMENU

菜单的句柄,或指定子窗口标识符,具体取决于窗口样式。 对于重叠或弹出窗口, hMenu 标识要与窗口一起使用的菜单;如果使用类菜单,则为 NULL 。 对于子窗口, hMenu 指定子窗口标识符,即对话框控件用来通知其父级事件的整数值。 应用程序确定子窗口标识符;对于具有相同父窗口的所有子窗口,它必须是唯一的。

[in, optional] hInstance

类型: HINSTANCE

要与窗口关联的模块实例的句柄。

[in, optional] lpParam

类型: LPVOID

指向通过 CREATESTRUCT 结构传递给窗口的值的指针, (lpCreateParams 成员) WM_CREATE消息的lParam 参数所指向的值。 此消息在返回之前由此函数发送到创建的窗口。

如果应用程序调用 CreateWindow 创建 MDI 客户端窗口, lpParam 应指向 CLIENTCREATESTRUCT 结构。 如果 MDI 客户端窗口调用 CreateWindow 以创建 MDI 子窗口, lpParam 应指向 MDICREATESTRUCT 结构。 如果不需要其他数据,则 lpParam 可能为 NULL

返回值

类型:HWND

如果函数成功,则返回值是新窗口的句柄。

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

此函数通常因以下原因之一而失败:

  • 参数值无效
  • 系统类由其他模块注册
  • WH_CBT挂钩已安装并返回失败代码
  • 如果未注册对话模板中的其中一个控件,或者其窗口窗口过程 WM_CREATEWM_NCCREATE

注解

CreateWindowEx 函数将WM_NCCREATEWM_NCCALCSIZEWM_CREATE消息发送到正在创建的窗口。

如果创建的窗口是子窗口,则其默认位置位于 Z 顺序的底部。 如果创建的窗口是顶级窗口,则其默认位置位于 Z 顺序 (顶部,但位于所有最顶层窗口下方,除非创建的窗口本身是最顶层的) 。

有关控制任务栏是否显示已创建窗口的按钮的信息,请参阅 “管理任务栏按钮”。

有关删除窗口的信息,请参阅 DestroyWindow 函数。

可以在 lpClassName 参数中指定以下预定义的控件类。 请注意 可在 dwStyle 参数中使用的相应控件样式。

含义
BUTTON 指定表示用户可以单击的按钮的小型矩形子窗口以打开或关闭它。 按钮控件可以单独使用,也可以在组中使用,并且可以标记或显示没有文本。 当用户单击按钮控件时,按钮控件通常会更改外观。 有关详细信息,请参阅 按钮

有关可在 dwStyle 参数中指定的按钮样式表,请参阅 按钮样式

COMBOBOX 指定由列表框和类似于编辑控件的选择字段组成的控件。 使用此样式时,应用程序应随时显示列表框或启用下拉列表框。 如果列表框可见,在选择字段中键入字符会突出显示与键入的字符匹配的第一个列表框项。 相反,选择列表框中的项将显示所选字段中的选定文本。 有关详细信息,请参阅 组合框

有关可以在 dwStyle 参数中指定的组合框样式表,请参阅 组合框样式

EDIT 指定一个矩形子窗口,用户可以在其中键入键盘中的文本。 用户选择控件,并通过按 TAB 键将其单击或移动到键盘焦点来提供键盘焦点。 当编辑控件显示闪烁的插入点时,用户可以键入文本;使用鼠标移动光标、选择要替换的字符,或将光标定位为插入字符;或使用密钥删除字符。 有关详细信息,请参阅 “编辑控件”。

有关可在 dwStyle 参数中指定的编辑控件样式表,请参阅 “编辑控件样式”。

LISTBOX 指定字符串列表。 每当应用程序必须显示名称列表(例如文件名)时,用户都可以从中指定此控件。 用户可以通过单击该字符串来选择字符串。 突出显示所选字符串,并将通知消息传递给父窗口。 有关详细信息,请参阅 列表框

有关可在 dwStyle 参数中指定的列表框样式表,请参阅 列表框样式

MDICLIENT 指定 MDI 客户端窗口。 此窗口接收控制 MDI 应用程序子窗口的消息。 建议的样式位 WS_CLIPCHILDRENWS_CHILD。 指定 WS_HSCROLLWS_VSCROLL 样式以创建 MDI 客户端窗口,允许用户将 MDI 子窗口滚动到视图中。 有关详细信息,请参阅 多个文档接口
RichEdit 指定 Microsoft Rich Edit 1.0 控件。 此窗口允许用户使用字符和段落格式查看和编辑文本,并且可以包括嵌入的组件对象模型 (COM) 对象。 有关详细信息,请参阅 Rich Edit Controls

有关可在 dwStyle 参数中指定的富编辑控件样式表,请参阅 Rich Edit Control Styles

RICHEDIT_CLASS 指定 Microsoft Rich Edit 2.0 控件。 通过此控件,用户可以使用字符和段落格式查看和编辑文本,并且可以包含嵌入的 COM 对象。 有关详细信息,请参阅 Rich Edit Controls

有关可在 dwStyle 参数中指定的富编辑控件样式表,请参阅 Rich Edit Control Styles

SCROLLBAR 指定包含滚动框的矩形,并在两端具有方向箭头。 每当用户单击控件时,滚动条就会向其父窗口发送通知消息。 如有必要,父窗口负责更新滚动框的位置。 有关详细信息,请参阅 滚动条

有关可在 dwStyle 参数中指定的滚动条控件样式表,请参阅 滚动条控件样式

STATIC 指定用于标记、框或其他控件的简单文本字段、框或矩形。 静态控件不采用任何输入并提供无输出。 有关详细信息,请参阅 静态控件

有关可以在 dwStyle 参数中指定的静态控件样式表,请参阅 静态控件样式

 

dwExStyle的WS_EX_NOACTIVATE值可防止系统进行前台激活。 若要在用户单击窗口时防止队列激活,必须适当处理 WM_MOUSEACTIVATE 消息。 若要将窗口引入前台或以编程方式激活窗口,请使用 SetForegroundWindowSetActiveWindow。 将 FALSE 返回到 WM_NCACTIVATE 可防止窗口丢失队列激活。 但是,在激活时忽略返回值。

设置 WS_EX_COMPOSITED 后,窗口的所有后代使用双缓冲获得从下到上绘制顺序。 从下到上绘制顺序允许后代窗口具有半透明 (alpha) 和透明度 (颜色键) 效果,但仅当后代窗口也有 WS_EX_TRANSPARENT 位集时。 双缓冲允许不闪烁地绘制窗口及其后代。

示例

以下示例代码演示 了 CreateWindowExA 的使用。

BOOL Create(
        PCWSTR lpWindowName,
        DWORD dwStyle,
        DWORD dwExStyle = 0,
        int x = CW_USEDEFAULT,
        int y = CW_USEDEFAULT,
        int nWidth = CW_USEDEFAULT,
        int nHeight = CW_USEDEFAULT,
        HWND hWndParent = 0,
        HMENU hMenu = 0
        )
    {
        WNDCLASS wc = {0};

        wc.lpfnWndProc   = DERIVED_TYPE::WindowProc;
        wc.hInstance     = GetModuleHandle(NULL);
        wc.lpszClassName = ClassName();

        RegisterClass(&wc);

        m_hwnd = CreateWindowEx(
            dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,
            nWidth, nHeight, hWndParent, hMenu, GetModuleHandle(NULL), this
            );

        return (m_hwnd ? TRUE : FALSE);
    }

注意

winuser.h 标头将 CreateWindowEx 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非中性编码别名与非非编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅 函数原型的约定

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 winuser.h (包括 Windows.h)
Library User32.lib
DLL User32.dll
API 集 ext-ms-win-ntuser-window-l1-1-0 (在 Windows 8) 中引入

请参阅

关于多个文档接口

CLIENTCREATESTRUCT

CREATESTRUCT

概念性

CreateWindow

DestroyWindow

EnableWindow

其他资源

参考

RegisterClass

RegisterClassEx

SetActiveWindow

SetForegroundWindow

SetWindowLong

SetWindowPos

ShowWindow

WM_CREATE

WM_NCCALCSIZE

WM_NCCREATE

WM_PAINT

WM_PARENTNOTIFY

Windows