不是太明白GetWindowRect与GetClientRect 的用法

不是太清楚GetWindowRect与GetClientRect 的用法



我建立2个对话框,SETTING 对话框(中间那个,ID是:IDD_DLG_SETTING)是后面的对话框的菜单点出来的,用于设置线型,现在有个疑惑,就是我在每选一个线型的时候,就要在示例栏画出示例。

疑问来了,我要找到画的位置,示例栏 是一个 group,ID是:IDC_SMPLE。

我的意图是,找到group 的坐标然后以它为参考点,画出示例直线。

最先我想用 GetDlgItem(IDC_SMPLE)->GetWindowRect(&rect); 取的group的屏幕坐标。
再用ScreenToClient(&rect); 转成,客户区坐标,然后才画出直线。

这样很麻烦,我想用GetDlgItem(IDC_SMPLE)->GetClientRect(&rect); 直接取得 group作为客户区的坐标,
然后再以group的左上角为0点绘制直线。但是这样,问题就来了,画笔是CPaintDC dc(this) 也就是以group所在的窗口的画笔,dc.move 用的坐标系是group所在的窗口的,我想创建group控件的画笔,并以group控件为绘制的“画布”应该如何操作?


void CSettingDlg::OnPaint()
{
UpdateData();
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialog::OnPaint()
CPen pen(m_style,m_nLine_Width,RGB(255,0,0));
dc.SelectObject(&pen);
CRect rect;

  GetDlgItem(IDC_SMPLE)->GetWindowRect(&rect);
ScreenToClient(&rect);
dc.MoveTo(rect.left,rect.top+50);
dc.LineTo (rect.right,rect.top+50);


}

我想创建group控件的画笔,并以group控件为绘制的“画布”应该如何操作?

我尝试了这么做:

void CSettingDlg::OnPaint()
{
UpdateData();
CPaintDC dc(GetDlgItem(IDC_SMPLE)); // device context for painting

CPen pen(m_style,m_nLine_Width,RGB(255,0,0));
dc.SelectObject(&pen);
CRect rect;

GetDlgItem(IDC_SMPLE)->GetClientRect(&rect);
 
dc.MoveTo(rect.left,rect.top+50);
dc.LineTo (rect.right,rect.top+50);


}

可以画,但是新问题来了,就是我每次一点选其他的选项,窗口就空白了


拖一下窗口,才恢复显示:


请问我是哪里处理不当,应该如何纠正?



------解决方案--------------------
GetClientRect:获取的是客户区的大小
GetWindowRect:获取窗口大小,包含客户区,状态栏,菜单栏等