case WM_KEYDOWN:
        
    case WM_KEYUP:
        
    case WM_CHAR:
        
    case WM_DEADCHAR:
        
    case WM_SYSKEYDOWN:
        
    case WM_SYSKEYUP:
        
    case WM_SYSCHAR:
        
    case WM_SYSDEADCHAR:
        
                                   // Rearrange storage array
        
            for (i = cLinesMax - 1 ; i > 0 ; i--)
        
            {
        
                           pmsg[i] = pmsg[i - 1] ;
        
            }
        
                                   // Store new message
        
            pmsg[0].hwnd = hwnd ;
        
            pmsg[0].message = message ;
        
            pmsg[0].wParam = wParam ;
        
            pmsg[0].lParam = lParam ;
                    cLines = min (cLines + 1, cLinesMax) ;
        
                                   // Scroll up the display
        
            ScrollWindow (hwnd, 0, -cyChar, &rectScroll, &rectScroll) ;
        
            break ;               // i.e., call DefWindowProc so Sys messages work
        
    case WM_PAINT:
        
            hdc = BeginPaint (hwnd, &ps) ;
        
            SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
        
            SetBkMode (hdc, TRANSPARENT) ;
        
            TextOut (hdc, 0, 0, szTop, lstrlen (szTop)) ;
        
            TextOut (hdc, 0, 0, szUnd, lstrlen (szUnd)) ;
                    for (i = 0 ; i < min (cLines, cyClient / cyChar - 1) ; i++)
        
            {
        
                   iType =       pmsg[i].message == WM_CHAR ||
        
                                   pmsg[i].message == WM_SYSCHAR ||
        
                                   pmsg[i].message == WM_DEADCHAR ||
        
                                   pmsg[i].message == WM_SYSDEADCHAR ;
                           GetKeyNameText (pmsg[i].lParam, szKeyName,
        
                                          sizeof (szKeyName) / sizeof (TCHAR)) ;
                    TextOut (hdc, 0, (cyClient / cyChar - 1 - i) * cyChar, szBuffer,
        
            wsprintf (szBuffer, szFormat [iType],
        
            szMessage [pmsg[i].message - WM_KEYFIRST],
        
            pmsg[i].wParam,
        
            (PTSTR) (iType ? TEXT (" ") : szKeyName),
        
            (TCHAR) (iType ? pmsg[i].wParam : ' '),
        
            LOWORD (pmsg[i].lParam),
        
            HIWORD (pmsg[i].lParam) & 0xFF,
        
                           0x01000000 & pmsg[i].lParam ? szYes  : szNo,
        
                           0x20000000 & pmsg[i].lParam ? szYes  : szNo,
        
                           0x40000000 & pmsg[i].lParam ? szDown : szUp,
        
                           0x80000000 & pmsg[i].lParam ? szUp   : szDown)) ;
        
            }
        
            EndPaint (hwnd, &ps) ;
        
            return 0 ;
假如连续输入abc
window接到按键消息a 
然后传递给程序
然后存在 pmsg【0】;
然后调用WM_PAINT
window接到按键消息 b
然后传递给程序
然后存在 pmsg【0】;
然后调用WM_PAINTWM_PAINT()是不是每输入一个字符就会调用一次
还是先把输入的信息放在数组然后最后一次用WM_PAINT()
输出所有
        

解决方案 »

  1.   

    WM_PAINT 这个消息可是当 有窗体更新的时候都会触发的。也就是说如果调用了
     UpdateWindow or RedrawWindow 函数之后,会触发这个消息。。
    所以,是每次都触发了 WM_PAINT 消息。。
      

  2.   

    也就是说假如输入abc 会触发UpdateWindow or RedrawWindow 函数3次,所以就会调用WM_PAINT 3次??
      

  3.   

    如果调用了 
    UpdateWindow or RedrawWindow 函数之后,会触发WM_PAINT 这个消息。那么 
    for (i = cLinesMax - 1 ; i > 0 ; i--) 
            
                { 
            
                              pmsg[i] = pmsg[i - 1] ; 
            
                } 
    又会重新执行
    那么i 又= cLinesMax - 1
    那么每次数组里面只是有一个元素。a会是pmsg【0】; 
    b也是pmsg【0】; 同时他后面该没有元素的只有pmsg【0】; 这个元素