1、CreateWindow函数
CreateWindow函数创建一个重叠的,置顶的或者子窗口,它指定了窗口类别,窗口标题,窗口风格,也可以指定窗口的初始化位置和大小,也可以指定窗口的父窗口或所有者窗口,和窗口的菜单。
如果要使用CreateWindow支持的窗口风格以外的扩展窗口风格,要使用CreateWindowEx函数。
HWND CreateWindow(
LPCTSTR lpClassName,//注册的窗口类别名称
LPCTSTR lpWindowName,//窗口名称
DWORD dwStyle,//窗口风格
int x,//窗口的水平位置
int y,//窗口的垂直位置
int nWidth,//窗口的宽度
int nHeight,//窗口的高度
HWND hWndParent,//父窗口或主窗口句柄
HMENU hMenu,//菜单句柄或子窗口标识
HINSTANCE hInstance,//应用程序实例句柄
LPVOID lpParam//窗口建立参数
);
来自百度百科:
lpClassName
指向一个空结束的字符串或整型数atom。如果该参数是一个 整型量,它是由此前调用theGlobalAddAtom 函数产生的全局量。这个小于0xC000的16位数必须是lpClassName参数字的低16位,该参数的高位必须是0。
如果lpClassName是一个字符串,它指定了窗口的类名。这个类名可以是任何用函数RegisterClass注册的类名,或是任何预定义的控制类名。请看说明部分的列表。
LPWindowName
指向一个指定窗口名的空结束的字符串 指针。
如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用lpWindowName来指定控制文本。
dwStyle
指定创建窗口的风格。该参数可以是下列窗口风格的组合再加上说明部分的控制风格。风格 意义:
WS_BORDER:创建一个带边框的窗口。
WS_CAPTION:创建一个有标题框的窗口(包括WS_BODER风格)。
WS_CHILD:创建一个子窗口。这个风格不能与WS_POPUP风格合用。
WS_CHILDWINDOW:与WS_CHILD 相同。
WS_CLIPCHILDREN:当在父窗口内绘图时,排除子窗口区域。在创建父窗口时使用这个风格。
WS_CLIPSIBLINGS:排除子窗口之间的相对区域,也就是,当一个特定的窗口接收到 WM_PAINT消息时,WS_CLIPSIBLINGS 风格将所有层叠窗口排除在绘图之外,只重绘指定的子窗口。如果未指定WS_CLIPSIBLINGS风格,并且子窗口是层叠的,则在重绘子窗口的客户区时,就会重绘邻近的子窗口。
WS_DISABLED:创建一个初始状态为禁止的子窗口。一个禁止状态的窗口不能接受来自用户的输入信息。
WS_DLGFRAME:创建一个带对话框边框风格的窗口。这种风格的窗口不能带标题条。
WS_GROUP:指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带有WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。
WS_HSCROLL:创建一个有水平滚动条的窗口。
WS_ICONIC:创建一个初始状态为最小化状态的窗口。与WS_MINIMIZE风格相同。
WS_MAXIMIZE:创建一个初始状态为最大化状态的窗口。
WS_MAXIMIZEBOX:创建一个具有最大化按钮的窗口。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。
WS_OVERLAPPED:产生一个层叠的窗口。一个层叠的窗口有一个标题条和一个边框。与WS_TILED风格相同。
WS_OVERLAPPEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX风格的层叠窗口,与WS_TILEDWINDOW风格相同。
WS_POPUP:创建一个弹出式窗口。该风格不能与WS_CHILD风格同时使用。
WS_POPUPWINDOW:创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗口,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗口某单可见。
WS_SIZEBOX:创建一个可调边框的窗口,与WS_THICKFRAME风格相同。
WS_SYSMENU:创建一个在标题条上带有 窗口菜单的窗口,必须同时设定WS_CAPTION风格。
WS_TABSTOP:创建一个控制,这个控制在用户按下Tab键时可以获得键盘焦点。按下Tab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。
WS_THICKFRAME:创建一个具有可调边框的窗口,与WS_SIZEBOX风格相同。
WS_TILED:产生一个层叠的窗口。一个层叠的窗口有一个标题和一个边框。与WS_OVERLAPPED风格相同。
WS_TILEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的层叠窗口。与WS_OVERLAPPEDWINDOW风格相同。
WS_VISIBLE:创建一个初始状态为可见的窗口。
WS_VSCROLL:创建一个有垂直滚动条的窗口。
X
指定窗口的初始水平位置。对一个层叠或弹出式窗口,X参数是 屏幕坐标系的窗口的左上角的初始X坐标。对于子窗口,x是子窗口左上角相对父窗口客户区左上角的初始X坐标。如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗口有效,如果为弹出式窗口或子窗口设定,则X和y参数被设为零。
Y
指定窗口的初始垂直位置。对一个层叠或弹出式窗口,y参数是 屏幕坐标系的窗口的左上角的初始y坐标。对于子窗口,y是子窗口左上角相对父窗口客户区左上角的初始y坐标。对于列表框,y是列表框客户区左上角相对父窗口客户区左上角的初始y坐标。如果层叠窗口是使用WS_VISIBLE风格位创建的并且X参数被设为CW_USEDEFAULT,则系统将忽略y参数。
nWidth
以设备单元指明窗口的宽度。对于层叠窗口,nWidth或是 屏幕坐标的窗口宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗口选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到 屏幕的右边界,缺省高度为从初始X坐标开始到目标区域的顶部。CW_USEDEFAULT只对层叠窗口有效;如果为弹出式窗口和子窗口设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。
nHeight
以设备单元指明窗口的高度。对于层叠窗口,nHeight是 屏幕坐标的窗口宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。
hWndParent
指向被创建窗口的父窗口或所有者窗口的 句柄。若要创建一个子窗口或一个被属窗口,需提供一个有效的 窗口句柄。这个参数对弹出式窗口是可选的。Windows NT 5.0;创建一个消息窗口,可以提供HWND_MESSAGE或提供一个己存在的消息窗口的 句柄。
hMenu
菜单 句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的 菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个 整型量),一个对话框使用这个整型值将事件通知父类。 应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。
hlnstance
与窗口相关联的模块实例的 句柄。
lpParam
指向一个值的 指针,该值传递给窗口 WM_CREATE消息。该值通过在IParam参数中的 CREATESTRUCT结构传递。如果 应用程序调用CreateWindow创建一个MDI客户窗口,则lpParam必须指向一个CLIENTCREATESTRUCT结构。
返回值:如果函数成功,返回值为新窗口的 句柄:如果函数失败,返回值为NULL。若想获得更多 错误信息,请调用GetLastError函数。
备注
在返回前,CreateWindow给窗口过程发送一个WM_CREATE消息。对于层叠,弹出式和子窗口,CreateWindow给窗口发送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。消息WM_CREATE的IParam参数包含一个指向 CREATESTRUCT结构的指针。如果指定了WS_VISIBLE风格,CreateWindow向窗口发送所有需要激活和显示窗口的消息。
3其它参数
获取有关任务条是否为创建的窗口显示一个按钮的控制信息,参看Taskbar按钮的Visbility。
以下预定义的 控制类可以在lpClassName参数中指定。注意在dwStyle参数中可以使用的相应的控制风格。
BUTTON按钮
按钮是一个小矩形子窗口,用户可以点击来打开或关闭。按钮控制可以单独使用或包含在组中使用,可以为控制写标签或不写标签。当用户点击按钮控制时按钮的外观有明显的改变。请参看Button。查看dwStyle参数中指定的按钮风格表请参考Button Style。
COMBOBOX 组合框由一个列表框和一个类似于编辑控制的选择域组成。在使用这个风格控制时, 应用程序或者使列表框一直显示或者是作成一个下拉列表。如果列表框可见,则在编辑域中输入 字符将使列表框中与字符一致的第一个域高亮。反之,在列表框中选择的项将显示在编辑域中。请参看Combo Boxes。
dwStyle参数
中指定的 组合框风格表请参考Combo Boxes Style。
EDIT编辑框一个小的矩形子窗口用户可以使用键盘向其中 输入文本。用户可以通过点击或按Tab键来选中编辑框控制并且使控制获得焦点。当编辑框中显示一个闪烁的插入记号时,用户可以 输入文本。使用鼠标移动 光标,选择被替换的 字符或设置插入字符的位置或使用回退键删除字符。请参看Edit。controls。
查看dwStyle参数中指定的编辑框风格的表格请参考Edit Control Style。
LISTBOX列表框字符串的列表。当 应用程序必须显示名称的列表,例如文件名列表等,使用户可以从中选择时就可指定列表框。用户可以通过单击来选择名称。选择时,被选择名高亮,同时传递给父窗口一个通知消息。请参看LiSt Box Style。查看dwStyle参数中指定的列表风格表请参考List BOX Control Style。
MDI客户窗口
窗口接收控制MDI 应用程序子窗口的消息。建议使用两种控制风格位:WS_CLIPCHILDREN和WS_CHILD。指定了WS_HSCROLL和WS_VSCROLL风格的MDI客户窗口允许用户将MDI子窗口滑动进入视窗。请参看MDI。
RiChEdit设计一个Rich Editl.0版的控制,该控制使用户可以以 字符和段落格式测览和编辑文本;RICHEDIT CLASS设计一个Rich Edik2.0版的控制,该控制使用户可以以字符和 段落格式测览和编辑文本,两者的共同点是都可以包含嵌入的COM对象。请参看Rich Edit Controls,查看dwStyle参数中指定的RichEdit风格表请参考LiSt Box Control Style和RichEditControIStyle。
SCROLLBAR 滚动条设计的一个包含着一个滚动盒和两端有方向箭头的矩形。只要用户点击了控制,滚动条就给父窗口发送一个通知消息。如有必要,父窗口负责更新滚动条的位置。请参看ScrollBars。查看dwStyle参数中指定的滚动条风格表请参考Scroll Bars Style。
静态文本域
文本盒或矩形用于给控制加标签,组合控制或将控制与其他控制分开。
静态控制不提供输入和也不提供输出。请参看Static Control Styles。查看dwStyle参数中指定的静态文本风格表请参考Scroll Bars Style。
Windows95:系统可以支持最大16,364个 窗口句柄。
备注:如果在链接 应用程序时指明是Windows 4.x版本,除非应用程序的窗口有窗口某单,否则窗口控制没有标题控制。对Windows3.x版本没有这种要求。
Windows CE
CreateWindow是以“宏”方式完成的。它被定义为CreateWindowEX,并且dwExStyle参数被置为长整数0。不支持菜单条控制,除非被声明为子窗口标志否则hMenu参数必须为NULL。不支持MDICLIENT 窗口类。dwStyle参数可以是对话框(Dialogue Box),窗口(Windows),控制(Controls)文件中的窗口风格和控制风格的组合。
4其他信息
下列dwStyle标志在窗口中不支持
WS_CHILDWINDOW WS_ICONC;WS_MAXMIZE WS_MAXIMIZEBOX;WS_MINIMIZE WS_MINIMIZEBOX;
WS_OVERLAPPEDWINDOW WS_POPUPWINDOW;WS_SIZEBOXWS_THICKFRAME WS_TILED WS_TILEDWINDOW
下列dwStyle标志在控制和对话框中不支持:
不支持的按钮风格和静态控制风格
BS_LEFTTEXT SS_BLACKFRAME;BS_MULTILINE SS_GRAYFRAME BS_TEXT SS_METAPICT;BS_USERBUTTON SS_SIMPLE
不支持 组合框SS_WHITERECT风格。
CBS_OWNERDRAWFIXED SS_BLACKRECT;CBS_OWNWEDRAWVARIABLE SS_GRAYRECT; CBS_SIMPLE8R旧HTrIMAGE
不支持列表框控制SS_WHITEFRAME风格。
LBS_NODATA
不支持的对话框风格
LBS_OWNERDRAWFIXED DS_ABSALIGN; LBS_OWNERDRAWVARIABLE DS_CENTERMOUSE; LBS_STANDARD DS_CONTEXTHELP
不支持滚动条的 DS_FIXEDSYS风格
SBS_BOTTOMALIGN DS_NOFAILCREATE;SBS_RIGHTALIGN DS_NOIDLEMSG;
SBS_SlZEBOXBOTT0MRIHTALIGN DS_SYSMODAL;SBS_SIZEGRIP
可使用BS_OWNERDRAW风格来代替BS_USERBUTTON风格。
可使用SS_LEFT或SS_LEFTNOWORDWRAP风格来代替静态控制的SS_SIMPLE风格。
不支持MDICLIENT窗口类
所有窗口都隐含WS_CLIPSIBLINGS和 WS_CLIPCHILDREN风格。
Windows CE1.0版除对话框外不支持被属窗口。如果hwndParent参数不为NULL,则窗口隐含给出WS_CHILD风格。Windows CE1.0不支持菜单条。
(推荐)速查: Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;头文件:winuser.h;库文件:user32.lib; Unicode:在Windows NT上实现为Unicode和ANSI两种版本。
2、显示窗口ShowWindow
ShowWindow(hwnd, iCmdShow);
第一个参数是:CreateWindow返回的窗口句柄,第二个参数是:作为参数传递给WinMain的iCmdShow,它确定最初如何在屏幕上显示窗口,是一般大小(SW_SHOWNORMAL)、最大化(SW_SHOWMAXIMIZED)还是最小化(SW_SHOWMINNOACTIVE)。
3、更新窗口 UpdataWindow
UpDataWindow(hwnd);
4、消息汞
在UndataWindow之后,窗口就显示在屏幕上,程序现在必须准备读入使用者从键盘或鼠标输入的信息。Windows系统为当前的每个windows应用程序维护一个消息队列,在发生输入事件之后,Windows将事件转化为一个“消息”,并将消息放入程序的消息队列中。应用程序通过执行一段称为“消息汞”的代码,将消息从消息队列中取出。
消息汞的代码如下:
while(GetMessage(&msg, NULL,0,0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
MSG结构如下:
typedef struct tagMSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
消息循环从GetMessage的调用开始,它从消息队列中取出一个消息,Windows用从消息队列中取出的下一个消息来填充“msg”变量中的各个参数,包括下列参数:
hwnd :接收消息的窗口句柄;
message:消息标识(一个数值)
wParam,lParam :消息的两个参数,具体含义与具体消息有关;
time:消息放入消息队列中的时间;
pt:消息放入消息队列时的鼠标位置坐标。
注意: 只要从消息队列中取出的消息的message参数不是“WM_QUIT(0x0012)”,GetMessage就返回一个非零值。WM_QUIT消息将导致GetMessage返回0;
TranslateMessage();将msg结构传给Windows,进行一些键盘转换;
DispatchMessage();将msg结构又传给Windows,然后Windows将消息发送给适当的窗口过程,让它进行处理(windows调用窗口过程),
注意:在窗口过程回调函数处理完消息后,就返回到Windows系统中,此时Windows还停留在DispatchMessage系统函数调用中,然后Windows在结束DispatchMessage的调用处理之后,Windows回到应用程序的主程序,并且接着从下一个GetMessage调用开始消息循环。
5、窗口过程
应用程序的实际动作发生在窗口过程中,窗口过程确定了在窗口的显示区域中显示什么内容以及窗口怎样回应使用者输入。
一个窗口过程总是与调用Register或ResgisterEx函数注册的特定窗口类别相关联。
窗口过程的定义形式:
LRESULR CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
注意:窗口过程的四个参数与MSG结构的前四个参数是相同的。
参数:
hwnd:接收消息的窗口句柄,与CreateWindow的返回值相同。如果程序存在同一窗口类别建立多个窗口,那么hwnd标识的是接收消息的特定窗口。
message:标识消息,wParam,lParam :消息的两个参数。
特别注意:应用程序通常不直接呼叫窗口过程,窗口过程由windows本身调用,但是通过调用SendMessage函数,应用程序可以直接调用自己的窗口过程。