我是这样想的:
Invalidate(hWnd, NULL, TRUE) 它是先用背景颜色把原来的图擦除掉,
然后发一个WM_PAINT消息,执行WM_PAINT下面的代码.
如果是InvalidateRect(hWnd, NULL, FALSE);它将不擦除原来的图而直接
发一个WM_PAINT消息,使之执行WM_PAINT下面的代码.
可是事实好像跟我想象有出入了.
我做了一个简单的试验,在WM_PAINT里让它画一条直线,
单击鼠标左键的时候,调用InvalidateRect(hWnd,NULL, TRUE) ;
结果是当单击鼠标左键的时候,直线看不见了.
在最小化再还原的时候,又看到了.
也就是说在InvalidatRect之后并没有执行WM_PAINT里面的代码,只是简单地擦除.这是怎么回事??
它们是怎么工作的??
是不是我的理解有误?
下面是主要的代码.我用的是VC6.的Aplication工程.
switch (message)
{
case WM_PAINT :
     hDC = GetDC(hWnd) ;
     MoveToEx(hDC, 0, 150, NULL) ;
     LineTo(hDC, 300, 150) ;
     ReleaseDC(hWnd, hDC) ;
     break ;
case WM_LBUTTONDOWN:
     InvalidateRect(hWnd, NULL, TRUE) ;
     break ;
case WM_DESTROY :
     PostQuitMessage (0) ;
     return 0 ;
}

解决方案 »

  1.   

    InvalidateRect函数要制定需要重画的范围(第二个参数),你没有指定,当然无法重画
      

  2.   

    case WM_PAINT :
         hDC = GetDC(hWnd) ;
         MoveToEx(hDC, 0, 150, NULL) ;
         LineTo(hDC, 300, 150) ;
         ReleaseDC(hWnd, hDC) ;
         break ;不要用getdc,用BeginPaint和EndPaint ,其余的地方没错
      

  3.   

    Invalidate,仅仅设置窗口的无效区域,然后当窗口没有其他消息而且有无效区域的时候,系统向该窗口发送wm_paint消息
    第三个参数为TRUE时,在WM_PAINT时调用BeginPaint的时候擦除背景
    在WM_PAINT的代码里面的应该由BeginPaint/EndPaint来得到DC,我猜可能使这个问题引起的,没有EndPaint的话,无效区域不会被清空,你试试看
      

  4.   

    我改用BeginPaint和EndPaint就可以了.
    但是用GetDC为什么不行呢??
    是因为GetDC不能清除无效区??
    还是因为在WM_PAINT时调用BeginPaint的时候擦除背景,
    用GetDC获得的DC无效吗??
      

  5.   

    我想Invalidate相当于给系统Post(不是Send)一个WM_PAINT消息
      

  6.   

    没有Invalidate不会给窗口Post或Send WM_PAINT消息