大家先看原文:  
 
本节介绍另一个绘制字符的函数DrawText(),表2-4给出了该函数的使用说明。  
 
  //  2-4-1.c  
  LRESULT  CALLBACK  WndProc(HWND  hwnd,  UINT  message,  WPARAM  wParam,  LPARAM  lParam)  
  {  
    HDC  hDC;  
    PAINTSTRUCT  ps;  
    RECT  rect;  
 
    switch(message)  
    {  
      case  WM_PAINT:  
        hDC  =  BeginPaint(hwnd,  &ps);  
        GetClientRect(hwnd,  &rect);  
        DrawText(hDC,  "Hello,  Welcome  to  Windows!",  -1,  
              &rect,  DT_SINGLELINE    ¦  DT_CENTER    ¦  DT_VCENTER);  
        EndPaint(hwnd,  &ps);  
        return  0L;  
 
      case  WM_DESTROY:  
        PostQuitMessage(0);  
        return  0L;  
    }  
    return  DefWindowProc(hwnd,  message,  wParam,  lParam);  
  }  
 
上面的程序有一个小问题,窗口对象每当收到WM_PAINT消息时都要调用函数GetClientRect()来获得用户区的大小。这样,对程序的效率有些影响,因为窗口对象在大多数情况下收到WM_PAINT消息时,用户区的大小(或说整个窗口的大小)并没有改变,例如,在窗口被对话框覆盖的情况下等。  
  每当窗口的大小发生变化时,Windows都要向窗口对象直接发送一条WM_SIZE消息(不通过应用程序的消息队列),消息的lParam参数的低位字中含有用户区的宽度,而高位字中含有用户区的高度,并使用设备单位(像素)表示(有关设备单位的内容在第三章介绍)。在Windows.h中定义的宏LOWORD和HIWORD可用来分离参数lParam的高位字和低位字。下面是使用WM_SIZE消息重新设计的程序。  
 
  //  2-4-2.c  
  LRESULT  CALLBACK  WndProc(HWND  hwnd,  UINT  message,  WPARAM  wParam,  LPARAM  lParam)  
  {  
    HDC  hDC;  
    PAINTSTRUCT  ps;  
    static  RECT  rect;  
 
    switch(message)  
    {  
      case  WM_SIZE:  
        rect.right  =  LOWORD(lParam);  
        rect.bottom  =  HIWORD(lParam);  
        return  0L;  
 
      case  WM_PAINT:  
        hDC  =  BeginPaint(hwnd,  &ps);  
        GetClientRect(hwnd,  &rect);  
        DrawText(hDC,  "Hello,  Welcome  to  Windows!",  -1,  
              &rect,  DT_SINGLELINE    ¦  DT_CENTER    ¦  DT_VCENTER);  
        EndPaint(hwnd,  &ps);  
        return  0L;  
 
      case  WM_DESTROY:  
        PostQuitMessage(0);  
        return  0L;  
    }  
    return  DefWindowProc(hwnd,  message,  wParam,  lParam);  
  }  
以上是书上的原文,我觉得重新设计的2-4-2.c程序还是有问题,  
GetClientRect(hwnd,  &rect)函数不是每当消息处理函数收到WM_PAINT消息后还是再次被调用,跟2-4-1.c中的不是一个样吗?还更加烦了!程序效率反而低了。我觉得因该把GetClientRect()放到上面WM_SIZE的分支下执行,当窗口大小改变后,用GetClientRect()来更新DrawText()中的&rect,我把程序改为下面:  
LRESULT  CALLBACK  WndProc(HWND  hwnd,  UINT  message,  WPARAM  wParam,  LPARAM  lParam)  
  {  
    HDC  hDC;  
    PAINTSTRUCT  ps;  
    static  RECT  rect;  
 
    switch(message)  
    {  
      case  WM_SIZE:  
        rect.right  =  LOWORD(lParam);  
        rect.bottom  =  HIWORD(lParam);  
        GetClientRect(hwnd,  &rect);  
        return  0L;  
 
      case  WM_PAINT:  
        hDC  =  BeginPaint(hwnd,  &ps);  
        DrawText(hDC,  "Hello,  Welcome  to  Windows!",  -1,  
              &rect,  DT_SINGLELINE    ¦  DT_CENTER    ¦  DT_VCENTER);  
        EndPaint(hwnd,  &ps);  
        return  0L;  
 
      case  WM_DESTROY:  
        PostQuitMessage(0);  
        return  0L;  
    }  
    return  DefWindowProc(hwnd,  message,  wParam,  lParam);  
  }  
 
请各位高手帮忙,我是刚入门的菜鸟,现在在学API,还有哪有下API大全的,最好是很详细的那种,我现在只看见函数名,都不知道函数在干些什么!特别是函数的参数是怎么传递的?