平台 SDK: Windows 用户接口

CreateWindowEx

CreateWindowEx函数创建一个具有扩展窗口样式的重叠,弹出窗口或子窗口; 否则,该功能与CreateWindow函数相同。 有关创建窗口以及CreateWindowEx其他参数的完整说明的更多信息,请参阅CreateWindow

HWND CreateWindowEx(
  DWORD dwExStyle,      // 扩展窗口风格
  LPCTSTR lpClassName,  // 注册类名
  LPCTSTR lpWindowName, // 窗口名称
  DWORD dwStyle,        // 窗口风格
  int x,                // 窗口的水平位置
  int y,                // 窗口的垂直位置
  int nWidth,           // 窗口宽度
  int nHeight,          // 窗口高度
  HWND hWndParent,      // 父级或所有者窗口句柄
  HMENU hMenu,          // 菜单句柄或子标识符
  HINSTANCE hInstance,  // 应用程序实例句柄
  LPVOID lpParam        // 窗口创建数据
);

参数

  • dwExStyle

  • [in] 指定正在创建的窗口的扩展窗口样式。 此参数可以是以下值中的一个或多个。

    风格含义
    WS_EX_ACCEPTFILES指定使用此样式创建的窗口接受拖放文件。
    WS_EX_APPWINDOW当窗口可见时,将任务栏上的顶级窗口强制执行。
    WS_EX_CLIENTEDGE指定窗口与凹陷边缘有边框。
    WS_EX_COMPOSITEDWindows XP: 使用双缓冲,以底部到顶部的绘画顺序绘制窗户的所有后代。 有关详细信息,请参阅备注。 如果窗口具有CS_OWNDC或CS_CLASSDC的类样式,则无法使用。
    WS_EX_CONTEXTHELP在窗口的标题栏中包含一个问号。 当用户点击问号时,光标将变为具有指针的问号。 如果用户然后单击子窗口,则孩子将收到一条WM_HELP消息。 子窗口应将消息传递给父窗口过程,该过程应使用HELP_WM_HELP命令调用WinHelp函数。 “帮助”应用程序显示一个通常包含子窗口帮助的弹出窗口。

    WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX或WS_MINIMIZEBOX样式一起使用。

    WS_EX_CONTROLPARENT窗口本身包含应该参与对话框导航的子窗口。 如果指定了此样式,则执行导航操作(如处理TAB键,箭头键或键盘助记符)时,对话框管理器会递归到此窗口的子项中。
    WS_EX_DLGMODALFRAME创建一个双边框的窗口; 可以通过在dwStyle参数中指定WS_CAPTION样式来选择性地创建带有标题栏的窗口。
    WS_EX_LAYEREDWindows 2000/XP: 创建分层窗口。 请注意,这不能用于子窗口。 此外,如果窗口具有CS_OWNDC或CS_CLASSDC的类样式,则无法使用此方法。
    WS_EX_LAYOUTRTL阿拉伯语和希伯来语版本的Windows 98/Me, Windows 2000/XP: 创建一个水平起点在右边缘的窗口。 增加水平值向左移动。
    WS_EX_LEFT创建一个具有通用左对齐属性的窗口。 这是默认值。
    WS_EX_LEFTSCROLLBAR如果shell语言是希伯来语,阿拉伯语或支持阅读顺序对齐的其他语言,则垂直滚动条(如果存在)位于客户区的左侧。 对于其他语言,该样式将被忽略。
    WS_EX_LTRREADING使用从左到右阅读顺序属性显示窗口文本。 这是默认值。
    WS_EX_MDICHILD创建MDI子窗口。
    WS_EX_NOACTIVATEWindows 2000/XP: 使用此样式创建的顶级窗口在用户单击时不会成为前台窗口。 当用户最小化或关闭前台窗口时,系统不会将此窗口带入前台。

    要激活窗口,请使用SetActiveWindowSetForegroundWindow函数。

    默认情况下,窗口不会出现在任务栏上。 要强制窗口显示在任务栏上,请使用WS_EX_APPWINDOW样式。

    WS_EX_NOINHERITLAYOUTWindows 2000/XP: 使用此样式创建的窗口不会将其窗口布局传递到其子窗口。
    WS_EX_NOPARENTNOTIFY指定使用此样式创建的子窗口在创建或销毁时不会将WM_PARENTNOTIFY消息发送到其父窗口。
    WS_EX_OVERLAPPEDWINDOW组合WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE样式。
    WS_EX_PALETTEWINDOW组合WS_EX_WINDOWEDGE,WS_EX_TOOLWINDOW和WS_EX_TOPMOST样式。
    WS_EX_RIGHT该窗口具有通用的“右对齐”属性。 这取决于窗口类。 这种风格只有在shell语言是希伯来语,阿拉伯语或支持阅读顺序对齐的其他语言的情况下才有效果。 否则,样式将被忽略。
    WS_EX_RIGHTSCROLLBAR垂直滚动条(如果存在)位于客户区域的右侧。 这是默认值。
    WS_EX_RTLREADING如果shell语言是希伯来语,阿拉伯语或支持阅读顺序对齐的其他语言,则使用从右到左的阅读顺序属性显示窗口文本。 对于其他语言,该样式将被忽略。
    WS_EX_STATICEDGE创建一个三维边框样式的窗口,用于不接受用户输入的项目。
    WS_EX_TOOLWINDOW创建工具窗口; 也就是说,一个旨在用作浮动工具栏的窗口。 工具窗口的标题栏比普通的标题栏短,窗口标题用较小的字体绘制。 当用户按ALT + TAB时,工具窗口不会出现在任务栏或对话框中。 如果工具窗口具有系统菜单,则其图标不会显示在标题栏上。 但是,您可以通过右键单击或键入ALT + SPACE来显示系统菜单。
    WS_EX_TOPMOST指定使用此样式创建的窗口应放置在所有非最高窗口的上方,并应保持在其上方,即使窗口处于停用状态。 要添加或删除此样式,请使用SetWindowPos函数。
    WS_EX_TRANSPARENT指定使用此样式创建的窗口不应该被绘制,直到窗口下方(由同一个线程创建)的兄弟姐妹已经被绘制。 窗口看起来是透明的,因为底层兄弟窗口的位已经被绘制了。

    为了实现没有这些限制的透明度,请使用SetWindowRgn函数。

    WS_EX_WINDOWEDGE指定一个窗口与边缘的边框。


    将静态或编辑控件的WS_EX_RIGHT样式用于分别与使用SS_RIGHT或ES_RIGHT样式相同的效果。 使用此按钮控件的样式与使用BS_RIGHT和BS_RIGHTBUTTON样式具有相同的效果。

  • lpClassName

  • [in] 指向由前一次调用RegisterClassRegisterClassEx函数创建的以null结尾的字符串或类原子。 原子必须在lpClassName的低位字中; 高阶字必须为零。

    如果lpClassName是一个字符串,它将指定窗口类名称。 类名可以是使用RegisterClassRegisterClassEx注册的任何名称,只要注册该类的模块也是创建该窗口的模块。 类名也可以是任何预定义的系统类名。

  • lpWindowName

  • [in] 指向指定窗口名称的以空值终止的字符串的指针。

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

  • dwStyle

  • [in] 指定正在创建的窗口的样式。 此参数可以是窗口样式的组合,加上“备注”部分中指示的控件样式。

  • x

  • [in] 指定窗口的初始水平位置。 对于重叠或弹出窗口,x参数是屏幕坐标中窗口左上角的初始x坐标。 对于子窗口,x是相对于父窗口的客户区域的左上角的窗口左上角的x坐标。

    如果x设置为CW_USEDEFAULT,系统将选择窗口左上角的默认位置,并忽略y参数。 CW_USEDEFAULT仅对重叠的窗口有效; 如果为弹出窗口或子窗口指定,则将x和y参数设置为零。

  • y

  • [in] 指定窗口的初始垂直位置。 对于重叠或弹出窗口,y参数是屏幕坐标中窗口左上角的初始y坐标。 对于子窗口,y是子窗口左上角相对于父窗口客户区域左上角的初始y坐标。 对于列表框,y是列表框客户区相对于父窗口客户区左上角的左上角的初始y坐标。

    如果使用WS_VISIBLE样式位设置并将x参数设置为CW_USEDEFAULT创建重叠窗口,则系统将忽略y参数。

  • nWidth

  • [in] 指定窗口的宽度(以设备为单位)。 对于重叠的窗口,nWidth是窗口的宽度,屏幕坐标或CW_USEDEFAULT。 如果nWidth为CW_USEDEFAULT,系统将为窗口选择默认的宽度和高度; 默认宽度从初始x坐标延伸到屏幕的右边缘; 默认高度从初始y坐标延伸到图标区域的顶部。 CW_USEDEFAULT仅对重叠的窗口有效; 如果为弹出窗口或子窗口指定了CW_USEDEFAULT,则nWidth和nHeight参数设置为零。

  • nHeight

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

  • hWndParent

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

    Windows 2000/XP: 要创建仅消息窗口,请将HWND_MESSAGE或句柄提供给现有的仅消息窗口。

  • hMenu

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

  • hInstance

  • Windows 95/98/Me: [in] 与窗口关联的模块的实例句柄。

    Windows NT/2000/XP: 该值被忽略。

  • lpParam

  • [in] 指向通过CREATESTRUCT结构传递给窗口的值,该结构在lParam参数中传递了WM_CREATE消息。 如果一个应用程序调用CreateWindow创建一个多文档界面(MDI)客户端窗口,lpParam必须指向CLIENTCREATESTRUCT结构。

返回值


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

如果函数失败,返回值为NULL。 要获取扩展错误信息,请调用GetLastError

此功能通常由于以下原因之一而失败:

  • 无效的参数值

  • 系统类由不同的模块注册

  • 安装了WH_CBT钩子并返回故障代码

  • WM_CREATE或WM_NCCREATE的窗口过程失败

备注


CreateWindowEx函数向正在创建的窗口发送WM_NCCREATE,WM_NCCALCSIZE和WM_CREATE消息。

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

有关控制任务栏是否显示已创建窗口按钮的信息,请参阅任务栏按钮的可见性。

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

含义
BUTTON指定一个小矩形子窗口,表示用户可以单击以打开或关闭按钮。 按钮控件可以单独使用或分组使用,它们可以被标记或不带文本显示。 当用户点击它们时,按钮控件通常会改变外观。 有关详细信息,请参阅按钮。

对于可以在dwStyle参数中指定的按钮样式表,请参阅按钮样式。

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

对于可以在dwStyle参数中指定的组合框样式的表,请参阅组合框样式。

EDIT指定一个矩形子窗口,用户可以从中键入键入的文本。 用户选择该控件,并通过点击或通过按Tab键向其移动键盘焦点。 当编辑控件显示闪烁的插入符时,用户可以键入文本; 使用鼠标移动光标,选择要替换的字符,或者放置光标插入字符; 或使用BACKSPACE键删除字符。 有关详细信息,请参阅编辑控件。

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

LISTBOX指定字符串列表。 只要应用程序必须呈现用户可以选择的名称(如文件名)列表,则指定此控件。 用户可以通过点击来选择一个字符串。 突出显示所选字符串,并将通知消息传递到父窗口。 有关详细信息,请参阅列表框。

对于可以在dwStyle参数中指定的列表框样式的表,请参阅列表框样式。

MDICLIENT指定MDI客户端窗口。 此窗口接收到控制MDI应用程序的子窗口的消息。 推荐的样式位为WS_CLIPCHILDREN和WS_CHILD。 指定WS_HSCROLL和WS_VSCROLL样式来创建MDI客户端窗口,允许用户将MDI子窗口滚动到视图中。 有关详细信息,请参阅多文档界面。
RichEdit指定Rich Edit 1.0版控件。 该窗口允许用户查看和编辑具有字符和段落格式的文本,并且可以包括嵌入式COM对象。 有关详细信息,请参阅Rich Edit控件。

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

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

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

SCROLLBAR指定一个包含滚动框并在两端都有方向箭头的矩形。 只要用户单击控件,滚动条就会向其父窗口发送通知消息。 如果需要,父窗口负责更新滚动框的位置。 有关更多信息,请参阅滚动条。

对于可以在dwStyle参数中指定的滚动条控件样式的表,请参阅滚动条控件样式。

STATIC指定用于标签,框或单独其他控件的简单文本字段,框或矩形。 静态控件不需要输入,也不提供输出。 有关详细信息,请参阅静态控件。

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


Windows 95/98/Me: 该系统最多可以支持16,364个窗口句柄。

Windows 2000/XP: dwExStyle的WS_EX_NOACTIVATE值防止系统前台激活。 为防止用户单击窗口时启动队列,必须正确处理WM_MOUSEACTIVATE消息。 要使窗口进入前台或以编程方式激活,请使用SetForegroundWindowSetActiveWindow。 将FALSE返回到WM_NCACTIVATE可防止窗口丢失队列激活。 但是,返回值在激活时被忽略。

Windows XP: 使用WS_EX_COMPOSITED集合,窗口的所有后代使用双缓冲获得底部对顶部的绘制顺序。 从底部到顶部的绘制顺序允许后代窗口具有半透明(alpha)和透明度(颜色键)效果,但只有后代窗口也具有WS_EX_TRANSPARENT位设置。 双重缓冲允许窗口及其后代无闪烁。

Windows 95/98/Me: CreateWindowExW由Microsoft Layer for Unicode支持。 要使用此功能,必须向应用程序添加某些文件,如Windows 95/98 / Me系统上的Microsoft Layer for Unicode所述。

示例代码


有关示例,请参阅创建主窗口。

要求

  Windows NT/2000/XP: 包含在Windows NT 3.1及更高版本中。

  Windows 95/98/Me: 包含在Windows 95及更高版本中。

  头文件: 声明于 Winuser.h; 包含于Windows.h。
  库: 使用 User32.lib。

  Unicode: 在Windows NT/2000/XP上实现为Unicode和ANSI版本。 还支持Microsoft Layer for Unicode。