void CTest1Dlg::OnOK() 
{
// TODO: Add extra validation here
CRect rect;
GetWindowRect(&rect);
CRgn rgn;
ScreenToClient(&rect);
rgn.CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 35, 35);
this->SetWindowRgn(rgn, true);
}结果窗口左上角和右上角显示不出半角形

解决方案 »

  1.   

    改成以下代码OK
    void CXXXDlg::OnOK()
    {
    CRect rect; 
    CRgn rgn; 
    // GetWindowRect(&rect); 
    // ScreenToClient(&rect); 
    GetClientRect(&rect); rgn.CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 35, 35); 
    this->SetWindowRgn(rgn, true); 
    }
      

  2.   

    我也知道改成下面代码就OK了.但为什么得到相对桌面区域rect,再转客户区. 就不行了咧
      

  3.   

       GetWindowRect(&rect);+ ScreenToClient(&rect);不等于 GetClientRect(&rect);   
      

  4.   

    测试发现了,那你调试就知道原因了
    CRect rect;
    GetWindowRect(&rect);    // 获取窗口区域(包括边框,标题栏)可以看到left,top都是0
    CRgn rgn;
    ScreenToClient(&rect);   // 屏幕坐标转客户区坐标,这里rect.left,rect.top相对于客户区就是负值了,-3,-18
    rgn.CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, 35, 35);  //绘制圆角矩形
    this- >SetWindowRgn(rgn, true); // 设置窗口矩形,相对于窗口的,不是工作区,这里left,top都是负的,原点已经移到了窗口的左上,所以左上的圆角看不到,那右下的圆角也就相对于向左上角平移
      

  5.   

    不要怪我烦.GetWindowRect(&rect);    // 获取窗口区域(包括边框,标题栏)可以看到left,top都是0 错了.. left, top不为0
    如果是0,你一定是放OnInitDialog中.因为窗口还没显示.而我是放OK按钮单击相应函数中的.
    ScreenToClient(&rect); 后
    我测试也发现了 left为-3  top为-18如果这的话.那ScreenToClient()函数还有什么用? 转换差值这么大...
      

  6.   

    ScreenToClient()函数还有什么用? 转换差值这么大...
    -----------------
    不能自己对自己,子窗口就有用了,比如按钮,得到的位置就是对的。
    这个函数是转换RECT到相对于客户区的坐标,而许多函数例如SetWindowPos,MoveWindow都是需要相对于客户区的坐标。
      

  7.   

    如果这的话.那ScreenToClient()函数还有什么用? 转换差值这么大...
    --------------------------------------------------------
    ScreenToClient()转换成了ClientRect,而前面你用的是GetWindowRect()
    ClientRect与GetWindowRect是不一样的,还有FRAME的宽度和标题的高度
      

  8.   

    ClientRect与WindowRect是不一样的,还有FRAME的宽度和标题的高度