我才开始学习sdk,下面的一个程序不能输出文字,为什么??
麻烦各位大侠帮忙!!!
/*---------------------------------------------------------
   DEVCAPS1.C -- Device Capabilities Display Program No. 1
                 (c) Charles Petzold, 1998
  ---------------------------------------------------------*/#include <windows.h>#define NUMLINES ((int) (sizeof devcaps / sizeof devcaps [0]))struct
{
     int     iIndex ;
     TCHAR * szLabel ;
     TCHAR * szDesc ;
}
devcaps [] =
{
     HORZSIZE,      TEXT ("HORZSIZE"),     TEXT ("Width in millimeters:"),
0A     VERTSIZE,      TEXT ("VERTSIZE"),     TEXT ("Height in millimeters:"),
     HORZRES,       TEXT ("HORZRES"),      TEXT ("Width in pixels:"),
     VERTRES,       TEXT ("VERTRES"),      TEXT ("Height in raster lines:"),0D
     BITSPIXEL,     TEXT ("BITSPIXEL"),    TEXT ("Color bits per pixel:"),
0A     PLANES,        TEXT ("PLANES"),       TEXT ("Number of color planes:"),0D
     NUMBRUSHES,    TEXT ("NUMBRUSHES"),   TEXT ("Number of device brushes:"),
     NUMPENS,       TEXT ("NUMPENS"),      TEXT ("Number of device pens:"),
     NUMMARKERS,    TEXT ("NUMMARKERS"),   TEXT ("Number of device ers:"),
     NUMFONTS,      TEXT ("NUMFONTS"),     TEXT ("Number of device fonts:"),0D
     NUMCOLORS,     TEXT ("NUMCOLORS"),    TEXT ("Number of device colors:"),0D
     PDEVICESIZE,   TEXT ("PDEVICESIZE"),  TEXT ("Size of device structure:"),
     ASPECTX,       TEXT ("ASPECTX"),      TEXT ("Relative width of pixel:"),0D
     ASPECTY,       TEXT ("ASPECTY"),      TEXT ("Relative height of pixel:"),
     ASPECTXY,      TEXT ("ASPECTXY"),     TEXT ("Relative diagonal of pixel:"),
     LOGPIXELSX,    TEXT ("LOGPIXELSX"),   TEXT ("Horizontal dots per inch:"),
     LOGPIXELSY,    TEXT ("LOGPIXELSY"),   TEXT ("Vertical dots per inch:"),0D
     SIZEPALETTE,   TEXT ("SIZEPALETTE"),  TEXT ("Number of palette entries:"),
     NUMRESERVED,   TEXT ("NUMRESERVED"),  TEXT ("Reserved palette entries:"),
     COLORRES,      TEXT ("COLORRES"),     TEXT ("Actual color resolution:")0D
} ;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{......}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
0A{
     static int  cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
     TCHAR       szBuffer[10] ;
 int         i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd;
     HDC         hdc ;
     PAINTSTRUCT ps ;
     TEXTMETRIC  tm ;
 SCROLLINFO  si;
     
     switch (message)
     {
     case WM_CREATE:
          hdc = GetDC (hwnd) ;
          
          GetTextMetrics (hdc, &tm) ;
          cxChar = tm.tmAveCharWidth ;
          cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
          cyChar = tm.tmHeight + tm.tmExternalLeading ;
          
          ReleaseDC (hwnd, hdc) ;
          return 0 ;
 case WM_SIZE:
  cxClient=LOWORD(lParam);
  cyClient=HIWORD(lParam);
  
  si.cbSize=sizeof(si);
  si.fMask=SIF_RANGE|SIF_PAGE;
  si.nMin=0;
  si.nMax=NUMLINES-1;
  si.nPage=cyClient/cxClient;
  SetScrollInfo(hwnd,SB_VERT,26si,TRUE);
  si.cbSize=sizeof(si);
  si.fMask=SIF_RANGE|SIF_PAGE;
  si.nMin=0;
  si.nMax=2+iMaxWidth/cxClient;
  si.nPage=cxClient/cyClient;
  SetScrollInfo(hwnd,SB_HORZ,26si,TRUE);
  return 0; 
  
 case WM_HSCROLL:
 si.cbSize=sizeof(si);
 si.fMask =SIF_ALL;
 GetScrollInfo(hwnd,SB_HORZ,26si);
 iVertPos=si.nPos;
 switch(LOWORD(lParam))
 {
 case SB_LINELEFT: 
              si.nPos -= 1;
              break;
              
         // user clicked right arrow
         case SB_LINERIGHT: 0D
              si.nPos += 1;
              break;
              
         // user clicked shaft left of the scroll box
         case SB_PAGELEFT:
0A              si.nPos -= si.nPage;
              break;
              
         // user clicked shaft right of the scroll box
         case SB_PAGERIGHT:
              si.nPos += si.nPage;
              break;
              
         // user dragged the scroll box
         case SB_THUMBTRACK: 0D
              si.nPos = si.nTrackPos;
              break;
              
         default :
              break;
         }
 si.fMask = SIF_POS;
         SetScrollInfo (hwnd, SB_HORZ, &si, TRUE);
         GetScrollInfo (hwnd, SB_HORZ, &si);
         
         // If the position has changed, scroll the window 0D
         if (si.nPos != iHorzPos)
         {
          ScrollWindow(hwnd, cxChar * (iHorzPos - si.nPos), 0, NULL, NULL);
0A         }
         return 0;
 case WM_VSCROLL:
         // Get all the vertial scroll bar information
         si.cbSize = sizeof (si);
         si.fMask  = SIF_ALL;
         GetScrollInfo (hwnd, SB_VERT, &si);         // Save the position for comparison later on
         iVertPos = si.nPos;         switch (LOWORD (wParam))
         {
         // user clicked the HOME keyboard key
         case SB_TOP:
              si.nPos = si.nMin;
              break;
              
         // user clicked the END keyboard key
         case SB_BOTTOM:
              si.nPos = si.nMax;
              break;
              
         // user clicked the top arrow
         case SB_LINEUP:
              si.nPos -= 1;
              break;
              
         // user clicked the bottom arrow
         case SB_LINEDOWN:
0A              si.nPos += 1;
              break;
              
         // user clicked the shaft above the scroll box
0A         case SB_PAGEUP:
              si.nPos -= si.nPage;
              break;
              
         // user clicked the shaft below the scroll box
0A         case SB_PAGEDOWN:
0A              si.nPos += si.nPage;
              break;
              
         // user dragged the scroll box
         case SB_THUMBTRACK:0D
              si.nPos = si.nTrackPos;
              break;
              
         default:
              break; 
         }         // Set the position and then retrieve it.  Due to adjustments
         //   by Windows it may not be the same as the value set.
         si.fMask = SIF_POS;
         SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
         GetScrollInfo (hwnd, SB_VERT, &si);         // If the position has changed, scroll window and update it
         if (si.nPos != iVertPos)
         {                    
          ScrollWindow(hwnd, 0, cyChar * (iVertPos - si.nPos), NULL, NULL);
          UpdateWindow (hwnd);
         }
         return 0;          
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
  si.cbSize = sizeof (si);
          si.fMask  = SIF_POS;
          GetScrollInfo (hwnd, SB_VERT, &si);
          iVertPos = si.nPos;
  GetScrollInfo (hwnd,SB_HORZ,&si);
  iHorzPos=si.nPos;
  iPaintBeg =max (0, iVertPos + ps.rcPaint.top / cyChar);
0A          iPaintEnd = min (NUMLINES - 1, iVertPos + ps.rcPaint.bottom / cyChar);0D
         
          
          for (i = iPaintBeg; i < iPaintEnd ; i2B+)
          {
              x=cxClient*(1-iHorzPos);
  y=cyClient*(1-iVertPos);  TextOut (hdc, x, y,
                        devcaps[i].szLabel,
                        lstrlen (devcaps[i].szLabel)) ;
               
               TextOut (hdc, x+14 * cxCaps, y,
                        devcaps[i].szDesc,
                        lstrlen (devcaps[i].szDesc)) ;
               
               SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
               TextOut (hdc, x+14 * cxCaps + 35 * cxChar, y, szBuffer,
0A                        wsprintf (szBuffer, TEXT ("]"),
                             GetDeviceCaps (hdc, devcaps[i].iIndex))) ;
               
               SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
          }
          
          EndPaint (hwnd, &ps) ;

解决方案 »

  1.   

    我只是稍微修改了一下《windows程序设计》的第五章116页的程序,增加了滚动条,却出来不了文字,麻烦大家看一下!!
      

  2.   

    是英文
    一个也没出来
    我只是增加了滚动条
    case WM_VSCROLL:
    case WM_HSCROLL:
    修改了case WM_PAINT
    这些都是死东东,应该不会错啊
      

  3.   

    好象你没有刺激  WM_PAINT,设置几个断点看看
      

  4.   

    可是好像在进入消息循环时,windows会自动发送WM_PAINT
      

  5.   

    不是吧,会自动发出WM_CREATE,但WM_PAINT好象不行,设几个断点试试
      

  6.   

    F5,若弹出对话框,选"是",程序运行到断点处,应该停住,若在WM_PAINT没停住,则没有运行该语句
      

  7.   

    再F5,会继续运行至下一个断点.若你断点是在WM_PAINT行处,说明运行了消息,你现在可以在其他各个地方都设断点,看究竟是哪个语句没有运行;同时用此方法可以知道消息的运行机制.你慢慢摸索吧.我要下网了,若还不能解决,明天我会再来看看.《windows程序设计》我也回去再翻翻.BB
      

  8.   

    我得断点就是在WM_PAINT处
    可是到了那里就进行不下去了,按了f5运行一下,还是原处!!!
    真是麻烦你了!
      

  9.   

    我的意思是你可以多设几个断点,不是一个,或者将WM_PAINT中的所有语句都蛇为断点,看是哪一个语句没有运行;第一个WM_PAINT语句是在WinMain()中UpdateWindow()发出的,若是在窗口初始就要出现的内容,应该在这时就要调用相应语句
      

  10.   

    1、设断点跟踪看有没有执行WM_PAINT。
    2、监测变量,看是否写到你设定的范围内。
    不好意思,只是推断。
      

  11.   

    ps.rcPaint.bottom 在si.cbSize = sizeof (si);
    后变为0