【WinAPI详解】<CreateWindowEx详解>

函数原型:

HWND CreateWindowEx(
		DWORD		dwExStyle,	 //窗口的扩展风格(加强版专有)
		LPCTSTR 	lpClassName, //已经注册的窗口类名称
		LPCTSTR		lpWindowName,//窗口标题栏的名字
		DWORD		dwStyle,	 //窗口的基本风格
		int			x,			 //窗口左上角水平坐标位置
		int 		y,			 //窗口左上角垂直坐标位置
		int 		nWidth,		 //窗口的宽度
		int 		nHeight,	 //窗口的高度
		HWND		hWndParent,	 //窗口的父窗口句柄
		WMENU		hMenu,		 //窗口的菜单句柄
		HINSTANCE	hInstance,	 //应用程序实例句柄
		LPVOID		lpParam		 //窗口创建时附加参数
	);	//创建成功返回窗口句柄

目录

1.        DWORD        dwExStyle        //窗口的扩展风格(加强版专有)

2.        DWORD        dwStyle        //窗口的基本风格

3.        LPCTSTR        lpClassName        //已经注册的窗口类名称

4.        实例


参数解析:

参数

含义        

dwExStyle 指定创建窗口的扩展风格(详见下方↓)

lpClassName

1. 窗口类名称,可以是一个指向 NULL 结束的字符串或一个整型数值
2. 如果是字符串,它指定了窗口的类名。这个类名可以是任何用函数 RegisterClass 注册的类名,或是任何预定义的控制类名
3. 如是一个整型量,它是由此前调用 theGlobalAddAtom 函数产生的全局量。这个小于 0xC000 的 16 位数必须是 lpClassName 参数字的低 16 位,该参数的高位必须是 0

lpWindowName

1. 窗口标题,一个指向 NULL 结束的字符串指针
2. 如果窗口风格指定了标题条,由 lpWindowName 指向的窗口标题将显示在标题条上
3. 当使用 CreatewindowEx 函数来创建控制例如按钮,选择框和静态控制时,可使用 lpWindowName 来指定控制文本

dwStyle

指定创建窗口的风格(详见下方↓)

x

1. 指定窗口的初始水平位置(x 坐标)
2. 对一个层叠或弹出式窗口,x 参数是屏幕坐标系的窗口的左上角的初始 x 坐标
3. 对于子窗口,x 是子窗口左上角相对父窗口客户区左上角的初始 x 坐标
4. 如果该参数被设为 CW_USEDEFAULT 则系统为窗口选择缺省的左上角坐标并忽略 y 参数,CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则 x 和 y 参数被设为零。

y

1. 指定窗口的初始垂直位置(y 坐标)
2. 对一个层叠或弹出式窗口,y 参数是屏幕坐标系的窗口的左上角的初始 y 坐标
3. 对于子窗口,y 是子窗口左上角相对父窗口客户区左上角的初始 y 坐标
4. 对于列表框,y 是列表框客户区左上角相对父窗口客户区左上角的初始 y 坐标
5. 如果层叠窗口是使用 WS_VISIBLE 风格位创建的并且 x 参数被设为 CW_USEDEFAULT,则系统将忽略 y 参数

nWidth

1. 以设备单元指明窗口的宽度
2. 对于层叠窗口,nWidth 的值或是屏幕坐标的窗口宽度或是 CW_USEDEFAULT
3. 若 nWidth 是 CW_USEDEFAULT,则系统为窗口选择一个默认的高度和宽度(默认宽度为从初始 x 坐标开始到屏幕的右边界,缺省高度为从初始 y 坐标开始到目标区域的顶部。),CW_USEDEFAULT 只对层叠窗口有效,如果为弹出式窗口和子窗口设定 CW_USEDEFAULT 标志则 nWidth 和 nHeight 被设为零

nHeight

1. 以设备单元指明窗口的高度
2. 对于层叠窗口,nHeight 是屏幕坐标的窗口宽度
3. 若 nWidth 被设为 CW_USEDEFAULT,则系统忽略 nHeight 参数,自动为 nWidth 和 nHeight 设置默认参数

hWndParent

1. 指向被创建窗口的父窗口或所有者窗口的句柄
2. 若要创建一个子窗口或一个从属窗口,需提供一个有效的窗口句柄
3. 创建一个单纯的消息窗口,可以提供 HWND_MESSAGE 或提供一个己存在的消息窗口的句柄

hMenu

1. 指向窗口菜单句柄,或依据窗口风格指明一个子窗口标识
2. 对于层叠或弹出式窗口,hMenu 指定窗口使用的菜单:如果使用了菜单类,则 hMenu 可以为 NULL
3. 对于子窗口,hMenu 指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的

hInstance

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

lpParam

1. 指向一个值的指针,该值传递给窗口 WM_CREATE 消息。该值通过在 IParam 参数中的 CREATESTRUCT 结构传递
2. 如果应用程序调用 CreateWindow 创建一个 MDI 客户窗口,则 lpParam 必须指向一个 CLIENTCREATESTRUCT 结构


参数说明:

1.        DWORD        dwExStyle        //窗口的扩展风格(加强版专有)

指定扩展的窗口样式。为以下值中的一个或多个(devc++用“|”连接):

WS_EX_ACCEPTFILES 指定此样式创建一个窗口接受拖放文件。
WS_EX_APPWINDOW 当窗口可见时部队一个顶级窗口到任务栏上。
WS_EX_CLIENTEDGE 指定窗口具有三维外观 — — 就是一个边界与沉没的边缘。
WS_EX_CONTEXTHELP 在窗口的标题栏中包括一个问号。当用户单击问号,光标更改为一个问号指针。如果用户单击一个子窗口,孩子接受WM_HELP消息。
WS_EX_CONTROLPARENT 允许用户使用 TAB 键导航之间的子窗口的窗口。
WS_EX_DLGMODALFRAME 选定一个带有 (可选) 时,可能创建一个标题栏与你在dwStyle参数中指定WS_CAPTION风格标志的双边框的窗口。
WS_EX_LAYERED 创建分层的窗口。请注意这不能用于子窗口。此外,这不能使用如果窗口有 CS_OWNDC 或 CS_CLASSDC 的类样式
WS_EX_LAYOUTRTL 创建一个窗口,其水平的起源是右边缘。增加水平值预先向左。
WS_EX_LEFT 给窗口一般左对齐属性。这是默认值。
WS_EX_LEFTSCROLLBAR 客户区的左侧放置垂直滚动条。
WS_EX_LTRREADING 显示窗口文本使用从左到右阅读顺序属性。这是默认值。
WS_EX_MDICHILD 创建 MDI 子窗口。
WS_EX_NOPARENTNOTIFY 指定用这种方式创建的子窗口将不发送WM_PARENTNOTIFY消息给它的父窗口创建或销毁子窗口时。
WS_EX_OVERLAPPEDWINDOW 结合WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的样式
WS_EX_PALETTEWINDOW 结合WS_EX_WINDOWEDGE和WS_EX_TOPMOST的样式。
WS_EX_RIGHT 给一个窗口右对齐的通用属性。这取决于该窗口类。
WS_EX_RIGHTSCROLLBAR 右侧的客户区地方垂直滚动条 (如果存在)。这是默认值。
WS_EX_RTLREADING 显示窗口文本使用右到左的阅读顺序属性。
WS_EX_STATICEDG E创建具有三维边框样式可用于不接受用户输入的项目窗口。
WS_EX_TOOLWINDOW 创建一个工具窗口,它是可用于作为一个浮动的工具栏窗口。一个工具窗口具有短于正常的标题栏,标题栏和使用较小字体绘制的窗口标题。
工具窗口不会出现在任务条形图或当用户按下 ALT + TAB 时出现的窗口中。
WS_EX_TOPMOST 指定此样式创建一个窗口应放置高于所有顶层窗口和窗口被停用时,即使它们上面留。
应用程序可以使用SetWindowPos成员函数来添加或删除该属性。
WS_EX_TRANSPARENT 指定此样式创建一个窗口将是透明的。就是任何窗口,在窗口下方的窗口不被遮盖。用此样式创建一个窗口收到WM_PAINT消息已经更新,
在它下面的所有同级窗口后才。
WS_EX_WINDOWEDGE 指定窗口已具有凸起的边缘的边框。

2.        DWORD        dwStyle        //窗口的基本风格

指定窗口样式。其值为以下值中的一个或多个(devc++用“|”连接):

WS_BORDER 创建一个有边框的窗口。
WS_CAPTION 创建一个具有标题栏 (意味着WS_BORDER样式) 的窗口。不能用的WS_DLGFRAME样式。
WS_CHILD 创建一个子窗口。不能用的WS_POPUP样式。
WS_CHILDWINDOW 与WS_CHILD样式相同。
WS_CLIPCHILDREN 不包括在父窗口内绘制时子窗口所占用的区域。当您创建父窗口时使用。
WS_CLIPSIBLINGS 剪辑子窗口彼此;也就是说,当一个特定的子窗口接收绘制消息, WS_CLIPSIBLINGS风格剪辑子窗口要更新的区域外的所有其他重叠的子窗口。
(如果没有给WS_CLIPSIBLINGS和子窗口重叠内子窗口的客户区, 绘制时,它是可能内相邻的子窗口的客户区的绘制。与WS_CHILD样式只一起使用。
WS_DISABLED 创建一个窗口是最初被禁用。
WS_DLGFRAME 创建一个窗口,但是没有头衔的双边框。
WS_GROUP 指定一组控件,用户可以从一个控件移向下的箭头键的第一个控件。用虚假的WS_GROUP样式后的第一个控件定义的所有控件都属于同一个组。
WS_GROUP样式的下一控件启动下一个组 (就是下一步的开始位置的一组结束)。
WS_HSCROLL 创建一个具有水平滚动条的窗口。
WS_ICONIC 创建一个最初最小化的窗口。WS_MINIMIZE样式相同。
WS_MAXIMIZE 创建一个窗口的最大大小。
WS_MAXIMIZEBOX 创建一个窗口有最大化按钮。
WS_MINIMIZE 创建一个最初最小化的窗口。与仅WS_OVERLAPPED样式一起使用。
WS_MINIMIZEBOX 创建一个具有最小化按钮的窗口。
WS_OVERLAPPED 创建重叠的窗口。重叠的窗口通常具有标题和边框。
WS_OVERLAPPEDWINDOW 与WS_OVERLAPPED、 WS_CAPTION、 WS_SYSMENU、 WS_THICKFRAME、 WS_MINIMIZEBOX和WS_MAXIMIZEBOX样式创建重叠的窗口。
WS_POPUP 创建一个弹出窗口。不能使用具有WS_CHILD样式。
WS_POPUPWINDOW 用WS_BORDER, WS_POPUP和WS_SYSMENU的样式创建一个弹出窗口。WS_CAPTION样式必须结合WS_POPUPWINDOW样式,以使控制菜单上可见。
WS_SIZEBOX 创建一个具有大小调整边框的窗口。WS_THICKFRAME样式相同。
WS_SYSMENU 创建一个窗口,都有一个控制菜单框在其标题栏中。仅用于带有标题栏的窗口。
WS_TABSTOP 指定任意数量的控件,通过它用户可以通过使用 TAB 键移动之一。TAB 键移动用户到指定WS_TABSTOP风格的下一个控件。
WS_THICKFRAME 创建一个窗口,用厚厚的框架,可以用来调整窗口的大小。
WS_TILED 创建重叠的窗口。重叠的窗口有标题栏和边框。WS_OVERLAPPED样式相同。
WS_TILEDWINDOW  用 WS_OVERLAPPED、 WS_CAPTION、 WS_SYSMENU、 WS_THICKFRAME、 WS_MINIMIZEBOX 和 WS_MAXIMIZEBOX 的样式创建重叠的窗口。
与WS_OVERLAPPEDWINDOW 样式相同。
WS_VISIBLE 创建的窗体可见
WS_VSCROLL 

创建一个具有垂直滚动条的窗口.

3.        LPCTSTR        lpClassName        //已经注册的窗口类名称

指定类名。是一个指针,指向以null结尾的串。

可以是任意串,也可以是用RegisterClass或RegisterClassEx注册的类名,也可以是系统类名。(Dev-C++用双引号)

系统类名 说明
Button 按钮
ComboBox 组合框
Edit 编辑框
ListBox 列表框
MDIClient MDI客户端窗口
ScrollBar 滚动条
Static 静态控件类
ComboLBox 组合框列表
DDEMLEvent 动态数据交换管理库(DDEML)事件
Message 只有消息的窗口
#32768 菜单
#32769 桌面窗口
#32770 对话框
#32771 任务切换窗口
#32772 图标标题
使用时需包含:#include 头文件        
类名 说明(Dev-C++引用时不用双引号,直接按常量引用)

ANIMATE_CLASS

创建动画控件。 这些控件以无提示方式显示音频视频交错 (AVI) 剪辑。

DATETIMEPICK_CLASS

创建日期和时间选取器控件。 这些控件提供一个简单的界面,用于与用户交换日期和时间信息。

HOTKEY_CLASS

创建热键控件。 通过这些控件,用户可以轻松定义热键。

LINK_CLASS

创建 syslink 控件。 这些控件与链接一起使用。

MONTHCAL_CLASS

创建月历控件。 这些控件为用户从熟悉的界面中选择日期提供了一种简单方法。

NATIVEFNTCTL_CLASS

创建本机字体控件。 这些控件与本机字体一起使用。

PROGRESS_CLASS

创建进度栏。 这些控件指示长时间操作的进度。

REBARCLASSNAME

创建 rebar 控件。 这些控件充当子窗口的容器。

STANDARD_CLASSES

创建内部 User32 控件,例如按钮、编辑和滚动条。

STATUSCLASSNAME

创建状态窗口。 这些控件在水平窗口中显示状态信息。

TOOLBARCLASSNAME

创建工具栏。 这些控件包含执行菜单命令的按钮。

TOOLTIPS_CLASS

创建工具提示控件。 这些控件显示一个小弹出窗口,其中包含描述应用程序中工具用途的文本行。

TRACKBAR_CLASS

创建跟踪条。 这些控件允许用户通过移动滑块从一系列值中进行选择。

UPDOWN_CLASS

创建向上控件。 这些控件将箭头配对与编辑控件组合在一起。 单击箭头递增或递减编辑控件中的值。

WC_BUTTON

创建按钮控件。 这些控件使用户能够启动操作。

WC_COMBOBOX

创建组合框控件。 这些控件包含一个下拉列表,可从中选择单个项。

WC_COMBOBOXEX

创建 ComboBoxEx 控件。 这些控件提供组合框控件的扩展,该控件提供对项图像的本机支持。

WC_EDIT

创建编辑控件。 这些控件包含可编辑的文本。

WC_HEADER

创建标头控件。 这些控件显示信息列顶部的标题,让用户通过单击标题对信息进行排序。

WC_LISTBOX

创建 listbox 控件。 这些控件包含项列表。

WC_IPADDRESS

创建 IP 地址控件。 这些控件类似于编辑控件,但它们允许你以 Internet 协议 (IP) 格式输入数字地址。

WC_LINK

创建 SysLink 控件。 这些控件包含超文本链接。

WC_LISTVIEW

创建列表视图控件。 这些控件显示项目集合,每个项由图标和标签组成,并提供多种排列项的方法。

WC_NATIVEFONTCTL

创建本机字体控件。 这些是后台工作的不可见控件,使对话框的预定义控件能够显示当前系统语言。

WC_PAGESCROLLER

创建寻呼控件。 这些控件用于包含和滚动另一个窗口。

WC_SCROLLBAR

创建滚动条控件。 这些控件使用户能够滚动窗口的内容。

WC_STATIC

创建静态控件。 这些控件包含不可编辑的文本。

WC_TABCONTROL

创建选项卡控件。 这些控件为窗口或对话框的同一区域定义多个页面。 每个页面由一组信息或应用程序在用户选择相应选项卡时显示的一组控件组成。

WC_TREEVIEW

创建树视图控件。 这些控件显示项的分层列表。 每个项都包含一个标签和一个可选的位图。

4.        实例

[Dev-C++]创建一个只有关闭按钮,不在任务栏显示,不能改变大小,保持在上的右下角的窗口

#include 

/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		/* Upon destruction, tell the main thread to stop */
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		/* All other messages (a lot of them) are processed using default procedures */
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam); 
	}
	return 0;
}

/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc; /* A properties struct of our window */
	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
	MSG msg; /* A temporary location for all messages */

	/* zero out the struct and set the stuff we want to modify */
	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc; /* This is where we will send messages to */
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	
	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
	
	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}	
	int no_menu_bar_width = GetSystemMetrics(SM_CXFULLSCREEN);
	int no_menu_bar_height = GetSystemMetrics(SM_CYFULLSCREEN);
	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE|WS_EX_TOOLWINDOW|WS_EX_TOPMOST,"WindowClass","HBoss",WS_VISIBLE|WS_CAPTION|WS_SYSMENU,
		no_menu_bar_width-240, /* x */
		no_menu_bar_height-120, /* y */
		240, /* width */
		120, /* height */
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);//
		return 0;
	}

	/*
		This is the heart of our program where all input is processed and 
		sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
		this loop will not produce unreasonably high CPU usage
	*/
	while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
		TranslateMessage(&msg); /* Translate key codes to chars if present */
		DispatchMessage(&msg); /* Send it to WndProc */
	}
	return msg.wParam;
}

你可能感兴趣的:(编程相关,#,WinAPI详解,开发语言,c++,windows)