zoukankan      html  css  js  c++  java
  • VC:GetWindowRect、GetClientRect、ScreenToClient与ClientToScreen

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

    GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。  
    用GetClientRect返回的RECT结构上左为零, 右下分别对应客户区的宽度和高度;

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

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

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

    ---------------------------

    例:

    获取某控件相对于对话框的位置:

    CRect rt;
    GetDlgItem(IDC_CB)->GetWindowRect(rt);  //取得在屏幕中的位置
    ScreenToClient(rt);         //转换到在对话框中的位置
    rt.left和rt.top为该控件在对话框中的位置;
    GetDlgItem(IDC_CB)->SetWindowPos(NULL,rt.left,rt.top,0,0,SWP_NOSIZE);//设置该位置(其实还是在原位置,因为rt.left和rt.top本来就是控件在对话框中的位置,如果要调整控件的位置,修改第二和第三个参数即可

    窗口的左上角坐标o(left,top)右下角坐标o(rightk,bottom)

    width = right - left;

    hight = bottom - top

    CRET wr,cr;

       pFrame->GetWindowRect(&wr);//pFrame是一个窗口的指针
       pFrame->GetClientRect(&cr)

    其中距形大小 wr(包括客户区和非客户区)>cr(仅包括客户区)

    CDialog也遵循以上规律(CDialog也是窗口)

    【原网址】:http://bbs.xml.org.cn/blog/more.asp?name=oceanblue&id=44420

  • 相关阅读:
    把文本文件数据快速导入Sql Server
    db4o, 看上去很美
    从《黑暗森林》事件谈下我对网络时代正版,盗版的看法
    viewDidUnload 和 dealloc 的区别(转)
    (翻译)cocoaasyncsocket 异步Socket
    iPhone的Socket编程使用开源代码之AsyncSocket(转)
    iphone之开源类库工具
    ObjectC 中各数据类型转换 NSData转NSString,Byte,UIImage
    iphone开发ObjectiveC新特性──类别与协议(转)
    让WebForm异步起来(转)
  • 原文地址:https://www.cnblogs.com/nanyangzp/p/3921884.html
Copyright © 2011-2022 走看看