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终止字符串或类原子。
如果 null-terminated 字符串,则指定窗口类名。 类名可以是注册到 RegisterClass 或 RegisterClassEx 函数的任何名称,前提是注册该类的模块也是创建窗口的模块。 类名也可以是任何预定义 系统类 名称。
如果先前调用 RegisterClass 或 RegisterClassEx创建的类 atom,则必须使用宏 MAKEINTATOM进行转换。 (原子必须位于 lpClassName的低序单词中;高阶单词必须为零。
[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 仅适用于重叠窗口;如果为弹出窗口或子窗口指定,则 x 和 y 参数设置为零。
[in] Y
类型:int
窗口的初始垂直位置。 对于重叠窗口或弹出窗口,y 参数是窗口左上角的初始 y 坐标,以屏幕坐标表示。 对于子窗口,y 是子窗口左上角相对于父窗口工作区左上角的初始 y 坐标。 对于列表框 y 是列表框工作区左上角相对于父窗口工作区左上角的初始 y 坐标。
如果使用 WS_VISIBLE 样式位设置创建重叠窗口,并将 x 参数设置为 CW_USEDEFAULT,则 y 参数将确定窗口的显示方式。 如果 y 参数 CW_USEDEFAULT,则窗口管理器会在创建窗口后使用 SW_SHOW 标志调用 ShowWindow。 如果 y 参数是一些其他值,则窗口管理器会调用 ShowWindow,该值作为 nCmdShow 参数。
[in] nWidth
类型:int
窗口的宽度(以设备单位为单位)。 对于重叠窗口,nWidth 是窗口的宽度、屏幕坐标或 CW_USEDEFAULT。 如果 nWidth 为 CW_USEDEFAULT,则系统会选择窗口的默认宽度和高度;默认宽度从初始 x 坐标扩展到屏幕右边缘;默认高度从初始 y 坐标扩展到图标区域的顶部。 CW_USEDEFAULT 仅适用于重叠窗口;如果为弹出窗口或子窗口指定了 CW_USEDEFAULT,则 nWidth,nHeight 参数设置为零。
[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_NCCREATE、WM_NCCALCSIZE和 WM_CREATE 消息发送到正在创建的窗口。
如果创建的窗口是子窗口,则其默认位置位于 Z 顺序的底部。 如果创建的窗口是顶级窗口,则其默认位置位于 Z 顺序的顶部(但除非创建窗口本身是最顶层的窗口)的顶部。
有关控制任务栏是否显示已创建窗口的按钮的信息,请参阅 管理任务栏按钮。
有关删除窗口的信息,请参阅 DestroyWindow 函数。
可以在 lpClassName 参数中指定以下预定义的控件类。 请注意可在 dwStyle 参数中使用的相应控件样式。
类 | 意义 |
---|---|
按钮 |
指定一个小矩形子窗口,表示用户可以单击的按钮以打开或关闭它。 按钮控件可以单独使用,也可以在组中使用,并且可以标记或显示无文本。 当用户单击按钮控件时,按钮控件通常会更改外观。 有关详细信息,请参阅 按钮。
有关可在 dwStyle 参数中指定的按钮样式表,请参阅 按钮样式。 |
COMBOBOX |
指定由列表框和类似于编辑控件的选择字段组成的控件。 使用此样式时,应用程序应随时显示列表框或启用下拉列表框。 如果列表框可见,请在选择字段中键入字符会突出显示与键入的字符匹配的第一个列表框项。 相反,选择列表框中的项将显示选定字段中的选定文本。 有关详细信息,请参阅 组合框。
有关可以在 dwStyle 参数中指定的组合框样式表,请参阅 组合框样式。 |
EDIT |
指定一个矩形子窗口,用户可以在其中键入键盘中的文本。 用户选择该控件,并通过按 Tab 键将其移动到该控件,并为其提供键盘焦点。 当编辑控件显示闪烁插入点时,用户可以键入文本;使用鼠标移动光标、选择要替换的字符,或将光标定位为插入字符;或使用密钥删除字符。 有关详细信息,请参阅 编辑控件。
有关可在 dwStyle 参数中指定的编辑控件样式表,请参阅 编辑控件样式。 |
LISTBOX |
指定字符串列表。 每当应用程序必须提供名称列表(例如文件名)时,即可指定此控件,用户可以从中选择这些名称。 用户可以通过单击字符串来选择字符串。 突出显示所选字符串,并将通知消息传递到父窗口。 有关详细信息,请参阅 列表框。
有关可在 dwStyle 参数中指定的列表框样式表,请参阅 列表框样式。 |
MDICLIENT | 指定 MDI 客户端窗口。 此窗口接收控制 MDI 应用程序的子窗口的消息。 建议的样式位 WS_CLIPCHILDREN 和 WS_CHILD。 指定 WS_HSCROLL 和 WS_VSCROLL 样式以创建 MDI 客户端窗口,允许用户将 MDI 子窗口滚动到视图中。 有关详细信息,请参阅 多个文档界面。 |
RichEdit |
指定 Microsoft Rich Edit 1.0 控件。 此窗口允许用户使用字符和段落格式查看和编辑文本,并且可以包括嵌入的组件对象模型 (COM) 对象。 有关详细信息,请参阅 富编辑控件。
有关可在 dwStyle 参数中指定的富编辑控件样式表,请参阅 Rich Edit Control Styles。 |
RICHEDIT_CLASS |
指定 Microsoft Rich Edit 2.0 控件。 此控件允许用户使用字符和段落格式查看和编辑文本,并且可以包括嵌入的 COM 对象。 有关详细信息,请参阅 富编辑控件。
有关可在 dwStyle 参数中指定的富编辑控件样式表,请参阅 Rich Edit Control Styles。 |
SCROLLBAR |
指定一个矩形,该矩形包含滚动框,并在两端具有方向箭头。 每当用户单击控件时,滚动条就会向其父窗口发送通知消息。 父窗口负责根据需要更新滚动框的位置。 有关详细信息,请参阅 滚动条。
有关可在 dwStyle 参数 |
STATIC |
指定用于标记、框或其他控件的简单文本字段、框或矩形。 静态控件不采用任何输入并提供任何输出。 有关详细信息,请参阅 静态控件。
有关可以在 dwStyle 参数中指定的静态控件样式表,请参阅 静态控件样式。 |
dwExStyle 的 WS_EX_NOACTIVATE 值可防止系统进行前台激活。 若要在用户单击窗口时阻止队列激活,必须相应地处理 WM_MOUSEACTIVATE 消息。 若要将窗口引入前台或以编程方式激活窗口,请使用 SetForegroundWindow 或 SetActiveWindow。 返回 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 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | winuser.h (包括 Windows.h) |
库 | User32.lib |
DLL | User32.dll |
API 集 | ext-ms-win-ntuser-window-l1-1-0(在 Windows 8 中引入) |
另请参阅
概念
其他资源
参考