MFC控件位置调整和坐标确定

在mfc工程中控件或者窗口位置的调整是经常遇到的,特别是基于对话框的工程。位置的调整包括坐标、长度和宽度的变化,一般在窗口类的OnSize函数中实现。控件位置的调整涉及的函数有:GetWindowRect()、ScreenToClient()、GetClientRect()、MoveWindow()或SetWindowPos(),功能意义如下:


GetWindowRect():获得窗口在屏幕上的矩形坐标,调整控件位置时必须首先获得该屏幕坐标;


ScreenToClient():转换屏幕坐标到客户区坐标,如果为子窗口,转换后坐标为相对于父窗口的坐标,若为独立窗口,转换后客户区左上坐标为(0,0);调整子窗口时这一步也是必须的;


GetClientRect():获得窗口客户区坐标,左上坐标永远为(0,0);


MoveWindow():调整控件到指定位置;


SetWindowPos():调整控件的位置,该函数使用更灵活,多用于只修改控件位置而大小不变或只修改大小而位置不变的情况:


控件位置调整涉及的参变量有:主窗口的cx、cy坐标、参考点坐标。相对于调整位置时调用的函数,变量稍许复杂些。cx、cy坐标为主窗口的宽和高,有OnSize的参数给出,为窗口控件调整提供了变化的范围,所有的控件为了能够正常显示都不能超出这个范围。其实在开发过程中较难和重要的是参考控件的选择,其位置相对于主窗口来说必须好确定。常用的策略:


1.  选择主窗口上位置不随窗口大小变化的控件为参考;


2.  选择主窗口上控件的宽或者高固定的控件;


3.  选择与主窗口满足固定坐标关系的控件 ;


4.  选择主窗口上控件位置或者高宽容易确定的控件。


以上四种策略可在实际开发中作为参考!不管遇到什么的情况,一定要清楚:选则一个

————————————————————————————————————————————————————————————————

MapDialogRect,转换对话框坐标为像素坐标
  功能:该函数把指定的对话框单位映射成屏幕单位(像素)。函数MapDialogRect用变换坐标替换指定的RECT结构中的坐标,这就使得该结构可以用来创建对话框或定位对话框内的控制。
  函数原型:BOOL MapDialogRect(HWND hDlg,LPRECT IpRect);
  参数:
  hDlg:标识对话框。MapDialogRect 函数只接收对话框创建函数中一个创建的对话框的句柄,对于其他窗口的句柄失效。
  IpRect:指向一个含有将被转变的对话框坐标的RECT结构。
  返回值:如果消息被处理,则返回值为非零值。如果消息没有被处理则返回值为零。若想获得更多的错误信息,请调用GetLastError函数。
  备注:MapDialogRect函数假定RECT结构内的起始坐标代表对话框单位。为把这些坐标从对话框单位转变为像素,函数检索对话框的当前水平和垂直基本单位,然后应用下列公式:
  left=(left*baseunitX)/4;right=(right*baseunitX)/4
  top=(top* baseunitY)/ 8; bottom=(bottom* baseunitY)/ 8

在很多情况下,对话框的基本单位同用GetDialogBaseUnits函数检索到的单位一样。如果对话板模板有DS_SETFONT类型,那么基本单位为模扳给定的字体中的字符的平均宽度和高度,单位为像素。
  速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:Winuser.h;库文件:USer32.lib。



  GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。


  GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。  

  ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.

  ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.

我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后 GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于 GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。   

 对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。   

 

对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。 


你可能感兴趣的:(MFC)