首页 > 代码库 > 使用WIN32汇编语言实现一个基本windows窗体的过程分析
使用WIN32汇编语言实现一个基本windows窗体的过程分析
一个常规的windows窗体一般都是一些一样的构造。你假设想要更改一些个性化的设置,你能够在这个一般的模板伤添砖加瓦。构造自己比較喜欢的类型。下边就分析一下一般的windows窗体的一般模板。
一. 首先看一下一般的windows窗体都包括什么框架(NO picture you say a J8.....上图上图)例如以下(罗云斌win32汇编书中92页的一张图):
该图简单的描写叙述了一个主要的窗体的框架。
下图是我们分析的第一个窗体的执行演示样例截图:
这个窗体较为简单。可是包括了窗体的基本特性。以下開始分析这个简单的模板窗体。
二 . 以下開始分析该窗体的简单实现过程:
1. 首先写出须要使用的头文件也就是include文件的定义,他们都是一WINDOWS的必需品,里面包括了很多现成的API函数。以及一些连接库文件。详细代码例如以下:
.386 .model flat,stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include gdi32.inc includelib gdi32.lib include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib
2.
以下就是数据段的内容包括一些未初始化的全局变量和一些常量:
数据段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data? hInstance dd ? hWinMain dd ? .const szClassName db'MyClass',0 szCaptionMain db'My first Window !',0 szText db 'Win32 Assembly, Simple and powerful !',0
3. 在屏幕上显示一个窗体的步骤例如以下几步:
以下就是代码段了:
(1)得到应用程序的句柄(GetModuleHandle)。
(2)注冊窗体类(RegisterClassEx).在注冊之前,要先填写RegisterClassex的參数WNDCLASSEX结构。
(3)建立窗体(CreateWindowEx)。
(4)显示窗体(ShowWindow)。
(5)刷新窗体客户区(UpdateWindow)。
(6)进入无限的消息获取和处理的循环。首先获取消息(GetMessage),假设有消息到达,则将消息分派到回调函数处理(DispatchMessage),假设消息是WM_QUIT。则退出循环。
在程序開始另一个子函数_ProWinMain是用来处理消息的,他就是窗体的回调函数(Callback),它是由windows调用的而不是我们自己,我们调用了DispatchMessage。然后DisPatchMessage再回过来调用我们自己的子函数_ProcWinMain。子函数内有我们自定义好的相应消息的相应操作,假设没有指定的操作。则使用windows默认的状态实现此功能调用函数(DefWindowProc)
4.最后是在程序的入口处调用主函数_WinMain,程序结束(ExitProcess).
5. 最后总结一下该程序用到的一些数据结构类型和API函数的信息:
(1) 数据结构:PAINTSTRUCT(结构体)该结构体包括了某应用程序用来绘制它所拥有的窗体的客户区所须要的信息。
PAINTSTRUCT定义 typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT; PAINTSTRUCT 结构体包括了用于绘制窗体客户区的信息。比如要更新的客户区的矩形区域的大小等等。MFC里的CPaintDC与之相应; BeginPaint能够得到客户区设备描写叙述表的句柄,GetDC也能够得到,MFC里的CClientDC与之相应。
hdc是用于绘制的句柄, fErase假设为非零值则擦除背景。否则不擦除背景。 rcPaint 通过制定左上角和右下角的坐标确定一个要绘制的矩形范围,该矩形单位相对于客户区左上角, 后面三个參数都是系统预留的,编程一般用不到。 rect(结构体): rect结构定义了一个矩形框左上角以及右下角的坐标。RECT结构通经常使用于Windows编程。
typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT; 折叠成员 left : 指定矩形框左上角的x坐标 top: 指定矩形框左上角的y坐标 right: 指定矩形框右下角的x坐标 bottom:指定矩形框右下角的y坐标 备注: 当rect传递给fillrect函数时,该矩形框将被填充满,但不包括右栏和底行的像素。 该结构与rectl结构是同一结构。 WNDCLASSEX(注冊窗体类) WNDCLASSEX 结构用于注冊窗体类 注冊实例: ATOM MyRegisterClass( HINSTANCE hInstance ) { WNDCLASSEX wcex; wcex.cbSize = sizeof( WNDCLASSEX ); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC) WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wcex.hCursor = LoadCursor( NULL, IDC_ARROW ); wcex.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH ); wcex.lpszMenuName = NULL; wcex.lpszClassName = "My Class"; wcex.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); return RegisterClassEx( &wcex ); } 折叠參数 cbSize: WNDCLASSEX 的大小。我们能够用sizeof(WNDCLASSEX)来获得准确的值。
style: 从这个窗体类派生的窗体具有的风格。您能够用“or”操作符来把几个风格或到一起。 lpfnWndProc: 窗体处理函数的指针。 cbClsExtra: 指定紧跟在窗体类结构后的附加字节数。 cbWndExtra: 指定紧跟在窗体事例后的附加字节数。假设一个应用程序在资源中用CLASS伪指令注冊一个对话框类时。则必须把这个成员设成DLGWINDOWEXTRA。 hInstance: 本模块的事例句柄。
hIcon: 图标的句柄。 hCursor: 光标的句柄。 hbrBackground: 背景画刷的句柄。 lpszMenuName: 指向菜单的指针。 lpszClassName: 指向类名称的指针。
hIconSm: 和窗体类关联的小图标。假设该值为NULL。则把hIcon中的图标转换成大小合适的小图标。 WNDCLASSEX 中最重要的成员莫过于lpfnWndProc了。
n 表示该前缀 lpf成员是一个指向函数的长指针。
在 Win32中因为内存模式是 FLAT 型,所以没有 near 或 far 的差别。每一个窗体类必须有一个窗体过程,当 Windows 把属于特定窗体的消息发送给该窗体时。该窗体的窗体类负责处理全部的消息,如键盘消息或鼠标消息。
因为窗体过程差点儿相同智能地处理了全部的窗体消息循环。所以您仅仅要在当中添加消息处理过程就可以。
(2)API函数 MessageBox() 功能: 显示一个模态对话框,当中包括一个系统图标、 一组button和一个简短的特定于应用程序消息,如状态或错误的信息。
消息框中返回一个整数值。该值指示用户单击了哪个button。
原型: MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word) 參数: hWnd: 消息框的拥有窗此參数口。假设为NULL,则消息框没有拥有窗体。 lpText: 消息框的内容。假设使用了Unicode库,则把文本变成: lpCaption: 消息框的标题。假设使用了Unicode库,则把文本变成: uType: 指定一个决定对话框的内容和行为的位标志集。此參数能够为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的button以及图标。 折叠uType參数 button: button參数 含义 MB_OK 默认值。有一个确认button在里面。
MB_YESNO 有是和否在里面。
MB_ABORTRETRYIGNORE 有Abort(放弃),Retry(重试)和Ignore(跳过) MB_YESNOCANCEL 消息框含有三个button:Yes。No和Cancel MB_RETRYCANCEL 有Retry(重试)和Cancel(取消) MB_OKCANCEL 消息框含有两个button:OK和Cancel 附: 图标: 參数 含义 MB_ICONEXCLAMATION 一个惊叹号出如今消息框 MB_ICONWARNING 一个惊叹号出如今消息框 MB_ICONINFORMATION 一个圆圈中小写字母i组成的图标出如今消息框 MB_ICONASTERISK 一个圆圈中小写字母i组成的图标出如今消息框 MB_ICONQUESTION 一个问题标记图标出如今消息框 MB_ICONSTOP 一个停止消息图标出如今消息框 MB_ICONERROR 一个停止消息图标出如今消息框 MB_ICONHAND 一个停止消息图标出如今消息框 形态: 參数 含义 MB_APPLMODAL 在hwnd參数标识的窗体中继续工作曾经,用户一定响应消息框。
可是。用户能够移动到其它线程的窗体且在这些窗体中工作。根据应用程序中窗体的层次机构。用户则以移动到线程内的其它窗体。全部母消息框的子窗体自己主动地失效。可是弹出窗体不是这样。假设既没有指定MB_SYSTEMMODAL也没有指定MB_TASKMOOAL。则MB_APPLMODAL为缺省的。 MB_SYSTEMMODAL 除了消息框有WB_EX_TOPMOST类型,MB_APPLMODAL和MB_SYSTEMMODAL一样。用系统模态消息框来改变各种各样的用户。基本的损坏错误须要马上注意(比如,内存溢出)。假设不是那些与hwnd联系的窗体,此标志对用户对窗体的相互联系没有影响。 MB_TASKMODAL 假设參数hwnd为NULL的话。那么除了全部属于当前线程高层次的窗体失效外,MB_TASKMODALL和MB_APPLMODAL一样。
当调用应用程序或库没有一个能够得到的窗体句柄时,使用此标志。但仍须要阻止输入到调用线程的其它窗体,而不是搁置其它线程。
其它: 标志 含义 MB_DEFAULT_DESKTOP_ONLY 接收输入的当前桌面一定是一个缺省桌面。
否则,函数调用失败。缺省桌面是一个在用户已经纪录且以后应用程序在此上面执行的桌面。 MB_HELP 把一个Helpbutton添加到消息框。选择Helpbutton或按F1产生一个Help事件。 MB_RIGHT 文本为右调整 MB_RTLREADING 用在Hebrew和Arabic系统中从右到左的顺序显示消息和大写文本。 MB_SETFOREGROUND 消息框变为前景窗体。在内部系统为消息个调用SetForegroundWindow函数。 MB_TOPMOST 消息框用WS_EX_TOPMOST窗体类型来创建MB_SERVICE_NOTIFICATION。 折叠返回值 ID 选择了…… IDOK(1) OK IDCANCEL(2) CANCEL IDABORT(3) ABORT IDRETRY(4) RETRY IDIGNORE(5) IGNORE IDYES(6) YES IDNO(7) NO BeginPain() 功能:为指定窗体的画图工作做准备,并将和画图有关的信息填充到一个PAINTSTRUCT结构体中。 函数原型: HDC BeginPaint( HWND hwnd, // 窗体的句柄 LPPAINTSTRUCT lpPaint // 绘制信息 ); 參数: hwnd:[输入]被重绘的窗体句柄 lpPaint:[输出]指向一个用来接收绘画信息的PAINTSTRUCT结构 返回值: 假设函数成功,返回值是指定窗体的"显示设备描写叙述表"句柄。
假设函数失败。返回值是NULL,表明没有得到显示设备的内容。
Getclientrect() 功能:该函数获取窗体客户区的坐标。
客户区坐标指定客户区的左上角和右下角。因为客户区坐标是相对窗体客户区的左上角而言的,因此左上角坐标为(0,0)。这里应该注意一下:坐标包括两种:屏幕坐标与客户区坐标。
严格区分这两种坐标对于理解Windows编程是非常重要的。 函数原型: 在Win32 SDK, 该API函数原型为 BOOL GetClientRect( HWND hWnd, // 窗体句柄 LPRECT lpRect // 客户区坐标 ); 在MFC中,该函数的原型为void GetClientRect(LPRECT lpRect) const; 參数: hWnd:是程序窗体的句柄。
lpRect:是一个指针,指向一个RECT类型的rectangle结构。
该结构有四个LONG字段,分别为left、top、right和bottom。
GetClientRect将这四个字段设定为窗体显示区域的尺寸。left和top字段通常设定为0。
right和bottom字段设定为显示区域的宽度和高度(像素点数)。
也能够是一个CRect对象指针。
CRect对象有多个參数,与RECT使用方法同样。
函数的作用总的来说就是把客户区的大写和小写进第二个參数所指的Rect结构当中。 返回值:假设函数成功,返回一个非零值 假设函数失败。返回零。
DrawText() 功能: 该函数的功能是在指定的矩形里写入格式化文本,根据指定的方法对文本格式化(扩展的制表符,字符对齐、折行等) 要指定额外的格式化选项,请使用DrawTextEx函数 原型: int DrawText( HDC hDC, // 设备描写叙述表句柄 LPCTSTR lpString, // 将要绘制的字符串 int nCount, // 字符串的长度 LPRECT lpRect, // 指向矩形结构RECT的指针 UINT uFormat // 正文的绘制选项 ); 參数: hdc: [输入]设备环境句柄。 lpString: [输入]指向将被写入的字符串的指针。假设參数nCount是-1。则字符串必须是以\0结束的。 假设uFormat包括DT_MODIFYSTRING。则函数可为此字符串添加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。
nCount: [输入]指向字符串中的字符数。假设nCount为-1,则lpString指向的字符串被觉得是以\0结束的,DrawText会自己主动计算字符数。 lpRect: [输入/输出]指向结构RECT的指针,当中包括文本将被置于当中的矩形的信息(按逻辑坐标)。
uFormat: [输入]指定格式化文本的方法。它能够下列值的随意组合。各值描写叙述例如以下: DT_CALCRECT:这个參数比較重要,能够使DrawText函数计算出输出文本的尺寸。假设输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。假设输出文本仅仅有一行,则DrawText函数改变矩形的右边界。以容纳下正文行的最后一个字符。
出现上述不论什么一种情况。DrawText函数将返回格式化文本的高度。而不是绘制文本。 DT_CENTER:指定文本水平居中显示。
DT_VCENTER:指定文本垂直居中显示。该标记仅仅在单行文本输出时有效。所以它必须与DT_SINGLELINE结合使用。
DT_SINGLELINE:单行显示文本,回车和换行符都不断行。 返回值: 假设函数调用成功。返回值是正文的高度(逻辑单位)。假设指定了DT_VCENTER或DT_BOTTOM,返回值是lpRect->top到绘制的正文的底部的偏移值。 假设函数调用失败,返回值是0 DestroyWindow(): 功能:销毁指定的窗体。
这个函数通过发送WM_DESTROY 消息和 WM_NCDESTROY 消息使窗体无效并移除其键盘焦点。这个函数还销毁窗体的菜单,清空线程的消息队列。销毁与窗体过程相关的定时器,解除窗体对剪贴板的拥有权,打断剪贴板器的查看链。 原型: BOOL DestroyWindow( HWND hWnd // handle to window to destroy ); hWnd :将被销毁的窗体的句柄。 參数: hWnd :将被销毁的窗体的句柄。 返回值: 假设函数成功。返回值为非零:假设函数失败。返回值为零。
PostQuitMessage() 功能: 该函数向系统表明有个线程有终止请求。通经常使用来响应WM_DESTROY消息。 调用实例: invoke PostQuitMessage,null GetModuleHandle() 功能: 函数的作用是返回指定模块名的句柄,假设为NULL,则返回本模块的句柄。
返回的句柄值存放在寄存器eax中。 lpModuleName參数是一个指向含有模块名称字符串的指针; 调用实例: invoke GetModuleHandle,offset szUserDll RtlZeroMemory()同 ZeroMemory() Rtl:Rtl:runtime library的缩写,就是“执行时函数库”的意思 功能: ZeroMemory仅仅是将指定的内存块清零。 使用结构前清零,而不让结构的成员数值具有不确定性,是一个好的编程习惯。 原型: void ZeroMemory( PVOID Destination,SIZE_T Length ); 參数: Destination :指向一块准备用0来填充的内存区域的開始地址。
Length :准备用0来填充的内存区域的大小,按字节来计算 返回值:无 LoadCursor() 功能: 该函数从一个与应用事例相关的可执行文件(EXE文件)中加载指定的光标资源。该函数已被Loadlmage函数替代。 原型: HCURSOR LoadCursor(HINSTANCE hlnstance,LPCTSTR lpCursorName); 參数: 折叠hlnstance 标识一个模块事例,它的可执行文件包括要加载的光标。 折叠LpCursorName 指向以NULL结束的字符串的指针。该字符串存有等加载的光标资源名。
该參数低位字节和高位字节0组成资源标识器也能够由低位字为资源标识符和高位字为零组成。也能够用MAKEINTRESOURCE宏命令创建该值。要使用Win32提前定义的一个光标,应用程序必须把hlnstance參数设为NULL,并把IpCursorName设为例如以下值之中的一个: IDC_APPSTARTING 标准的箭头和小沙漏 IDC_ARROW 标准的箭头 IDC_CROSS 十字光标 IDC_HAND Windows 98/Me, Windows 2000/XP: Hand IDC_HELP 标准的箭头和问号 IDC_IBEAM 工字光标 IDC_ICON Obsolete for applications marked version 4.0 or later. IDC_NO 禁止圈 IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL. IDC_SIZEALL 四向箭头指向东、西、南、北 IDC_SIZENESW 双箭头指向东北和西南 IDC_SIZENS 双箭头指向南北 IDC_SIZENWSE 双箭头指向西北和东南 IDC_SIZEWE 双箭头指向东西 IDC_UPARROW 垂直箭头 IDC_WAIT 沙漏,Windows7系统下会显示为选择的圆圈表示等待 返回值: 假设成功,返回值是新加载的光标的句柄:假设失败,返回值是NULL Sendmessage() 功能: 该函数将指定的消息发送到一个或多个窗体。
此函数为指定的窗体调用窗体程序,直到窗体程序处理完消息再返回。而函数PostMessage不同。将一个消息寄送到一个线程的消息队列后马上返回 原型: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam); 參数: hWnd:其窗体程序将接收消息的窗体的句柄。
假设此參数为HWND_BROADCAST,则消息将被发送到系统中全部顶层窗体,包括无效或不可见的非自身拥有的窗体、被覆盖的窗体和弹出式窗体。但消息不被发送到子窗体。
Msg:指定被发送的消息。
wParam:指定附加的消息特定信息。 IParam:指定附加的消息特定信息。 返回值; 返回值指定消息处理的结果,依赖于所发送的消息 PostMessage() 功能:该函数将一个消息放入(寄送)到与指定窗体创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得 原型: BO0L PostMessage(HWNDhWnd。UINTMsg。WPARAMwParam。LPARAMlParam) 參数: hWnd:其窗体程序接收消息的窗体的句柄。可取有特定含义的两个值: HWND_BROADCAST:消息被寄送到系统的全部顶层窗体,包括无效或不可见的非自身拥有的窗体、 被覆盖的窗体和弹出式窗体。消息不被寄送到子窗体 NULL:此函数的操作和调用參数dwThread设置为当前线程的标识符PostThreadMessage函数一样 Msg:指定被寄送的消息。 wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。 返回值: 假设函数调用成功。返回非零值:假设函数调用失败,返回值是零。
若想获得很多其它的错误信息。请调用GetLastError函数。 RegisterClassEx() 功能: 该函数为随后在调用Createwindow函数和CreatewindowEx函数中使用的窗体注冊一个窗体类 原型: ATOM RegisterClassEx(CONST WNDCLASSEX *Ipwcx); 參数: Ipwcx:指向一个WNDCLASSEX结构的指针。
在传递给这个函数之前,必须在结构内填充适当的类的属性返回值:假设函数成功。返回这个窗体类型的标识号;假设函数失败,返回值为0。若想获得很多其它错误信息,请调用GetLastError函数 CreatewindowEX() 功能: 该函数创建一个具有扩展风格的层叠式窗体、弹出式窗体或子窗体,其它与CreateWindow函数同样 原型: CreateWindowEx函数创建一个层叠的,自己主动弹出的(pop-up)或是一个子窗体通过扩展格式。
另外这个函数的作用与CreateWindow函数的作用同样。要获得很多其它的关于创建窗体的信息和关于CreateWindowEx函数參数的具体描写叙述。參见CreateWindow HWNDCreateWindowEx( DWORDdwExStyle,//窗体的扩展风格 LPCTSTRlpClassName,//指向注冊类名的指针 LPCTSTRlpWindowName,//指向窗体名称的指针 DWORDdwStyle,//窗体风格 intx,//窗体的水平位置 inty,//窗体的垂直位置 intnWidth,//窗体的宽度 intnHeight,//窗体的高度 HWNDhWndParent,//父窗体的句柄 HMENUhMenu,//菜单的句柄或是子窗体的标识符 HINSTANCEhInstance,//应用程序实例的句柄 LPVOIDlpParam//指向窗体的创建数据 ); 參数: 指定窗体的扩展风格。该參数能够是下列值: WS_EX_NODRAG:防止窗体被移动 WS_EX_ACCEPTFILES:指定以该风格创建的窗体接受一个拖拽文件。
WS_EX_APPWINDOW:当窗体可见时,将一个顶层窗体放置到任务条上。 WS_EX_CLIENTEDGE:指定窗体有一个带阴影的边界。 WS_EX_CONTEXTHELP:在窗体的标题条包括一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、假设点击了一个子窗体。则子窗体接收到WM_HELP消息。子窗体应该将这个消息传递给父窗体过程,父窗体再通过HELP_WM_HELP命令调用WinHelp函数。
这个Help应用程序显示一个包括子窗体帮助信息的弹出式窗体。 WS_EX_CONTEXTHELP不能与WS_MAXIMIZEBOX和WS_MINIMIZEBOX同一时候使用。 WS_EX_CONTROLPARENT:同意用户使用Tab键在窗体的子窗体间搜索。 WS_EX_DLGMODALFRAME:创建一个带双边的窗体;该窗体能够在dwStyle中指定WS_CAPTION风格来创建一个标题栏。 WS_EX_LEFT:窗体具有左对齐属性,这是缺省设置的。 WS_EX_LEFTSCROLLBAR:假设外壳语言是如Hebrew。Arabic。或其它支持reading order alignment的语言,则标题条(假设存在)则在客户区的左部分。若是其它语言。在该风格被忽略而且不作为错误处理。 WS_EX_LTRREADING:窗体文本以LEFT到RIGHT(自左向右)属性的顺序显示。
这是缺省设置的。
WS_EX_MDICHILD:创建一个MDI子窗体。 WS_EX_NOPATARENTNOTIFY:指明以这个风格创建的窗体在被创建和销毁时不向父窗体发送WM_PARENTNOTFY消息。 WS_EX_OVERLAPPEDWINDOW:WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的组合。 WS_EX_PALETTEWINDOW:WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST风格的组合WS_EX_RIGHT:窗体具有普通的右对齐属性,这依赖于窗体类。仅仅有在外壳语言是如Hebrew,Arabic或其它支持读顺序对齐(reading order alignment)的语言时该风格才有效,否则,忽略该标志而且不作为错误处理。
WS_EX_RIGHTSCROLLBAR:垂直滚动栏在窗体的右边界。
这是缺省设置的。
WS_EX_RTLREADING:假设外壳语言是如Hebrew,Arabic,或其它支持读顺序对齐(reading order alignment)的语言,则窗体文本是一自左向右)RIGHT到LEFT顺序的读出顺序。若是其它语言,在该风格被忽略而且不作为错误处理。 WS_EX_STATICEDGE:为不接受用户输入的项创建一个3一维边界风格 WS_EX_TOOLWINDOW:创建工具窗体,即窗体是一个游动的工具条。工具窗体的标题条比一般窗体的标题条短,而且窗体标题以小字体显示。
工具窗体不在任务栏里显示。当用户按下alt+Tab键时工具窗体不在对话框里显示。假设工具窗体有一个系统菜单,它的图标也不会显示在标题栏里,可是。能够通过点击鼠标右键或Alt+Space来显示菜单。
WS_EX_TOPMOST:指明以该风格创建的窗体应放置在全部非最高层窗体的上面而且停留在其L。即使窗体未被激活。使用函数SetWindowPos来设置和移去这个风格。
WS_EX_TRANSPARENT:指定以这个风格创建的窗体在窗体下的同属窗体已重画时,该窗体才干够重画。 因为其下的同属窗体已被重画,该窗体是透明的。 折叠IpClassName :指向一个空结束的字符串或整型数atom。假设该參数是一个整型量,它是由此前调用RegisterClass或RegisterClassEx函数返回的值。这个小于OxCOOO的16位数必须是IpClassName參数字的低16位,该參数的高位必须是O。 假设lpClassName是一个字符串,它指定了窗体的类名。这个类名能够是不论什么用函数RegisterClassEx注冊的类名,或是不论什么提前定义的控制类名。请看说明部分的列表。
系统默认的类名(可直接使用,无需使用RegisterClass注冊) 解释 button button edit 编辑框 ComboBox 组合框 ListBox 列表框 MDIClient 多文档界面 ScrollBar 滚动栏 Static ?静态组件 折叠lpWindowName :指向一个指定窗体名的空结束的字符串指针。 假设窗体风格指定了标题条,由lpWindowName指向的窗体标题将显示在标题条上。当使用CreateWindow 函数来创建控制比如button,选择框和静态控制时。可使用lpWindowName来指定控制文本。
折叠dwStyle :指定创建窗体的风格。该參数能够是下列窗体风格的组合再加上说明部分的控制风格。 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參数。
风格意义: 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:创建一个具有最大化button的窗体。该风格不能与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_MAXIMIZEBOX风格的层叠窗体。
与WS_OVERLAPPEDWINDOW风格同样。 WS_VISIBLE:创建一个初始状态为可见的窗体。 WS_VSCROLL:创建一个有垂直滚动栏的窗体。
折叠nWidth :以设备单元指明窗体的宽度。
对于层叠窗体。nWidth或是屏幕坐标的窗体宽度或是CW_USEDEFAULT。若nWidth是CW_USEDEFAULT,则系统为窗体选择一个缺省的高度和宽度:缺省宽度为从初始X坐标開始到屏幕的右边界,缺省高度为从初始X坐标開始到目标区域的顶部。
CW_USEDEFAULT仅仅对层叠窗体有效;假设为弹出式窗体和子窗体设定CW_USEDEFAULT标志则nWidth和nHeight被设为零。 折叠nHeigth :以设备单元指明窗体的高度。对于层叠窗体。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 Showwindow() 功能: 该函数设置指定窗体的显示状态 原型: BOOL ShowWindow(HWND hWnd, int nCmdShow); 參数: hWnd:指窗体句柄。
nCmdShow:指定窗体怎样显示。假设发送应用程序的程序提供了STARTUPINFO结构。则应用程序第一次调用ShowWindow时该參数被忽略。否则。在第一次调用ShowWindow函数时,该值应为在函数WinMain中nCmdShow參数。在随后的调用中,该參数能够为下列值之中的一个: SW_FORCEMINIMIZE:在WindowNT5.0中最小化窗体,即使拥有窗体的线程被挂起也会最小化。在从其它线程最小化窗体时才使用这个參数。 SW_HIDE:隐藏窗体并激活其它窗体。 SW_MAXIMIZE:最大化指定的窗体。 SW_MINIMIZE:最小化指定的窗体而且激活在Z序中的下一个顶层窗体。
SW_RESTORE:激活并显示窗体。
假设窗体最小化或最大化,则系统将窗体恢复到原来的尺寸和位置。在恢复最小化窗体时,应用程序应该指定这个标志。 SW_SHOW:在窗体原来的位置以原来的尺寸激活和显示窗体。 SW_SHOWDEFAULT:根据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。
SW_SHOWMAXIMIZED:激活窗体并将其最大化。 SW_SHOWMINIMIZED:激活窗体并将其最小化。 SW_SHOWMINNOACTIVE:窗体最小化,激活窗体仍然维持激活状态。 SW_SHOWNA:以窗体原来的状态显示窗体。激活窗体仍然维持激活状态。 SW_SHOWNOACTIVATE:以窗体近期一次的大小和状态显示窗体。
激活窗体仍然维持激活状态。 SW_SHOWNORMAL:激活并显示一个窗体。假设窗体被最小化或最大化。系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗体的时候应该指定此标志 返回值: 假设窗体之前可见。则返回值为非零。假设窗体之前被隐藏。则返回值为零 UpdateWindow() 功能: 假设窗体更新的区域不为空,UpdateWindow函数通过发送一个WM_PAINT消息来更新指定窗体的客户区。函数绕过应用程序的消息队列。直接发送WM_PAINT消息给指定窗体的窗体过程,假设更新区域为空。则不发送消息。
原型: BOOL UpdateWindow( HWND hWnd // 窗体的句柄 ); 參数: hWnd [输入] 要更新的窗体的句柄. 返回值: 假设函数调用成功,返回值为非零值。 假设函数调用不成功。返回值为零。 Getmessage() 功能: 函数GetMessage 是 从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗体联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其它线程或应用程序的消息。获取消息成功后。线程将从消息队列中删除该消息。
函数会一直等待直到有消息到来才有返回值 原型: BOOL GetMessage(LPMSG lpMsg,HWND hWnd。UINT wMsgFilterMin,UINT wMsgFilterMax) 參数: lpMsg:指向MSG结构的指针。该结构从线程的消息队列里接收消息信息。 hWnd:取得其消息的窗体的句柄。
当其值取NULL时,GetMessage为不论什么属于调用线程的窗体检索消息。线程消息通过PostThreadMessage寄送给调用线程。 wMsgFilterMin:指定被检索的最小消息值的整数。 wMsgFilterMax:指定被检索的最大消息值的整数。
返回值: 假设函数取得WM_QUIT之外的其它消息,返回非零值。假设函数取得WM_QUIT消息,返回值是零。
假设出现了错误。返回值是-1。比如,当hWnd是无效的窗体句柄或lpMsg是无效的指针时。若想获得很多其它的错误信息,请调用GetLastError函数。
TranslateMessage() 功能: 该函数将虚拟键消息转换为字符消息。
字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
原型: BOOL TranslateMessage(CONST MSG★lpMsg) 參数: IpMsg:指向含有消息的MSG结构的指针。该结构里含实用函数GetMessage或PeekMessage从调用线程的消息队列里取得的消息信息。 返回值: 假设消息被转换(即。字符消息被寄送到调用线程的消息队列里),返回非零值。假设消息是WM_kEYDOWN,WM_KEYUP WM_SYSKEYDOWN或WM_SYSKEYUP,返回非零值。不考虑转换。假设消息没被转换(即,字符消息没被寄送到调用线程的消息队列里)。返回值是零。
DispatchMessage() 功能: 该函数分发一个消息给窗体程序。通常消息从GetMessage函数获得。消息被分发到回调函数(过程函数),作用是消息传递给操作系统,然后操作系统去调用我们的回调函数。也就是说我们在窗体的过程函数中处理消息 原型: LONG DispatchMessage(CONST MSG*lpmsg) 參数: lpmsg:指向含有消息的MSG结构的指针。
返回值: 返回值是窗体程序返回的值。虽然返回值的含义依赖于被调度的消息,但返回值通常被忽略。 备注:MSG结构必须包括有效的消息值。假设參数lpmsg指向一个WM_TIMER消息,而且WM_TIMER消息的參数IParam不为NULL。则调用IParam指向的函数。而不是调用窗体程序。 ExitProcess() 功能: 终止一个进程 调用实例: invoke ExitProcess,NULL
使用WIN32汇编语言实现一个基本windows窗体的过程分析