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);
}结果窗口左上角和右上角显示不出半角形
{
// 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);
}结果窗口左上角和右上角显示不出半角形
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);
}
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都是负的,原点已经移到了窗口的左上,所以左上的圆角看不到,那右下的圆角也就相对于向左上角平移
如果是0,你一定是放OnInitDialog中.因为窗口还没显示.而我是放OK按钮单击相应函数中的.
ScreenToClient(&rect); 后
我测试也发现了 left为-3 top为-18如果这的话.那ScreenToClient()函数还有什么用? 转换差值这么大...
-----------------
不能自己对自己,子窗口就有用了,比如按钮,得到的位置就是对的。
这个函数是转换RECT到相对于客户区的坐标,而许多函数例如SetWindowPos,MoveWindow都是需要相对于客户区的坐标。
--------------------------------------------------------
ScreenToClient()转换成了ClientRect,而前面你用的是GetWindowRect()
ClientRect与GetWindowRect是不一样的,还有FRAME的宽度和标题的高度