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

来源:互联网 发布:上海软件定制 编辑:程序博客网 时间:2024/04/28 22:54

 //本文来自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);