1、为何要free(pmsg)?在C语言中可没有这么做啊。而且,为什么要为窗口显式的行数分配内存呢?case WM_CREATE:
case WM_DISPLAYCHANGE:
// Allocate memory for display linesif (pmsg) //?????    free (pmsg) ;cLinesMax = cyClientMax / cyChar ;pmsg = malloc (cLinesMax * sizeof (MSG)) ;cLines = 0 ;// fall through2、下面的if语句似乎是多余的?此分支中message肯定是WM_SIZE啊。而且cyChar * (cyClient / cyChar) 不就是cyClient?case WM_SIZE:if (message == WM_SIZE){   cxClient = LOWORD (lParam) ;   cyClient = HIWORD (lParam) ;}// Calculate scrolling rectanglerectScroll.left       = 0 ;rectScroll.right      = cxClient ;rectScroll.top        = cyChar ;rectScroll.bottom     = cyChar * (cyClient / cyChar) ;3、下面的for循环语句没看懂他的作用。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坐等高手。

解决方案 »

  1.   

    1.pmsg不为零就先释放在重新分配,释放后赋值零;
    2。
    case WM_KEYDOWN:
    case WM_SIZE:if (message == WM_SIZE)
    这种情况就需要再判断了
    3。做了一个消息缓冲
      

  2.   

    // Rearrange storage array
    for (i = cLinesMax - 1 ; i > 0 ; i--)
    {
        pmsg[i] = pmsg[i - 1] ;
    }上面注释不是写的很清楚了,重排数组
    数组元素依次往后移动,腾出所有为0的元素。
      

  3.   

    第2个IF判断,在switch语句中,如果分支case后没有break或return等跳转的话它会继续执行下去,所以要再判断
      

  4.   

    第一个是:如果pmsg有值,就释放原有内存,并重新分配内存
    第二个是:一旦WM_SIZE消息,就重置cxClient 和cyClient 的数值,因为当触发WM_SIZE消息时候,这个lParam是变化的。所以需要不断更新,否则还是和原来窗口大小一样了。
    第三个是:把每一个消息都依次往后排,最后的那个丢弃。