注册 登录
编程论坛 汇编论坛

控件坐标计算理解不了

asd577586785 发布于 2014-02-07 15:30, 692 次点击
先说明这个程序的意图:
    对话框做主窗口,主窗口下方有一个状态栏,其他用编辑框填充。上方是弹出式菜单。也就是相当于是个简答的记事本
    窗口是可以拖动大小的,每次收到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 所以我觉得没啥好减的。 我这里直接填写窗口宽度,居然是错误的。
2 回复
#2
asd5775867852014-02-07 15:39
我它附件传上来了,有运行的截图,还有罗云彬的源码,还有我自己的源码,那个高手有时间就帮我看看吧,没时间就给我些提示,思路啥的!!
只有本站会员才能查看附件,请 登录
#3
wp2319572014-02-07 18:12
右减左等于宽度

这东西多做一些测试好了
1