鱼C论坛

 找回密码
 立即注册
查看: 1875|回复: 5

关于win32汇编,窗口过程的疑问?

[复制链接]
发表于 2012-7-26 21:01:51 | 显示全部楼层 |阅读模式
15鱼币
本帖最后由 『香`草の゛芭芙 于 2012-7-26 21:03 编辑

_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam  ;建立窗口过程,问题1:定义就能获得数值吗?
  local @stPAINTSTRUCT
  local @stRect:RECT
  local @hDc
  mov eax,uMsg     ; uMsg的数值从哪里来的?
;********************************************************************
  .if eax == WM_PAINT     ; 没数值怎么做比较?
   invoke BeginPaint,hWnd,addr @stPs
   mov @hDc,eax    ;使用invoke 之后 返回值是默认存储在 eax的吗?
   invoke GetClientRect,hWnd,addr @stRect
   invoke DrawText,@hDc,addr szText,-1,\     ;   -1是什么意思呢?看了msdn的介绍不是很明白,是自动计算字符串长度吗
    addr @stRect,\
    DT_SINGLELINE or DT_CENTER or DT_VCENTER
   invoke EndPaint,hWnd,addr @stPs
;********************************************************************
  .elseif eax == WM_CLOSE
   invoke DestroyWindow,hWinMain
   invoke PostQuitMessage,NULL
;********************************************************************
  .else
   invoke DefWindowProc,hWnd,uMsg,wParam,lParam     ;这些被丢弃的消息windows怎么处理的?是直接扔掉吗
   ret
  .endif
;********************************************************************
  xor eax,eax
  ret
_ProcWinMain endp

hDC ;
[in] Handle to the device context.
paintstruct  ,   rect  ,   dc    好混淆啊。。。有什么好区别好理解的方法吗。。

最佳答案

查看完整内容

建立窗口过程,问题1:定义就能获得数值吗? 默认的,uses ebx edi esi hWnd,uMsg,wParam,lParam hWnd就是本窗口句柄,uMsg是消息,wParam和lParam是 uMsg结构体的成员 uMsg的数值从哪里来的? uMsg是从WinMain主程序的。 没数值怎么做比较? 可以用OD反汇编就可以看到他的16进制值 使用invoke 之后 返回值是默认存储在 eax的吗? 学习到现在,返回值应该都是在EAX中。 有些是返回需要的句柄,成功或者失败 -1是 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-7-26 21:01:52 | 显示全部楼层
建立窗口过程,问题1:定义就能获得数值吗?
默认的,uses ebx edi esi hWnd,uMsg,wParam,lParam  
hWnd就是本窗口句柄,uMsg是消息,wParam和lParam是 uMsg结构体的成员

uMsg的数值从哪里来的?
uMsg是从WinMain主程序的。

没数值怎么做比较?
可以用OD反汇编就可以看到他的16进制值

使用invoke 之后 返回值是默认存储在 eax的吗?
学习到现在,返回值应该都是在EAX中。
有些是返回需要的句柄,成功或者失败

-1是什么意思呢?看了msdn的介绍不是很明白,是自动计算字符串长度吗
msdn:指向字符串中的字符数如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数

  ;这些被丢弃的消息windows怎么处理的?是直接扔掉吗
不是被丢弃,是给WINDOWS系统自己处理,你不可能把所有的代码都自己写上去,所有的操作都会发送消息(单击左键,右键,双击,移动,全屏,不需要的就直接交给windows系统自己处理)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-27 07:02:52 | 显示全部楼层
                invoke        DrawText,@hDc,addr szText,-1,addr @stRect,DT_SINGLELINE or DT_CENTER or DT_VCENTER
                        ;函数功能                :该函数在指定的矩形里写入格式化文本,根据指定的方法对文本格式化(扩展的制表符,字符对齐、折行等)
                        ;hdc                :设备环境句柄
                        ;lpString                :指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以\0结束的
                        ;                :如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符
                        ;nCount                :指向字符串中的字符数如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数
                        ;lpRect                :指向结构RECT的指针,其中包含正文将被置于其中的矩形的信息(按逻辑坐标)
                        ;uFormat                :指定格式化正文的方法它可以下列值的任意组合,各值描述如下:
;DT_BOTTOM                :将正文调整到矩形底部此值必须和DT_SINGLELINE组合
;DT_CALCRECT                :决定矩形的宽和高如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底训以容纳正文的最后一行,如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符,上述任何一种情况,DrawText返回格式化正文的高度而不是写正文
;DT_EDITCONTROL                :复制多行编辑控制的正文显示特性,特殊地,为编辑控制的平均字符宽度是以同样的方法计算的,此函数不显示只是部分可见的最后一行
;DT_END_ELLIPSIS或DT_PATH_ELLIPSIS:可以指定DT_END_ELLIPSIS来替换在字符串末尾的字符,或指定DT_PATH_ELLIPSIS来替换字符串中间的字符如果字符串里含有反斜扛,DT_PATH_ELLIPSIS尽可能地保留最后一个反斜杠之后的正文
;DT_EXPANDTABS                :扩展制表符,每个制表符的缺省字符数是8
;DT_EXTERNALLEADING        :在行的高度里包含字体的外部标头,通常,外部标头不被包含在正文行的高度里
;DT_INTERNAL                :用系统字体来计算正文度量
;DT_MODIFYSTRING        :修改给定的字符串来匹配显示的正文,此标志必须和DT_END_ELLIPSIS或DT_PATH_ELLIPSIS同时使用
;DT_NOCLIP                :无裁剪绘制当DT_NOCLIP使用时DrawText的使用会有所加快
;DT_NOPREFIX                :关闭前缀字符的处理,通常DrawText解释助记前缀字符,&为给其后的字符加下划线,解释&&为显示单个&指定DT_NOPREFIX,这种处理被关闭
;DT_RTLREADING                :当选择进设备环境的字体是Hebrew或Arabicf时,为双向正文安排从右到左的阅读顺序都是从左到右的
;DT_SINGLELINE                :显示正文的同一行,回车和换行符都不能折行
;DT_TABSTOP                :设置制表,参数uFormat的15-18位(低位字中的高位字节)指定每个制表符的字符数,每个制表符的缺省字符数是8
;DT_CENTER                :使正文在矩形中水平居中
;DT_LEFT                        :正文左对齐
;DT_RIGHT                :正文右对齐
;DT_TOP                        :正文顶端对齐(仅对单行)
;DT_VCENTER                :正文水平居中(仅对单行)
;DT_WORDBREAK                :断开字当一行中的字符将会延伸到由lpRect指定的矩形的边框时,此行自动地在字之间断开一个回车一换行也能使行折断
;DT_WORD_ELLIPSIS        :截短不符合矩形的正文,并增加椭圆

;注意                        :DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP, DT_NOPREFIX值不能和DT_TABSTOP值一起使用
;返回值                        :如果函数调用成功,返回值是正文的高度,如果函数调用失败,返回值是0

;备注:函数DrawText用设备环境中的字体选择、正文颜色和背景颜色来写正文,除非DT_NOCLIP被使用,DrawText裁剪正文,所以它不会出现在指定矩形的外面,除DT_SINGLELINE格式化,其余的格式都认为正文有多行
;如果选择的字体对指定的矩形而言太大,DrawText不会试图去换成一种小字体
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-27 11:11:11 | 显示全部楼层
罗云彬大哥的教材讲的很清楚哦,建议你仔细阅读{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-27 11:19:20 | 显示全部楼层
第一个问题:
那个就是回调函数的参数了,(在这里建议你看一下消息机制和回调函数的内容)。这种格式是汇编的参数格式,可以用c语言的参数格式类比(只是类比哦)。
第二个问题:(看懂了第一个这个也就没问题了。)
第三个问题:WM_XXXX其实就是宏定义了,是常量哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-27 11:24:31 | 显示全部楼层
第四个问题:使用invoke返回值一般就放在EAX寄存器中。但记住这是函数的返回值,有的函数的功能是靠返回到函数的参数中实现的(例如可以返回到参数指针中),而返回值本省的意义却不大。
最后一个问题:DefWindowProc是默认窗口过程,你不处理的消息由此函数来处理,就是系统本身了哦。并不是简单的丢弃哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表