首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

百思不得其解,关于罗云彬书9.2节,该如何处理

2014-03-19 
百思不得其解,关于罗云彬书9.2节子程序代码是这样的:_Resizeproclocal@stRect:RECT,@stRect1:RECTinvokeMo

百思不得其解,关于罗云彬书9.2节
子程序代码是这样的:

_Resizeproc
local@stRect:RECT,@stRect1:RECT

invokeMoveWindow,hWinStatus,0,0,0,0,TRUE
invokeGetWindowRect,hWinStatus,addr @stRect
invokeGetClientRect,hWinMain,addr @stRect1
movecx,@stRect1.right
subecx,@stRect1.left
moveax,@stRect1.bottom
subeax,@stRect1.top
subeax,@stRect.bottom
addeax,@stRect.top
invokeMoveWindow,hWinEdit,0,0,ecx,eax,TRUE
ret

对话框过程中调用Resize的语句是:
WM_INITDIALOG
moveax,hWnd
movhWinMain,eax

invokeCreateStatusWindow,WS_CHILD OR WS_VISIBLE OR \
SBS_SIZEGRIP,NULL,hWinMain,ID_STATUSBAR
movhWinStatus,eax
invokeSendMessage,hWinStatus,SB_SETPARTS,4,offset dwStatusWidth
movlpsz1,offset sz1
movlpsz2,offset sz2
invokeSendMessage,hWinStatus,SB_SETTEXT,2,lpsz1

invokeCreateWindowEx,WS_EX_CLIENTEDGE,addr szClass,NULL,\
WS_CHILD or WS_VISIBLE or ES_MULTILINE or ES_WANTRETURN or WS_VSCROLL or ES_AUTOHSCROLL,\
0,0,0,0,hWnd,ID_EDIT,hInstance,NULL
movhWinEdit,eax

call_Resize


我的问题是:
1.为什么在WM_INITDIALOG消息中,一定要调用_Resize,也就是这一句call_Resize,eidt控件才会显示在窗口内?
2.问题集中在_Resize这个子程序中
invokeMoveWindow,hWinStatus,0,0,0,0,TRUE  ;这里设4个0是不是因为即使为0,状态栏也会自动调节大小尺寸?
invokeGetWindowRect,hWinStatus,addr @stRect ;
invokeGetClientRect,hWinMain,addr @stRect1 ;这是算客户区的尺寸,这我能看明白
movecx,@stRect1.right
subecx,@stRect1.left
moveax,@stRect1.bottom
subeax,@stRect1.top
subeax,@stRect.bottom
addeax,@stRect.top    ;上面这6句代码干嘛的呢,为什么一定要这么算,算出来的又是什么的尺寸呢?不明白,算客户区的高度直接用@stRect1.bottom-@stRect1.top不就行了吗?
为什么还要用这个值去减掉@stRect.bottom和@stRect.top之间的差值(也就是状态栏的高呢)? 
invokeMoveWindow,hWinEdit,0,0,ecx,eax,TRUE  ;


[解决办法]
1. 因为创建的那个 Edit 窗口初始大小为 0,0 所以没可显示的;故而通过 _Resize 子程来根据主窗口大小进行调整设置以占据主窗口。
2. _Resize 子程里对 StatusBar 窗口的 Move 是没有任何作用的,对状态栏而言,其位置和大小是固定的,没见那个程序的状态栏能跑顶上或其它位置的吧,或者,你注释了那个 MoveWindows() 看看效果如何;后面的几行,不就是计算主窗口的大小,再减去 StatusBar 窗口的大小,这样就是 Edit 窗口的大小了,用来设置 Edit 窗口的;Edit 和 StatusBar 都是共同占据着主窗口的 Client 区域的,所以要减去 Status 的大小。

热点排行