iczelion tut3[5]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 jimgreen 的 blog

.endw

这时候我们的窗口已显示在屏幕上了。但是它还不能从外界接收消息。所以我们必须给它提供相关的消息。我们是通过一个消息循环来完成该项工作的。每一个模块仅有一个消息循环,我们不断地调用 getmessage 从 windows 中获得消息。getmessage 传递一个 msg 结构体给 windows ,然后 windows 在该函数中填充有关的消息,一直到 windows 找到并填充好消息后 getmessage 才会返回。在这段时间内系统控制权可能会转移给其他的应用程序。这样就构成了win16 下的多任务结构。如果 getmessage 接收到 wm_quit 消息后就会返回 false,使循环结束并退出应用程序。translatemessage 函数是一个是实用函数,它从键盘接受原始按键消息,然后解释成 wm_char,在把 wm_char 放入消息队列,由于经过解释后的消息中含有按键的 ascii 码,这比原始的扫描码好理解得多。如果您的应用程序不处理按键消息的话,可以不调用该函数。dispatchmessage 会把消息发送给负责该窗口过程的函数。

mov eax,msg.wparam
ret
winmain endp

如果消息循环结束了,退出码存放在 msg 中的 wparam中,您可以通过把它放到 eax 寄存器中传给 windows目前 windows 没有利用到这个结束码,但我们最好还是遵从 windows 规范已防意外。

wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam

是我们的窗口处理函数。您可以随便给该函数命名。其中第一个参数 hwnd 是接收消息的窗口的句柄。umsg 是接收的消息。注意 umsg 不是一个 msg 结构,其实上只是一个 dword 类型数。windows 定义了成百上千个消息,大多数您的应用程序不会处理到。当有该窗口的消息发生时,windows 会发送一个相关消息给该窗口。其窗口过程处理函数会智能的处理这些消息。wparam 和 lparam 只是附加参数,以方便传递更多的和该消息有关的数据。

.if umsg==wm_destroy
invoke postquitmessage,null
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
xor eax,eax
ret

本文关键:iczelion asm
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top