CRect rtWnd;
CDC *pWinDC=GetWindowDC();
GetWindowRect(&rtWnd);
首先我用上面获取到整个窗口的RECT然后再对该RECT作图处理。
在我用
pWnd->ScreenToClient(pRtWnd);//pRtWnd为上面GetWindowRect获取到的。
进行坐标转换时发现不对,刚好窗口的标题栏大小的区域不在转换后的区域了!不知道为什么?
感觉ScreenToClient是屏幕区到客户区,所以觉得
ScreenToClient(pRtWnd);
是不是其参数pRtWnd只能由GetClientRect得到,不能由GetWindowRect得到,是不是啊?

解决方案 »

  1.   

    pWnd->ScreenToClient(pRtWnd)是把相对于屏幕的矩形pRtWnd转换为相对于pWnd指向的窗口的客户区内的坐标。
      

  2.   

    我好像是要把相对于屏幕的矩形pRtWnd转换为相对于pWnd指向的窗口区内的坐标。而不是“窗口的客户区内的坐标”
    这该怎么办啊?
    GetWindowRect(pRtWnd);//获取的是窗口区域
    pWnd->ScreenToClient(pRtWnd); //此处我的本意希望是:相对于屏幕的矩形pRtWnd转换为相对于pWnd指向的窗口区内的坐标,而事件上转化的却是:转换为相对于pWnd指向的窗口的客户区内的坐标
      

  3.   

    通常都是转换到客户区内的坐标,所以没有提供转换到窗口内坐标的函数,不知道你的目的是什么,如果确实需要,可以自己转一下:取窗口矩形,把要转换的矩形的left和right减去窗口矩形的left,把要转换的矩形的top和bottom减去窗口矩形的top。
      

  4.   

    我是一对一个带标题栏的窗口进行重绘制时用到了“转换到窗口”这么一个思想。
    因为我获取了整个窗口的区域:GetWindowRect(pRtWnd);
    然后将装载好图片的内存DC贴到当前(窗口)DC上,用到:BitBlt函数贴图。所以我需要将:相对屏幕区的坐标转换到相对窗口区座标。然后贴图(事实上我自己也怀疑并不需要这个转换,直接贴上去就行了)
    我想问一下:BitBlt函数中用到的一些座标是:相对屏幕区的还是相对客户区的坐标啊?
    在什么情况下,需要用相对屏幕区的坐标,什么情况下又需要相对客户区的坐标呢?
      

  5.   

    BitBlt用的坐标与DC有关,窗口DC就是相对于窗口,客户区DC就是相对于客户区。你可以把窗口风格设置为没有标题和边框,用GetDC获取DC来贴图。
      

  6.   

    建议了解一下窗口坐标的概念.GetWindowRect获得的是窗口在屏幕上的坐标,坐标原点在屏幕左上角.而ClientRect获得的是客户区在坐标,left和top总是0.你想在窗口上绘图,要进行坐标转换.下面是一个API例子,RECT rcwnd;  //窗口rect
    GetWindowRect(hwnd,&rcwnd);ScreenToClient(hwnd,&rcwnd);//转换成客户区坐标
    ScreenToClient(hwnd,(LPPOINT)&rcWnd+1);OffsetRect(&rcwnd,-rcwnd.left,-rcwnd.top);//关键在这里