盲点:当你的程序pWnd->Invalidate(); pWnd->UpdateWindow();后,你所做的改变又被你的IDC_SI的默认WM_PAINT消息处理程序又覆盖点了。如果你把以下语句注释掉:
//pWnd->Invalidate(); 
//pWnd->UpdateWindow();此时应该能看到你做的改变。老弟需要闭关修练呀!!!!

解决方案 »

  1.   

    谢谢你的答复。我确实需要闭馆修炼,我也明白是IDC_SI默认的WM_PAINT在作怪,但象你所说的,把那两句注释掉,结果可不是你说的那样,而是仍画不上矩形的。你可试试。那两句必须的需要,并且必须的在调用Rectangle前面才行。放到rectangle语句后面,则不行。还不搞不明白呀。
      

  2.   

    将上面的DC换成
    CClientDC dc(this) ;
    应可以搞定了!
      

  3.   

    根据你的描述,合理的解释是这样的:
    1、pctrlwnd->Invalidate() 导致该控件所在的矩形区域失效,注意,不仅对该控件来说如此,控件的父窗口(对话框)也标记该区域失效。
    2、pctrlwnd->UpdateWindow()迫使该控件立即更新矩形区域的显示。
    3、执行你的绘图代码。
    4、因为在父窗口中标记为失效,所以父窗口的DC会更新该区域的显示(也就是你的绘图效果)。
    而当顺序颠倒时,所有的语句都执行了,只不过你的绘图动作在前,然后又被控件的绘图动作所覆盖。
    如果没有pctrlwnd->Invalidate(),父窗口得不到该区域的失效信息,对控件的任何绘图操作都反映不出来。在此情况下,你可以尝试调用父窗口的Invalidate(),看看结果如何?
    我没试验过,所以不知道父窗口的Invalidate()会不会导致控件重画,如果是,那你将仍然看不到自己的绘图效果。