【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_STATICEDGE创建具有三维边框样式可用于不接受用户输入的项目窗口。
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列表框
MDIClientMDI客户端窗口
ScrollBar滚动条
Static静态控件类
ComboLBox组合框列表
DDEMLEvent动态数据交换管理库(DDEML)事件
Message只有消息的窗口
#32768菜单
#32769桌面窗口
#32770对话框
#32771任务切换窗口
#32772图标标题
使用时需包含:#include <CommCtrl.h> 头文件        
类名说明(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 <windows.h>

/* 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;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C 串口通信编程是指在 C 语言中通过串口与外设进行通信的编程技术。串口通信是一种常用的数据传输方式,适用于各种嵌入式设备和外设之间的数据交互。 首先,要进行串口通信编程,需要先设置串口相关的参数,包括波特率、数据位、校验位和停止位等。这些参数可以通过相应的寄存器进行设置。然后,需要打开串口,使其处于可用状态。 在发送数据时,可以通过对应的寄存器将数据写入发送缓冲区,待数据发送完成后,可以进行下一步的操作。在接收数据时,可以通过查询接收缓冲区的状态,判断是否有数据到达,并从接收缓冲区中读取数据进行处理。 为了简化串口通信编程的操作,可以使用相关的库函数和函数库,比如在 Windows 系统下可以使用 WinAPI 中提供的函数进行串口通信编程,而在 Linux 系统下可以使用 termios 库进行串口通信编程。这些函数库提供了一系列的函数,可以方便地实现串口的配置、数据的发送与接收等操作。 例如,在 C 语言中使用 WinAPI 进行串口通信编程时,可以使用 CreateFile 函数打开串口设备,使用 SetCommState 函数设置串口参数,使用 WriteFile 函数向串口发送数据,使用 ReadFile 函数从串口接收数据。通过这些函数的组合调用,可以实现串口通信功能。 总结起来,C 串口通信编程是一种通过设置串口参数、发送和接收数据的程序设计技术。它需要了解串口相关的硬件知识和相关函数库,将其应用于实际的嵌入式设备和外设之间的数据交互中。通过合理地选择函数库和编写相应的代码,可以实现稳定、高效的串口通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值