CreateWindowExA 函数 (winuser.h)

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

语法

HWND CreateWindowExA(
  [in]           DWORD     dwExStyle,
  [in, optional] LPCSTR    lpClassName,
  [in, optional] LPCSTR    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

一个以 null 结尾的字符串或先前对 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_CREATE 失败或 WM_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 控件

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

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

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

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 集 在 Windows 8) 中引入的 ext-ms-win-ntuser-window-l1-1-0 (

另请参阅

关于多文档界面

CLIENTCREATESTRUCT

CREATESTRUCT

概念性

CreateWindow

DestroyWindow

EnableWindow

其他资源

引用

RegisterClass

RegisterClassEx

SetActiveWindow

SetForegroundWindow

SetWindowLong

SetWindowPos

ShowWindow

WM_CREATE

WM_NCCALCSIZE

WM_NCCREATE

WM_PAINT

WM_PARENTNOTIFY

Windows