home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / m / m003_1 / sb_bc.ddi / BC / CH6 / WMENU-2.DSK (.txt) < prev    next >
Encoding:
Turbo C Context File  |  1991-12-10  |  9.9 KB  |  307 lines

  1. Turbo C Context File 
  2. WMENU-2.DEF
  3. WMENU-2.C
  4. WMENU-2.RES
  5. *.DEF
  6. *.CPP
  7.  void *.c 
  8. HdumpWndProc
  9. RegisterClass
  10. CreateWindows
  11. CreateWindow
  12. CW_USEDEFAULT
  13. HANDLE
  14. hInst
  15. nMaxX
  16. nxMaxLen
  17. wndclass
  18. nMaxX
  19. *.CPP
  20. WMENU-1.RC
  21. WMENU-1.DEF
  22. *.RES
  23. *.DEF
  24. chdemo
  25. chself
  26. lndemo
  27. lnself
  28. D:\WINAPP\WNDPROC.C
  29. D:\WINAPP\WINAPP-2.C
  30. D:\WINAPP\WINAPP-1.C
  31. D:\WINAPP\WMENU-1.C
  32. D:\WINAPP\WINAPP-2.H
  33. D:\WINAPP\WMENU-1.RC
  34. D:\WINAPP\WMENU-1.C
  35. D:\WINAPP\WMENU-1.DEF
  36. D:\WINAPP\WMENU.RC
  37. D:\WINAPP\WMENU-1.C
  38. D:\WINAPP\WMENU-2.DEF
  39. D:\WINAPP\WINAPP-2.C
  40. D:\WINAPP\WMENU-2.C
  41. D:\WINAPP\WMENU-2.DEF
  42. D:\WINAPP\WMENU-2.C
  43. long FAR PASCAL AppWndProc (HWND hwnd,
  44.                 WORD message,
  45.                 WORD wParam,
  46.                 LONG lParam)
  47. { HDC hdc ;
  48.   TEXTMETRIC tm ;
  49.   PAINTSTRUCT ps ;
  50.   static short int cxChar, cyChar, cxCaps, nMaxX ;
  51.   static short int cxClient, cyClient ;
  52.   static short int nVScrollMax, nVScrollPos ;
  53.   static short int nHScrollMax, nHScrollPos ;
  54.   short int nVScrollInc, nHScrollInc ;
  55.   short int nBeginLine, nEndLine ;
  56.   short int i,x,y ;
  57.   switch (message)
  58.     { case WM_CREATE :
  59.        hdc = GetDC(hwnd) ;
  60.        GetTextMetrics(hdc,&tm) ;
  61.        cxChar = tm.tmAveCharWidth ;
  62.        cyChar = tm.tmHeight + tm.tmExternalLeading ;
  63.        cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) *cxChar / 2 ;
  64.        ReleaseDC(hwnd,hdc) ;
  65.        nMaxX = 20 * cxCaps + 45 * cxChar ;
  66.        break ;
  67.       case WM_SIZE :
  68.        cxClient = LOWORD(lParam) ;
  69.        cyClient = HIWORD(lParam) ;
  70.        nVScrollMax = max(0, NUMLINE+2-cyClient/cyChar) ;
  71.        nVScrollPos = min(nVScrollMax,nVScrollPos) ;
  72.        SetScrollRange(hwnd, SB_VERT, 0, nVScrollMax, FALSE) ;
  73.        SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE) ;
  74.        nHScrollMax = max(0, (nMaxX-cxClient)/cxChar+2) ;
  75.        nHScrollPos = min(nHScrollMax,nHScrollPos) ;
  76.        SetScrollRange(hwnd, SB_HORZ, 0, nHScrollMax, FALSE) ;
  77.        SetScrollPos(hwnd, SB_HORZ, nHScrollPos, TRUE) ;
  78.        break ;
  79.       case WM_VSCROLL :
  80.        switch (wParam)
  81.          { case SB_TOP :
  82.             nVScrollInc = -nVScrollPos ;
  83.             break ;
  84.            case SB_BOTTOM :
  85.             nVScrollInc = nVScrollMax-nVScrollPos ;
  86.             break ;
  87.            case SB_LINEUP :
  88.             nVScrollInc = -1 ;
  89.             break ;
  90.            case SB_LINEDOWN :
  91.             nVScrollInc = 1 ;
  92.             break ;
  93.            case SB_PAGEUP :
  94.             nVScrollInc = min(-1,-cyClient/cyChar) ;
  95.             break ;
  96.            case SB_PAGEDOWN :
  97.             nVScrollInc = max(1,cyClient/cyChar) ;
  98.             break ;
  99.            case SB_THUMBTRACK :
  100.             nVScrollInc = LOWORD(lParam)-nVScrollPos ;
  101.             break ;
  102.            default :
  103.             nVScrollInc = 0 ;
  104.             break ;
  105.          }
  106.        nVScrollInc = min(nVScrollInc ,nVScrollMax-nVScrollPos) ;
  107.        nVScrollInc = max(nVScrollInc ,-nVScrollPos) ;
  108.        if (nVScrollInc)
  109.           { nVScrollPos += nVScrollInc ;
  110.         ScrollWindow(hwnd,0,-cyChar*nVScrollInc,NULL,NULL) ;
  111.         SetScrollPos(hwnd,SB_VERT,nVScrollPos,TRUE) ;
  112.         UpdateWindow(hwnd) ;
  113.           }
  114.        break ;
  115.       case WM_HSCROLL :
  116.        switch (wParam)
  117.          { case SB_TOP :
  118.             nHScrollInc = -nHScrollPos ;
  119.             break ;
  120.            case SB_BOTTOM :
  121.             nHScrollInc = nHScrollMax-nHScrollPos ;
  122.             break ;
  123.            case SB_LINEUP :
  124.             nHScrollInc = -1 ;
  125.             break ;
  126.            case SB_LINEDOWN :
  127.             nHScrollInc = 1 ;
  128.             break ;
  129.            case SB_PAGEUP :
  130.             nHScrollInc = min(-1,-cxClient/cxChar) ;
  131.             break ;
  132.            case SB_PAGEDOWN :
  133.             nHScrollInc = max(1,cxClient/cxChar) ;
  134.             break ;
  135.            case SB_THUMBTRACK :
  136.             nHScrollInc = LOWORD(lParam)-nHScrollPos ;
  137.             break ;
  138.            default :
  139.             nHScrollInc = 0 ;
  140.             break ;
  141.          }
  142.        nHScrollInc = min(nHScrollInc ,nHScrollMax-nHScrollPos) ;
  143.        nHScrollInc = max(nHScrollInc ,-nHScrollPos) ;
  144.        if (nHScrollInc)
  145.           { nHScrollPos += nHScrollInc ;
  146.         ScrollWindow(hwnd,-cxChar*nHScrollInc,0,NULL,NULL) ;
  147.         SetScrollPos(hwnd,SB_HORZ,nHScrollPos,TRUE) ;
  148.         UpdateWindow(hwnd) ;
  149.           }
  150.        break ;
  151.       case WM_PAINT :
  152.        hdc = BeginPaint(hwnd, &ps) ;
  153.        nBeginLine = max(0,nVScrollPos+ps.rcPaint.top/cyChar-1) ;
  154.        nEndLine = min(NUMLINE,
  155.               nVScrollPos+ps.rcPaint.bottom/cyChar) ;
  156.        for (i=nBeginLine ; i<nEndLine ; i++)
  157.          { x = cxChar * (1-nHScrollPos) ;
  158.            y = cyChar * (1-nVScrollPos+i) ;
  159.            TextOut(hdc, x, y,
  160.                WinStruct[i].szStruct,
  161.                lstrlen(WinStruct[i].szStruct)) ;
  162.            TextOut(hdc, x+20*cxCaps, y,
  163.                WinStruct[i].szDescriptor,
  164.                lstrlen(WinStruct[i].szDescriptor)) ;
  165.          }
  166.        EndPaint(hwnd, &ps) ;
  167.        break ;
  168.       case WM_DESTROY :
  169.        PostQuitMessage(0) ;
  170.        break ;
  171.       default :
  172.        return DefWindowProc(hwnd, message, wParam, lParam) ;
  173.     }
  174.   return 0 ;
  175. long FAR PASCAL AppWndProc (HWND hwnd,
  176.                 WORD message,
  177.                 WORD wParam,
  178.                 LONG lParam)
  179. { HDC hdc ;
  180.   TEXTMETRIC tm ;
  181.   PAINTSTRUCT ps ;
  182.   static short int cxChar, cyChar, cxCaps, nMaxX ;
  183.   static short int cxClient, cyClient ;
  184.   static short int nVScrollMax, nVScrollPos ;
  185.   static short int nHScrollMax, nHScrollPos ;
  186.   short int nVScrollInc, nHScrollInc ;
  187.   short int nBeginLine, nEndLine ;
  188.   short int i,x,y ;
  189.   switch (message)
  190.     { case WM_CREATE :
  191.        hdc = GetDC(hwnd) ;
  192.        GetTextMetrics(hdc,&tm) ;
  193.        cxChar = tm.tmAveCharWidth ;
  194.        cyChar = tm.tmHeight + tm.tmExternalLeading ;
  195.        cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) *cxChar / 2 ;
  196.        ReleaseDC(hwnd,hdc) ;
  197.        nMaxX = 20 * cxCaps + 45 * cxChar ;
  198.        break ;
  199.       case WM_SIZE :
  200.        cxClient = LOWORD(lParam) ;
  201.        cyClient = HIWORD(lParam) ;
  202.        nVScrollMax = max(0, NUMLINE+2-cyClient/cyChar) ;
  203.        nVScrollPos = min(nVScrollMax,nVScrollPos) ;
  204.        SetScrollRange(hwnd, SB_VERT, 0, nVScrollMax, FALSE) ;
  205.        SetScrollPos(hwnd, SB_VERT, nVScrollPos, TRUE) ;
  206.        nHScrollMax = max(0, (nMaxX-cxClient)/cxChar+2) ;
  207.        nHScrollPos = min(nHScrollMax,nHScrollPos) ;
  208.        SetScrollRange(hwnd, SB_HORZ, 0, nHScrollMax, FALSE) ;
  209.        SetScrollPos(hwnd, SB_HORZ, nHScrollPos, TRUE) ;
  210.        break ;
  211.       case WM_VSCROLL :
  212.        switch (wParam)
  213.          { case SB_TOP :
  214.             nVScrollInc = -nVScrollPos ;
  215.             break ;
  216.            case SB_BOTTOM :
  217.             nVScrollInc = nVScrollMax-nVScrollPos ;
  218.             break ;
  219.            case SB_LINEUP :
  220.             nVScrollInc = -1 ;
  221.             break ;
  222.            case SB_LINEDOWN :
  223.             nVScrollInc = 1 ;
  224.             break ;
  225.            case SB_PAGEUP :
  226.             nVScrollInc = min(-1,-cyClient/cyChar) ;
  227.             break ;
  228.            case SB_PAGEDOWN :
  229.             nVScrollInc = max(1,cyClient/cyChar) ;
  230.             break ;
  231.            case SB_THUMBTRACK :
  232.             nVScrollInc = LOWORD(lParam)-nVScrollPos ;
  233.             break ;
  234.            default :
  235.             nVScrollInc = 0 ;
  236.             break ;
  237.          }
  238.        nVScrollInc = min(nVScrollInc ,nVScrollMax-nVScrollPos) ;
  239.        nVScrollInc = max(nVScrollInc ,-nVScrollPos) ;
  240.        if (nVScrollInc)
  241.           { nVScrollPos += nVScrollInc ;
  242.         ScrollWindow(hwnd,0,-cyChar*nVScrollInc,NULL,NULL) ;
  243.         SetScrollPos(hwnd,SB_VERT,nVScrollPos,TRUE) ;
  244.         UpdateWindow(hwnd) ;
  245.           }
  246.        break ;
  247.       case WM_HSCROLL :
  248.        switch (wParam)
  249.          { case SB_TOP :
  250.             nHScrollInc = -nHScrollPos ;
  251.             break ;
  252.            case SB_BOTTOM :
  253.             nHScrollInc = nHScrollMax-nHScrollPos ;
  254.             break ;
  255.            case SB_LINEUP :
  256.             nHScrollInc = -1 ;
  257.             break ;
  258.            case SB_LINEDOWN :
  259.             nHScrollInc = 1 ;
  260.             break ;
  261.            case SB_PAGEUP :
  262.             nHScrollInc = min(-1,-cxClient/cxChar) ;
  263.             break ;
  264.            case SB_PAGEDOWN :
  265.             nHScrollInc = max(1,cxClient/cxChar) ;
  266.             break ;
  267.            case SB_THUMBTRACK :
  268.             nHScrollInc = LOWORD(lParam)-nHScrollPos ;
  269.             break ;
  270.            default :
  271.             nHScrollInc = 0 ;
  272.             break ;
  273.          }
  274.        nHScrollInc = min(nHScrollInc ,nHScrollMax-nHScrollPos) ;
  275.        nHScrollInc = max(nHScrollInc ,-nHScrollPos) ;
  276.        if (nHScrollInc)
  277.           { nHScrollPos += nHScrollInc ;
  278.         ScrollWindow(hwnd,-cxChar*nHScrollInc,0,NULL,NULL) ;
  279.         SetScrollPos(hwnd,SB_HORZ,nHScrollPos,TRUE) ;
  280.         UpdateWindow(hwnd) ;
  281.           }
  282.        break ;
  283.       case WM_PAINT :
  284.        hdc = BeginPaint(hwnd, &ps) ;
  285.        nBeginLine = max(0,nVScrollPos+ps.rcPaint.top/cyChar-1) ;
  286.        nEndLine = min(NUMLINE,
  287.               nVScrollPos+ps.rcPaint.bottom/cyChar) ;
  288.        for (i=nBeginLine ; i<nEndLine ; i++)
  289.          { x = cxChar * (1-nHScrollPos) ;
  290.            y = cyChar * (1-nVScrollPos+i) ;
  291.            TextOut(hdc, x, y,
  292.                WinStruct[i].szStruct,
  293.                lstrlen(WinStruct[i].szStruct)) ;
  294.            TextOut(hdc, x+20*cxCaps, y,
  295.                WinStruct[i].szDescriptor,
  296.                lstrlen(WinStruct[i].szDescriptor)) ;
  297.          }
  298.        EndPaint(hwnd, &ps) ;
  299.        break ;
  300.       case WM_DESTROY :
  301.        PostQuitMessage(0) ;
  302.        break ;
  303.       default :
  304.        return DefWindowProc(hwnd, message, wParam, lParam) ;
  305.     }
  306.   return 0 ;
  307.