窗口本身有标题栏和框架的高度和宽度,所以你执行MoveWindow之后会出现偏差。
需要减去相应的坐标,rec.top需要减掉标题栏的高度,rec.left需要减掉窗口的边框宽度。边框的宽度可以用GetClientRect和GetWindowRect得到的Width()之差/2取得。
处理起来就是这样的:
CRect rc;
CRect rcWnd;
CRect rcClient;
int nBorderWidth;
::GetClientRect(this->GetSafeHwnd(),&rcClient);
::GetWindowRect(this->GetSafeHwnd(),&rcWnd);
::GetWindowRect(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(),&rc);
nBorderWidth = (rcWnd.Width() - rcClient.Width()) / 2;
::MoveWindow( GetDlgItem(IDC_EDIT2)->GetSafeHwnd(),rc.left - nBorderWidth - rcClient.left,rc.top - nBorderWidth - rcClient.top,rc.Width() ,rc.Height() ,TRUE);
需要减去相应的坐标,rec.top需要减掉标题栏的高度,rec.left需要减掉窗口的边框宽度。边框的宽度可以用GetClientRect和GetWindowRect得到的Width()之差/2取得。
处理起来就是这样的:
CRect rc;
CRect rcWnd;
CRect rcClient;
int nBorderWidth;
::GetClientRect(this->GetSafeHwnd(),&rcClient);
::GetWindowRect(this->GetSafeHwnd(),&rcWnd);
::GetWindowRect(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(),&rc);
nBorderWidth = (rcWnd.Width() - rcClient.Width()) / 2;
::MoveWindow( GetDlgItem(IDC_EDIT2)->GetSafeHwnd(),rc.left - nBorderWidth - rcClient.left,rc.top - nBorderWidth - rcClient.top,rc.Width() ,rc.Height() ,TRUE);
解决方案 »
- 菜鸟问个问题,关于自定按钮如何添加响应消息
- 有没有渲染网页的控件
- VC对话框+MapX 添加图层,画点 问题
- 怎么样才能使自己的进程获得系统权限
- 关于OnMenuSelect函数的三个参数问题???????????????
- vs2008下 RTX SDK 7.0???
- SendMessage(HWND_BROADCAST,ugFtMsg,(WPARAM)nWindowID,(LPARAM)1) 执行该语句是在部分电脑被悬挂,而在大部分电脑上没有问题,请问GGJJ们有什么解决办法。
- 如何在WinXP RC2 2526上安装VS.Net Beta2 ?
- 有谁在自己的机器(98)下成功使用过函数FlashWindowEx,请赐教
- 请教有关VC调用Matlab的问题
- vc 定义变量也出错
- ado访问access数据库表的问题
((CEdit*)GetDlgItem(IDC_EDIT1))->GetWindowRect(&rec);
ScreenToClient(&rec);
((CEdit*)GetDlgItem(IDC_EDIT2))->MoveWindow(&rec);