自绘控件中
CRect rect;
GetWindowRect(&rect);
ScreenToClient(&rect); 
rect值是(-1,-1,25,25) 我以为是(0,0,26,26)喃 为什么会出现这种情况?

解决方案 »

  1.   

    ScreenToClient(&rect);是把屏幕坐标转换为窗口坐标
    屏幕坐标是相对于屏幕左上角的,而窗口坐标是相对于窗客户区左上角的,即窗口title标题下面,
    MFC下,有些函数使用窗口坐标,有些使用屏幕坐标,使用时要分清。
    把屏幕左边转换成窗口坐标,相对于窗口坐标零点,坐标在原点的前面,所以当然是负值啦。
      

  2.   

    我的问题是,那三句话是在自绘控件中
    然后我做了个实验,创建一个对话框程序,在OnInitDialog中执行
    CRect rect; 
    GetWindowRect(&rect); 
    ScreenToClient(&rect); 
    结果是rect.left=-3;rect.top=-39也就是说ScreenTOClient的原点其实是titile的左上角,不是客户区左上角
    我自绘哪个控件时Cstatic,应该它的客户区和最左上角有一个像素空白,所以是-1
      

  3.   

    |---------------|
    | |------------|| 
    | |            ||
    | |------------||
    |---------------|
    外面的框架,是窗体,里面的框架,是客户区。
    GetWindowRect(&rect)的原点坐标,是电脑显示器左上角(0,0);
    ScreenToClient(&rect)的原点坐标,是客户区的左上角(0,0),注意,是客户区,而不是窗体;
    (以X轴方向向右,Y轴方向向下为正)
    同时,GetWindowRect获取的坐标,是窗体相对于 原点的坐标。
      

  4.   


    先谢谢了, 但是,如果如你说说GetWindowRect(&rect)原点是显示器左上角,那为什么 我新建一个对话框程序 在OnInitDialog中执行 
    CRect rect; 
    GetWindowRect(&rect); 
    结果会是
    rect.left=0,rect.top=0???
      

  5.   

    The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. 
    BOOL GetWindowRect(
      HWND hWnd,      // handle to window
      LPRECT lpRect   // address of structure for window coordinates
    );
      

  6.   

    首先,你要注意的时候,在OnInitDialog对话框的时候,窗体默认位置是在左上角的,也就是说,对话框是在左上角那个位置的;
    其次,当对话框创建完毕后,他的位置就被置中了。
    你可以试下(我刚试了下),在OnInitDialog和按钮事件里,都添加
             CRect rc1,rc2,rc3,rc4;
    GetWindowRect(rc1);
    GetClientRect(rc2);
    rc3=rc1;
    ScreenToClient(rc3);
    rc4=rc2;
    ClientToScreen(rc4);
    监视下,就知道这几个函数的作用了。
    所以,并不是函数有问题,只是窗体的位置发生了改变而已。