在一个VC静态控制上作图的问题

coldice 2001-03-10 12:40:00
void CDDlg::OnPaint() //一个对话框类
{
if (IsIconic())
{
..........
}
else
{ CDialog::OnPaint();

CWnd *pWnd=GetDlgItem(IDC_SI); //IDC_SI为对话框上的一个静态控制
CDC *pDC=pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->ReleaseDC(pDC);

}
}

为何此时正常,在控制上能画一个黑矩形。而使用以下代码不行?
CDC *pDC=pWnd->GetDC();
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,10,10);
pWnd->Invalidate();
pWnd->UpdateWindow(); //把该两行放到画矩形后面
pWnd->ReleaseDC(pDC);

为何在第一种情况下,先发送WM_PAINT消息再作图反而正常。

而先作图再发送WM_PAINT消息反而不能正常显示?
实在想不明白,拜托各位指点一二
...全文
100 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
2000 2001-03-10
  • 打赏
  • 举报
回复
根据你的描述,合理的解释是这样的:
1、pctrlwnd->Invalidate() 导致该控件所在的矩形区域失效,注意,不仅对该控件来说如此,控件的父窗口(对话框)也标记该区域失效。
2、pctrlwnd->UpdateWindow()迫使该控件立即更新矩形区域的显示。
3、执行你的绘图代码。
4、因为在父窗口中标记为失效,所以父窗口的DC会更新该区域的显示(也就是你的绘图效果)。
而当顺序颠倒时,所有的语句都执行了,只不过你的绘图动作在前,然后又被控件的绘图动作所覆盖。
如果没有pctrlwnd->Invalidate(),父窗口得不到该区域的失效信息,对控件的任何绘图操作都反映不出来。在此情况下,你可以尝试调用父窗口的Invalidate(),看看结果如何?
我没试验过,所以不知道父窗口的Invalidate()会不会导致控件重画,如果是,那你将仍然看不到自己的绘图效果。
Nitty 2001-03-10
  • 打赏
  • 举报
回复
将上面的DC换成
CClientDC dc(this) ;
应可以搞定了!
coldice 2001-03-10
  • 打赏
  • 举报
回复
谢谢你的答复。

我确实需要闭馆修炼,我也明白是IDC_SI默认的WM_PAINT在作怪,

但象你所说的,把那两句注释掉,结果可不是你说的那样,而是仍画不上矩形的。你可试试。

那两句必须的需要,并且必须的在调用Rectangle前面才行。放到rectangle语句后面,则不行。还不搞不明白呀。
vcmfc 2001-03-10
  • 打赏
  • 举报
回复
盲点:当你的程序pWnd->Invalidate(); pWnd->UpdateWindow();后,你所做的改变又被你的IDC_SI的默认WM_PAINT消息处理程序又覆盖点了。如果你把以下语句注释掉:
//pWnd->Invalidate();
//pWnd->UpdateWindow();

此时应该能看到你做的改变。

老弟需要闭关修练呀!!!!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧