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坐等高手。
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坐等高手。
2。
case WM_KEYDOWN:
case WM_SIZE:if (message == WM_SIZE)
这种情况就需要再判断了
3。做了一个消息缓冲
for (i = cLinesMax - 1 ; i > 0 ; i--)
{
pmsg[i] = pmsg[i - 1] ;
}上面注释不是写的很清楚了,重排数组
数组元素依次往后移动,腾出所有为0的元素。
第二个是:一旦WM_SIZE消息,就重置cxClient 和cyClient 的数值,因为当触发WM_SIZE消息时候,这个lParam是变化的。所以需要不断更新,否则还是和原来窗口大小一样了。
第三个是:把每一个消息都依次往后排,最后的那个丢弃。