一个常规的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()功能:显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。原型:MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word)参数:hWnd:消息框的拥有窗此参数口。如果为NULL,则消息框没有拥有窗口。lpText:消息框的内容。如果使用了Unicode库,则把文本变成:lpCaption:消息框的标题。如果使用了Unicode库,则把文本变成:uType:指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的按钮以及图标。折叠uType参数按钮:按钮参数
含义
MB_OK
默认值。有一个确认按钮在里面。
MB_YESNO
有是和否在里面。
MB_ABORTRETRYIGNORE
有Abort(放弃),Retry(重试)和Ignore(跳过)
MB_YESNOCANCEL
消息框含有三个按钮:Yes,No和Cancel
MB_RETRYCANCEL
有Retry(重试)和Cancel(取消)
MB_OKCANCEL
消息框含有两个按钮: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
把一个Help按钮增加到消息框。选择Help按钮或按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)
NOBeginPain()功能:为指定窗口的绘图工作做准备,并将和绘图有关的信息填充到一个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到绘制的正文的底部的偏移值。如果函数调用失败,返回值是0DestroyWindow():功能:销毁指定的窗口。这个函数通过发送WM_DESTROY 消息和 WM_NCDESTROY 消息使窗口无效并移除其键盘焦点。这个函数还销毁窗口的菜单,清空线程的消息队列,销毁与窗口过程相关的定时器,解除窗口对剪贴板的拥有权,打断剪贴板器的查看链。 原型:BOOL DestroyWindow(HWND hWnd // handle to window to destroy);hWnd :将被销毁的窗口的句柄。参数:hWnd :将被销毁的窗口的句柄。返回值:如果函数成功,返回值为非零:如果函数失败,返回值为零。PostQuitMessage()功能:该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。调用实例:invoke PostQuitMessage,nullGetModuleHandle()功能:函数的作用是返回指定模块名的句柄,如果为NULL,则返回本模块的句柄。返回的句柄值存放在寄存器eax中。lpModuleName参数是一个指向含有模块名称字符串的指针;调用实例:invoke GetModuleHandle,offset szUserDllRtlZeroMemory()同 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: HandIDC_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系统下会显示为选择的圆圈表示等待返回值:如果成功,返回值是新载入的光标的句柄:如果失败,返回值是NULLSendmessage()功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数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函数参数的详细描述。参见CreateWindowHWNDCreateWindowEx(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  按钮
edit    编辑框
ComboBox    组合框
ListBox 列表框
MDIClient   多文档界面
ScrollBar   滚动条
Static  ​静态组件
折叠lpWindowName:指向一个指定窗口名的空结束的字符串指针。如果窗口风格指定了标题条,由lpWindowName指向的窗口标题将显示在标题条上。当使用CreateWindow函数来创建控制例如按钮,选择框和静态控制时,可使用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:创建一个具有最大化按钮的窗口。该风格不能与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结构。返回值:
如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULLShowwindow()功能:该函数设置指定窗口的显示状态原型: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窗口的过程分析相关推荐

  1. 【转】win32 的DLL中创建windows窗口

    转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...

  2. 重温WIN32 API ------ 最简单的Windows窗口封装类

    1 开发语言抉择 1.1 关于开发Win32 程序的语言选择 C还是C++ 在决定抛弃MFC,而使用纯Win32 API 开发Window桌面程序之后,还存在一个语言的选择,这就是是否使用C++.C+ ...

  3. 利用c语言在屏幕上画出窗口,第一课:创建一个windows窗口

    跟我一起学图形编程                               作者:姚明联系方式: 欢迎使用我的图形学教程.我是计算机专业的学生,对图形图像技术有浓厚的兴趣,就读期间广泛的涉及相关知 ...

  4. C/C++编写Windows窗口应用程序(Win32程序),非黑漆漆的控制台窗口

     Windows应用程序是基于消息驱动的,任何线程只要注册窗口类都会有一个消息队列用于接收用户输入的消息和系统消息. 一. 窗口的创建流程 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类 ...

  5. C++ 用DEV-C++建一个Windows窗口程序带文本框和命令按钮

    先看一下程序的效果图: 在Dev-C++ 5.11上创建并正常运行,操作系统32位.64位的Win7都可以. 首先在文件菜单里新建项目,选择Windows Application: 命名完成后得到如下 ...

  6. 在 Windows 中,当一个应用程序窗口被关闭,该应用程序将会保留在哪里?

    在 Windows中,当一个应用程序窗口被关闭后,该应用程序将仅保留在外部存储设备中. 计算机的主存储器称为 RAM(即 Ramdom Access Memory,随机存取存储器).我们可以把主存储器 ...

  7. Windows游戏开发感想一个完整的Windows窗口程序

    现在的互联网行业从事Windows游戏开发的人实在是太少了.一是因为门槛较高,游戏行业本来就是互联网行业最尖端的领域,要想从事游戏开发,不仅要掌握一门过硬的语言,尤其是对C++的精通,还要对算法非常精 ...

  8. 手把手教你写第一个Windows窗口

    第一个Windows窗口 效果展示 详细过程 设计窗口类 注册窗口类 创建窗口 显示窗口 更新窗口 消息循环 源代码 实用工具 图标制作软件 图标库 效果展示 第一个Windows窗口 详细过程 设计 ...

  9. [Visual Studio 2022 C#]使用SplitContainer拆分器让一个Windows窗口秒变多个

    [Visual Studio 2022 C#]使用SplitContainer拆分器让一个Windows窗口秒变多个 从工具箱中添加控件 根据需要设置拆分器的方向 ☑必备:必须设置成[置于底层] 通过 ...

  10. win7自动弹出计算机硬盘窗口,Win7弹出“Windows检测到一个硬盘问题”窗口怎么关闭...

    win7系统遇到一件很奇怪的问题,Win7经常弹出"Windows检测到一个硬盘问题"窗口,怎么关闭?大部分是由于硬盘可能出现坏道引起的,如果不想更换硬盘,而此时系统也还能使用,那 ...

最新文章

  1. 存储过程里面的CASE,WHEN,THEN的用法
  2. 给WIN7安装盘添加双PE3.0
  3. [高等数学]这你不背?
  4. test函数java,js中test()函数在正则中使用
  5. 软考信息系统项目管理师_信息化与信息系统4_软件工程_新一代信息技术---软考高级之信息系统项目管理师006
  6. Angular:带* ngClass的条件类
  7. 间接效应值大于1是正常的吗?Q群答疑20200405
  8. ie工业工程,VIOOVI工时分析软件:教你一个测量工时的快捷方法
  9. 通俗易懂的自动控制原理 # 绪论
  10. Onvif协议学习:12、修改分辨率
  11. Android中铃声总结源码
  12. codesys file读写配置参数程序
  13. 计算机上fn按键,fn键设置方法
  14. 知识产权与标准规范: 著作权法、计算机软件保护条例、商标权、不正当竞争法、招投标法、采购法、合同法
  15. RC522读取NFC Forum Type2 Tag流程及代码解析——Mifare Ultralight卡片读取(采用PHY6212平台,可移植)
  16. html中微信添加好友超链接,微信给文字加链接代码分享(原来微信超链接是这样加的)...
  17. NULL 指针在不同平台下的表现引发程序报错(C 语言)
  18. SAP MM 物料扩充MRP范围
  19. html自适应导航栏怎么写,网站简单兼容简洁的自适应导航栏代码
  20. HDU - 5514 Frogs

热门文章

  1. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  2. java定义一个父类circle_[转载]java编程题全集一(答案)
  3. linux内核安全模块,对Linux内核的修改 - Linux 安全模块(LSM)简介_Linux安全_Linux公社-Linux系统门户网站...
  4. clustalw序列比对_序列比对,科研必备的几款软件
  5. linux进程显示exit是怎么回事,linux 进程退出exit,_exit区别即atexit函数
  6. 父html向子html传递参数,子父组件之间传值.html
  7. 那些你不可错过的Java博客
  8. 白话/图示 sleep_on/wake_up的执行流程
  9. day15 ( 集合框架)
  10. 业务逻辑配置化的可选技术方案