Onsize中MoveWindow移动EditBox老是出错

Researcher 2009-01-15 01:33:37
我想在Onsize中MoveWindow移动一些按钮,GroupBox和一个EditBox
用如下API实现,其他的控间都按我的意志正常的移动了,可是只有那个EditBox不听话,只要一拉伸对话框,这个EditBox就不知道跑哪里去了?
百思不得其解.
::GetClientRect( hWnd, pRect );
POINT pt;
pt.x=pRect->left; pt.y=pRect->top;
::ClientToScreen(hWnd,&pt);
::ScreenToClient(hDlgWnd,&pt);
pRect->left=pt.x; pRect->top=pt.y;
...全文
309 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
JiangXiang 2011-02-25
  • 打赏
  • 举报
回复
确实是在控件还没有被创建之前就调用了一次OnSize导致出错。
RichyMong 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 cofanz 的回复:]
可能是第一次onsize时控件还没创建引起的
[/Quote]
同意。楼主检查一下,在OnSize中用到控件时候,最好检查一下控件句柄是否为空
cdpc0202 2009-09-22
  • 打赏
  • 举报
回复
ClientToScreen 接受LPRECT参数 不用费事搞个pt 直接把rect传进去就可以了。
ffkitt 2009-09-21
  • 打赏
  • 举报
回复
同意九楼,在控件还没有被创建之前就调用了一次OnSize导致出错。
Researcher 2009-04-09
  • 打赏
  • 举报
回复
cnzdgs 说得太对了,我吧editbox的border属性去掉就好了,看来就是这个原因
但是去掉border很难看,有没有办法保留border实现上述功能呢?
Show_Mike 2009-01-18
  • 打赏
  • 举报
回复
可以肯定的是你的这段代码解决的是客户区的整体位移的问题,应该没有什么问题.
出现上面所提到的编辑框跑没了的现象,推想可能与编辑框参数设置有关.建议检查一下编辑框的参数设置情况.
菜牛 2009-01-18
  • 打赏
  • 举报
回复
你的代码确实实现了“EditBox在逐渐往下移动,到后来就看不到”的功能。按照你的代码我理解的原意就是不要移动,也就是这些代码根本就不需要,全部去掉就行了。
cnzdgs 2009-01-18
  • 打赏
  • 举报
回复
另外还有一点,不同控件的边框尺寸也是不同的,你取的是客户区坐标,对于有边框的控件就有偏差了。
cnzdgs 2009-01-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Researcher 的回复:]
我是按照以下顺序搞的
GetClientRect( hWnd, pRect );
::ClientToScreen(hWnd,&pt);
MoveWindow

要是错误应该全部错,为什么按牛和HScroll都可以,只有那个EditBox是错的呢?
症状是开始还能看到一点,只不过发现EditBox在逐渐往下移动,到后来就看不到了.
[/Quote]
控件是怎么创建的?看看各个控件与窗口的父子关系是否相同。
Researcher 2009-01-17
  • 打赏
  • 举报
回复
我是按照以下顺序搞的
GetClientRect( hWnd, pRect );
::ClientToScreen(hWnd,&pt);
MoveWindow

要是错误应该全部错,为什么按牛和HScroll都可以,只有那个EditBox是错的呢?
症状是开始还能看到一点,只不过发现EditBox在逐渐往下移动,到后来就看不到了.
starytx 2009-01-16
  • 打赏
  • 举报
回复
你是想让控件随着窗口的调整自动调整大小位置吗?我倒是有个现成的类,很好用
cofanz 2009-01-16
  • 打赏
  • 举报
回复
可能是第一次onsize时控件还没创建引起的
wsy1983wsy 2009-01-16
  • 打赏
  • 举报
回复
如果要在窗体里移动控件,首先要获取其在父窗体中的位置,然后在修改此位置,然后在调用movewidow,使用的函数依次为,GetwindowRect获取控件的位置,然后转为父窗体中的位置用ScreenToClient,然后修改位置,搞定
wsy1983wsy 2009-01-16
  • 打赏
  • 举报
回复
如果要在窗体里移动空间,首先要获取其在父窗体中的位置,然后在修改此位置,然后在调用movewidow,使用的函数依次为,GetwindowRect获取控件的位置,然后转为父窗体中的位置用ScreenToClient,然后修改位置,OK!
hityct1 2009-01-16
  • 打赏
  • 举报
回复
应该是以下哪个函数用错了。
::GetClientRect( hWnd, pRect );
::ClientToScreen(hWnd,&pt);
::ScreenToClient(hDlgWnd,&pt);

设置断点,一步一步调试,看看哪步得到的结果不是你想要的。
cnzdgs 2009-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cnzdgs 的回复:]
你想怎么移动?
先GetWindowRect获取Edit控件的矩形,然后ClientToScreen将其转换为父窗口(通常是对话框)客户区内坐标,然后修改位置,再调用MoveWindow。
[/Quote]
写错了,不是ClientToScreen,应该是ScreenToClient。
chshnan 2009-01-15
  • 打赏
  • 举报
回复
先获取屏幕坐标GetWindowRect,再转为客户区坐标ScreenToClient,试试看。
livpu 2009-01-15
  • 打赏
  • 举报
回复
给你个链接看看吧
http://topic.csdn.net/t/20051207/16/4443971.html#r_32618612
cnzdgs 2009-01-15
  • 打赏
  • 举报
回复
你想怎么移动?
先GetWindowRect获取Edit控件的矩形,然后ClientToScreen将其转换为父窗口(通常是对话框)客户区内坐标,然后修改位置,再调用MoveWindow。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧