您的位置:首页 > 其它

如何获得vc控件的屏幕坐标

2009-08-19 16:34 330 查看
//本文来自http://wanyozxy.blog.hexun.com/1676441_d.html, 在此感谢原文作者(wanyozxy's Blog的主人)

VC6的资源文件中会保存dialog中控件的坐标,格式是x,y,cx,cy。其中x,y是控件左上角的坐标,cx是控件的width,cy是控件的height。如下例是一个进度条控件在rc文件中的定义:

CONTROL Progress1",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,137,68,80,14

但这个坐标并不是真正的pixel unit,而是dialog unit。我在实际编程时为了能在进度条中显示数字,所以就重载了进度条类,替换原来的进度条控件。在调用新的派生类的Create()方法时,必须给出控件在dialog中的相对坐标。我直接使用了资源文件中原来进度条控件的坐标,结果发现误差很大。通过查询MSDN才搞清楚,原来资源文件中的坐标并不是pixel unit, 而是dialog unit。要想实现从dialog unit到pixel unit的转换可以调用api MapDialogRect() ,MFC已经封装了这个函数。

下面的代码根据rc文件中定义的控件坐标,获得该控件在dialog client area中以像素为单位的坐标。注意这个坐标是dialog内的相对坐标,不是整个screen内的绝对坐标。

RECT progressbar_rect;
TCHAR szBuf[256];

progressbar_rect.left = 137; // dialog unit
progressbar_rect.top = 68; // dialog unit
progressbar_rect.right = progressbar_rect.left + 80; // dialog unit
progressbar_rect.bottom = progressbar_rect.top + 14; // dialog unit

MapDialogRect(&progressbar_rect);

// display new pixel unit
_stprintf(szBuf, "Progress Bar (%d,%d) - (%d,%d)",
progressbar_rect.left, progressbar_rect.top,
progressbar_rect.right, progressbar_rect.bottom);

MessageBox(szBuf);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: