home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / graphics / getpixel.c < prev    next >
Text File  |  1988-08-10  |  11KB  |  364 lines

  1. /*
  2.  
  3. Function(s) demonstrated in this program: ChildWindowFromPoint
  4.  
  5. Windows version:  2.03
  6.  
  7. Windows SDK version:  2.00
  8.  
  9. Compiler version:  C 5.10
  10.  
  11. Description:  This function retrieves the RGB color value of the pixel at
  12.    the point specified by the X and Y parameters.  If the point is not in
  13.    the clipping region, the function is ignored.
  14.  
  15. Additional Comments:  This program also illustrates the subclassing of 
  16.     windows.
  17.  
  18. */
  19.  
  20. #define NOMINMAX
  21. #include <stdlib.h>
  22. #include <windows.h>
  23. #include "GetPixel.h"
  24. #include "string.h"
  25. #include "stdio.h"
  26.  
  27.        char         szAppName             [] = "GetPixel"          ;
  28.        HANDLE       hInstMain                                      ;
  29.        HWND         hWndMain                                       ;
  30.        char         szOutputBuffer1       [70]                     ;
  31.        char         szOutputBuffer2       [500]                    ;
  32.        HBITMAP      hBitmapHelp                                    ;
  33.  
  34.        HWND         hWndChild1, hWndChild2, hX, hY, hOK2;
  35.        FARPROC      lpProcEnterPoint;
  36.        FARPROC      lpProcNewEnterPoint;
  37.        FARPROC      lpProcOldX;
  38.        FARPROC      lpProcOldY;
  39.        char         szXValue [40];
  40.        char         szYValue [40];
  41.  
  42.  
  43. /****************************************************************************/
  44. /************************    Message Structure      *************************/
  45. /****************************************************************************/
  46.  
  47. struct { char *szMessage; }
  48.        Messages [] = {
  49. "About",
  50. "     Sample Application to demonstrate the use of\n\
  51. the GetPixel Windows function.",
  52.  
  53. "Help Message",
  54. "     Select a pixel, and the program will use the\n\
  55. GetPixel Windows function to display the attributes\n\
  56. of that pixel; ffff = White, 0 = Black.  Select a\n\
  57. pixel by clicking the left mouse button, entering\n\
  58. the pixel coordinates through the keyboard, or let\n\
  59. the computer choose random pixel coordinates."
  60. };    
  61.  
  62. /****************************************************************************/
  63.  
  64. void ProcessMessage (HWND, int); 
  65.  
  66. void ProcessMessage (hWnd, MessageNumber) 
  67.      HWND     hWnd;
  68.      int      MessageNumber;
  69. {
  70.      sprintf (szOutputBuffer1, "%s", Messages [MessageNumber]);
  71.      sprintf (szOutputBuffer2, "%s", Messages [MessageNumber + 1]);
  72.      MessageBox (hWnd, szOutputBuffer2, szOutputBuffer1, MB_OK);
  73. }       
  74.  
  75. /****************************************************************************/
  76.  
  77. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  78.     HANDLE    hInstance, hPrevInstance;
  79.     LPSTR    lpszCmdLine;
  80.     int     nCmdShow;
  81.     {
  82.     HWND    hWnd;
  83.     MSG     msg;
  84.     WNDCLASS    wndclass;
  85.     HMENU    hMenu;
  86.     short   xScreen, yScreen;
  87.  
  88.  
  89.     if (!hPrevInstance)
  90.     {
  91.     wndclass.style             = CS_HREDRAW | CS_VREDRAW | CS_SAVEBITS;
  92.     wndclass.lpfnWndProc    = WndProc;
  93.     wndclass.cbClsExtra     = 0;
  94.     wndclass.cbWndExtra     = 0;
  95.     wndclass.hInstance      = hInstance;
  96.     wndclass.hIcon             = NULL; 
  97.    wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
  98.     wndclass.hbrBackground    = GetStockObject (WHITE_BRUSH);
  99.     wndclass.lpszMenuName    = szAppName;
  100.     wndclass.lpszClassName    = szAppName;
  101.  
  102.     if (!RegisterClass (&wndclass) )
  103.         return FALSE;
  104.     }
  105.  
  106.      xScreen = GetSystemMetrics (SM_CXSCREEN);
  107.     yScreen = GetSystemMetrics (SM_CYSCREEN);
  108.  
  109.     hWnd = CreateWindow (szAppName, "GetPixel",
  110.            WS_OVERLAPPEDWINDOW, xScreen / 7, yScreen / 58,
  111.            xScreen * 3 / 4, yScreen * 49 / 50, NULL, NULL,
  112.            hInstance, NULL);
  113.  
  114.     hInstMain = hInstance;
  115.     hWndMain  = hWnd;
  116.  
  117.     ShowWindow (hWnd, nCmdShow);
  118.     UpdateWindow (hWnd);
  119.  
  120.     lpProcEnterPoint    = MakeProcInstance (EnterPointDlgProc, hInstance);
  121.     lpProcNewEnterPoint = MakeProcInstance (NewEnterPointDlgProc,hInstance);
  122.  
  123.  
  124.     while (GetMessage (&msg, NULL, 0, 0))
  125.         {
  126.         TranslateMessage (&msg);
  127.         DispatchMessage (&msg);
  128.         }
  129.  
  130.     DeleteObject (hBitmapHelp);
  131.  
  132.     return msg.wParam;
  133. }
  134. /****************************************************************************/
  135.  
  136. long FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam)
  137.    HWND      hWnd;
  138.    unsigned  iMessage;
  139.    WORD      wParam;
  140.    LONG      lParam;
  141.    {
  142.    int           Index;
  143.    HANDLE        hDC;
  144.    HDC           hMemoryDC;
  145.    BITMAP        Bitmap;
  146.     short         foo;
  147.  
  148.    HMENU         hMenu;
  149.    PAINTSTRUCT   ps;
  150.    POINT         pt;
  151.    static int    xClient, yClient;
  152.    static int    xDevisor, yDevisor, randNum;
  153.    DWORD         Attribute;
  154.  
  155.  
  156.    switch (iMessage)
  157.        {
  158.        case WM_CREATE:
  159.             hMenu = GetSystemMenu (hWnd, FALSE);
  160.  
  161.             ChangeMenu (hMenu, NULL, "&About", IDM_ABOUT, 
  162.                         MF_APPEND | MF_STRING);
  163.             break;
  164.  
  165.        case WM_SIZE:
  166.             xClient = LOWORD (lParam);
  167.             yClient = HIWORD (lParam);
  168.  
  169.             hDC = GetDC(hWnd);
  170.  
  171.             hMemoryDC = CreateCompatibleDC(hDC);
  172.             hBitmapHelp = LoadBitmap (hInstMain, "BitmapHelp");
  173.             GetObject(hBitmapHelp, 16, (LPSTR) &Bitmap);
  174.             SelectObject(hMemoryDC, hBitmapHelp);
  175.             foo = GetStretchBltMode (hDC);
  176.  
  177.             SetStretchBltMode(hDC, BLACKONWHITE);
  178.             StretchBlt(hDC, 0, 0, LOWORD (lParam), HIWORD (lParam),
  179.                 hMemoryDC, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
  180.  
  181.             SetStretchBltMode(hDC, foo);
  182.             DeleteObject (hBitmapHelp);
  183.                 DeleteDC(hMemoryDC);
  184.             ReleaseDC(hWnd, hDC);
  185.  
  186.             break;
  187.  
  188.        case WM_LBUTTONDOWN:
  189.             pt = MAKEPOINT (lParam) ;
  190.             hDC = GetDC (hWnd);
  191.             Attribute = GetPixel (hDC, pt.x, pt.y);
  192.             sprintf (szOutputBuffer1, "The Point [%i, %i]", pt.x, pt.y);
  193.             sprintf (szOutputBuffer2, "Has Attribute %x", Attribute);
  194.             MessageBox (hWnd, szOutputBuffer2, szOutputBuffer1,MB_OK);
  195.             ReleaseDC(hWnd, hDC);
  196.             break;
  197.  
  198.  
  199.        case WM_SYSCOMMAND:
  200.             switch (wParam) {
  201.                case IDM_ABOUT:
  202.                     ProcessMessage (hWnd, 0);
  203.                     break;
  204.                default:
  205.                     return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
  206.             }
  207.             break;
  208.  
  209.  
  210.        case WM_COMMAND:
  211.             switch (wParam) {
  212.                case IDM_RANDOM:
  213.                     pt.x = pt.y = -1;
  214.                     while (((pt.x < 0) || (pt.x > xClient)) || ((pt.y < 0) || 
  215.                             (pt.y > yClient))) {
  216.                        pt.x = (rand () / 47);
  217.                        pt.y = (rand () / 102);
  218.                     }
  219.                     hDC = GetDC (hWnd);
  220.                     Attribute = GetPixel (hDC, pt.x, pt.y);
  221.                     sprintf (szOutputBuffer1, "The Point [%i, %i]", pt.x, pt.y);
  222.                     sprintf (szOutputBuffer2, "Has Attribute %x", Attribute);
  223.                     MessageBox (hWnd, szOutputBuffer2, szOutputBuffer1,MB_OK);
  224.                     ReleaseDC(hWnd, hDC);
  225.                     break;
  226.  
  227.                case IDM_ENTER:
  228.                     pt.x = pt.y = -1;
  229.                     while (((pt.x < 0) || (pt.x > xClient)) || ((pt.y < 0) || 
  230.                             (pt.y > yClient))) {
  231.                       DialogBox (hInstMain, (LPSTR)"EnterPointDlg", hWnd, 
  232.                              lpProcEnterPoint);
  233.                       pt.x = atoi (szXValue);
  234.                       pt.y = atoi (szYValue);                      
  235.                     }                      
  236.                     hDC = GetDC (hWnd);
  237.                     Attribute = GetPixel (hDC, pt.x, pt.y);
  238.                     sprintf (szOutputBuffer1, "The Point [%i, %i]", pt.x, pt.y);
  239.                     sprintf (szOutputBuffer2, "Has Attribute %x", Attribute);
  240.                     MessageBox (hWnd, szOutputBuffer2, szOutputBuffer1,MB_OK);
  241.                     ReleaseDC(hWnd, hDC);
  242.                     break;
  243.  
  244.                case IDM_HELP:
  245.                     ProcessMessage (hWnd, 2);
  246.                     break;
  247.  
  248.              }
  249.             break;
  250.  
  251.        case WM_DESTROY:
  252.             PostQuitMessage (0);
  253.             break;
  254.  
  255.         default:
  256.             return DefWindowProc( hWnd, iMessage, wParam, lParam );
  257.        }
  258.     return 0L;
  259. }
  260.  
  261. /****************************************************************************/
  262.  
  263. BOOL FAR PASCAL EnterPointDlgProc (hDlg, iMessage, wParam, lParam)
  264. HWND hDlg;
  265. unsigned iMessage;
  266. WORD wParam;
  267. LONG lParam;
  268. {
  269.      int Index;
  270.      char szChange [10];
  271.      long lReturn;
  272.  
  273.      switch (iMessage) {
  274.      case WM_INITDIALOG:
  275.        SendDlgItemMessage (hDlg, IDD_X, EM_LIMITTEXT,
  276.                            (WORD)40, 0L);
  277.        SendDlgItemMessage (hDlg, IDD_Y, EM_LIMITTEXT,
  278.                            (WORD)40, 0L);
  279.  
  280.        hX = GetDlgItem (hDlg, IDD_X);
  281.          lpProcOldX = (FARPROC) GetWindowLong (hX, GWL_WNDPROC);
  282.          SetWindowLong (hX, GWL_WNDPROC, (LONG) lpProcNewEnterPoint);
  283.          SendMessage (hX, EM_SETSEL, 0, MAKELONG (0,32767));
  284.        hY = GetDlgItem (hDlg, IDD_Y);
  285.          lpProcOldY = (FARPROC) GetWindowLong (hY, GWL_WNDPROC);
  286.          SetWindowLong (hY, GWL_WNDPROC, (LONG) lpProcNewEnterPoint);
  287.          SendMessage (hY, EM_SETSEL, 0, MAKELONG (0,32767));
  288.        hOK2 = GetDlgItem (hDlg, IDOK);
  289.      
  290.        return TRUE;
  291.        break;
  292.  
  293.      case WM_COMMAND:
  294.        switch (wParam) {
  295.          case IDD_X:
  296.               break;
  297.  
  298.          case IDD_Y:
  299.               break;
  300.          
  301.          case IDOK:            
  302.               GetDlgItemText (hDlg, IDD_X, szXValue, 10) ;
  303.               GetDlgItemText (hDlg, IDD_Y, szYValue, 10) ;
  304.               EndDialog (hDlg, TRUE);
  305.               break;
  306.  
  307.          default:
  308.               return FALSE;
  309.       }
  310.     default:
  311.       return FALSE;
  312.   }
  313.   return TRUE;
  314. }
  315.  
  316. /****************************************************************************/
  317.  
  318. BOOL FAR PASCAL NewEnterPointDlgProc  (hWnd, iMessage, wParam, lParam) 
  319.      HWND     hWnd;
  320.      unsigned iMessage; 
  321.      WORD     wParam;
  322.      LONG     lParam;
  323. {
  324.      switch (iMessage) {
  325.        case WM_GETDLGCODE:
  326.             return (DLGC_WANTALLKEYS);
  327.  
  328.        case WM_CHAR:
  329.             if ((wParam == VK_TAB) || (wParam == VK_RETURN)) {
  330.                 SendMessage (hWndMain, WM_USER, 0, 0L);
  331.                 SetFocus (FindNextWindow (hWnd));
  332.                 return TRUE;
  333.             }
  334.             else {
  335.               if (hWnd == hX) 
  336.                 return ((BOOL)CallWindowProc (lpProcOldX, hWnd, 
  337.                         iMessage, wParam, lParam));
  338.               if (hWnd == hY) 
  339.                 return ((BOOL)CallWindowProc (lpProcOldY, hWnd, 
  340.                         iMessage, wParam, lParam));
  341.             }
  342.             break;
  343.  
  344.        default:
  345.          if (hWnd == hX)
  346.             return ((BOOL)CallWindowProc (lpProcOldX, hWnd,
  347.                     iMessage, wParam, lParam));
  348.          if (hWnd == hY)
  349.             return ((BOOL)CallWindowProc (lpProcOldY, hWnd, 
  350.                     iMessage, wParam, lParam));
  351.      }
  352. }
  353.  
  354. /****************************************************************************/
  355.  
  356. HWND FindNextWindow (hWnd)
  357.      HWND   hWnd;
  358. {
  359.      if (hWnd == hX)      return hY;
  360.      if (hWnd == hY)      return hOK2;
  361.      return NULL;
  362. }
  363.  
  364.