控件坐标计算理解不了
先说明这个程序的意图:对话框做主窗口,主窗口下方有一个状态栏,其他用编辑框填充。上方是弹出式菜单。也就是相当于是个简答的记事本
窗口是可以拖动大小的,每次收到WM_SIZE消息状态栏到时可以自己计算大小,编辑框控件要自己计算大小。但我不明白他为什么要这样计算呢?
罗云彬的宽度 高度计算我又理解不了,求高人给点提示,给点思路!! 最好能来几张贴图,纯文字理解起来太困难了。
这段程序我理解不了坐标的计算:
程序代码:
invoke GetWindowRect,hWinStatus,addr @stRect hWinStatus 是状态栏句柄 @stRect是RECT结构 invoke GetClientRect,hWinMain,addr @stRect1 hWinMain 是窗口句柄 @stRect1是RECT结构 mov ecx,@stRect1.right sub ecx,@stRect1.left /* 为什么要用右边减去左边?左边永远都是为0啊 */ /* 宽度的计算 */ mov eax,@stRect1.bottom /* 高度的计算 */ sub eax,@stRect1.top sub eax,@stRect.bottom add eax,@stRect.top 窗口底部-窗口顶边-状态栏底部+状态栏顶部=高度 这是啥理论!! 最可恶的是状态栏的底部是相对于屏幕坐标的,它和计算编辑框高度能扯上毛的关系啊, 这个我怎么都想不通。还有 窗口底部-窗口顶边 这个到底有啥意思? 窗口顶边永远是0呀。 invoke MoveWindow,hWinEdit,0,0,ecx,eax,TRUE
GetWindowRect 获取指定窗口或控件的矩形,是相对于屏幕的坐标
GetClientRect 获取指定窗口或控件的矩形,是相对于窗口的,所以左上角和顶边永远都是零
这两个函数应该是这样的意思吧!!如果理解错误,请高人指正!!
下面这是我按照我自己的思路写的代码
程序代码:
invoke GetClientRect,hWnd,addr Rct hWnd窗口句柄 Rct是RECT结构 invoke GetClientRect,hWndStruct,addr Rct1 hWndStruct状态栏句柄,RRct1是RECT结构 mov eax,Rct.bottom sub eax,Rct1.bottom invoke MoveWindow,hWndEdit,0,0,eax,Rct.right,TRUE
我的思路是:用GetClientRect获取窗口的矩形,窗口的底部减去状态栏的底部就是编辑框的底部了,窗口的右边就是编辑框的右边。实时是我想的挺美好,做出来相差十万八千里。底部可以随着窗口改变而改变,位置也正确,但是右边不正确。而且只要输入过多的也就是当编辑框的滚动条向下滚动的时候,编辑框的底部就会和窗口的底部重合,直接覆盖了状态栏。
更可恶的的是了上面罗云彬的的代码宽度也是用窗口的右边减去左边,因为左边永远都是0 所以我觉得没啥好减的。 我这里直接填写窗口宽度,居然是错误的。