我想在按a键时画个矩形,按b键时画个椭圆!    (屏幕上只有一个图形,两者不能同时存在)窗口过程这样写的:case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
return 0;case WM_CHAR:
switch(wParam)
{
case 'a':
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
DrawRect(hwnd);
break; case 'b':
InvalidateRect(hwnd,NULL,TRUE);
/*ValidateRect(hwnd,NULL);*/
UpdateWindow(hwnd);
DrawRound(hwnd);
break;
}
        return 0;请问大家调用InvalidateRect是会发送一个WM_PAINT消息,也就是用白色画刷覆盖客户区,并使之有效。
为什么我用ValidateRect后,画椭圆的时候矩形还在屏幕上呢?非要注释掉才可以?请大家帮帮我!!
不胜感激!

解决方案 »

  1.   

    还有为什么这样写再按a键后没反应呢?我知道这样的话WM_PAINT是最后处理
    case WM_CHAR:
        switch(wParam)
        {
        case 'a':
            InvalidateRect(hwnd,NULL,TRUE);
            DrawRect(hwnd);
            break;
      

  2.   

                    switch(wParam)
    {
    case 'a':
    {
       InvalidateRect(hWnd, NULL, TRUE);
       UpdateWindow(hWnd);
    hdc=GetWindowDC(hWnd);
       Rectangle(hdc, 100, 100, 200, 200);
    }
    break;
    case 'b':
    {
       InvalidateRect(hWnd, NULL, TRUE);
       UpdateWindow(hWnd);
       hdc=GetWindowDC(hWnd);
       Ellipse(hdc, 100, 100, 200, 200);
    }
    break;
    }
      

  3.   

    绘图的操作整理到WM_PAINT消息中
    在WM_PAINT中通过switch语句区分
    在键盘消息里设置绘图标识然后Invalidate