• Client Window坐标 RECT相关函数


    GetClientRect(HWND, RECT*) ---得到窗口的客户区大小,left,top总是0,bottom是客户区高度,right是客户区宽度

    GetWindowRect(HWND, RECT*) ---得到窗口相对屏幕左上角(0,0)的坐标,即窗口左上角(left,top)和右下角(right,bottom)的坐标


    ScreenToClient(HWND, POINT*) ---将一屏幕坐标转为相对于窗口客户区左上角的坐标。假设客户区屏幕坐标(110,120,400,400)
                                                           若p(100,100),则转换后p(-10, -20)
                                                           若p(150,150),则转换后p(40, 30)

    ClientToScreen(HWND, POINT*) ---将一相对于窗口客户区左上角(始终假设)的坐标转为屏幕坐标。假设客户区屏幕坐标(110,120,400,400)
                                                           若p(5, 5),则转换后p(115,125)
                                                           若p(10, -20),则转换后p(120,100);

    Windows并没有提供直接转换客户区RECT坐标/屏幕RECT坐标的函数,但是MFC中的CWindow类提供了ClientToScreen(RECT*) 和 ScreenToClient(RECT*)函数。
    比如,当使用ClientToScreen(RECT *prc)时,传入的RECT坐标是假定为相对客户区左上角的,假设客户区屏幕坐标(110,120,400,400)
                                                    若rc(2,2,4,4),则转换后rc(112,122,114,124)
                                                    若rc(-5,-5,0,0),则转换后rc(105,115,110,120)
                                                    若rc(0,0,290,280),则转换后rc(110,120,400,400)  >--->------->------->此例常用来获取客户区相对屏幕原点的坐标:

    RECT rcClient;
    GetClientRect(&rcClient); //0 0 宽 高
    ClientToScreen(&rcClient); //客户区左上点和右下点的屏幕坐标
    /*很常用,但不要误认为ClientToScreen的作用仅限于此*/

    同理,当使用ScreenToClient(RECT *prc)时,传入的RECT坐标假定为屏幕坐标,假设客户区屏幕坐标(110,120,400,400)
                                                    若rc(150,150,160,160),则转换后rc(40,30,50,40)
                                                    若rc(100,100,120,120),则转换后rc(-10,-20,10,0)
                                                    若rc(110,120,400,400),则转换后rc(0,0,290,280)


    OffsetRect(RECT*, int dx, int dy)  ---移动矩形,从感官上:dx为正,右移,为负,则左移;dy为正,下移,为负,上移。若rc(100,100,150,150)
                                                             dx=0,dy=1,则转换后rc(100,101,150,151)
                                                             dx=-50,dy=-10,则转换后rc(50,90,100,140)
      使用1:将窗口相对屏幕坐标转为相对窗口左上角坐标(即0 0 宽 高)

    RECT rc;
    ::GetWindowRect(hwnd,  &rc);
    ::OffsetRect(&rc, -rc.left, -rc.top);
    /*当然也可以
    rc.right -= rc.left;
    rc.bottom -= rc.top;
    rc.left = rc.top = 0;
    */

      使用2:计算客户区相对窗口左上角的坐标

    //MFC下
    RECT rc, rcClient;
    
    GetWindowRect(&rc);//窗口的屏幕坐标
    
    GetClientRect(&rcClient);
    ClientToScreen(&rcClient);//客户区的屏幕坐标
    
    ::OffsetRect(&rcClient, -rc.left, -rc.top);//客户区相对与窗口左上角的坐标

    BOOL PtInRect(const RECT*lprc, POINT pt); 判断pt点是否在RECT内,是则返回非0;注意客户区和屏幕坐标使用时的转换。

    BOOL AdjustWindowRect(RECT *prc /*in/out*/, DWORD dwStyle, BOOL bMenu)  --假设传入的RECT为客户区的屏幕坐标,然后返回计算后的窗口坐标
                                           --适用于需要客户区大小为固定的情况,比如扫雷游戏客户区宽高应为方块的倍数
                                          --因为MoveWindow或SetWindowPos需要的是窗口坐标,它们常结合起来用
                                        --参数没有窗口句柄,因此坐标是根据窗口风格来计算的。第2个参数应指定恰当的风格。
                                      --第3个参数:窗口是否有MENU,就是[文件-编辑-查看..]那条菜单栏

    //一对话框程序
    RECT rcc = {0, 0, 380, 260};
    ::AdjustWindowRect(&rcc, GetWindowLong(hwnd, GWL_STYLE), FALSE);//rcc(-8, -30, 388, 268)
    ::SetWindowPos(hwnd, HWND_TOP, 10, 10, rcc.right-rcc.left, rcc.bottom-rcc.top, SWP_SHOWWINDOW);//客户区宽高依然为380 260
    //或::MoveWindow(hwnd, 10, 10, rcc.right-rcc.left, rcc.bottom-rcc.top, TRUE);

    还有AdjustWindowRectEx,多了第4个参数DWORD dwExStyle,例如创建窗口时指定了WS_EX_TOOLWINDOW扩展风格(该风格使标题栏更小),那你就应该使用AdjustWindowRectEx来指定该扩展风格以正确计算出窗口大小!

    FrameRect(HDC, const RECT*, HBRUSH) --画1逻辑单位宽度的边框,坐标由RECT指定
    FillRect(HDC, const RECT*, HBRUSH)--填充矩形

    ----------因为画刷句柄直接传给第三个参数了,因此,用CreateSolidBrush等创建的画刷是不需要SelectObject的。当然还是需要DeleteObject删除该句柄的--------

     

  • 相关阅读:
    WCF 订单服务(2)
    移动应用接口的授权和安全
    数据库服务器死锁的解决方法 (转)
    WCF 订单服务(3)
    sqlservice 表分区方法
    基于.NET解决方案的架构和框架
    IIS7架构原理
    多线程的同步和通信
    【原创】关于wince OS开发面试问题的总结系列之OAL
    【原创】关于noot的学习笔记
  • 原文地址:https://www.cnblogs.com/sfqtsh/p/5134878.html
Copyright © 2020-2023  润新知