home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / apps / property.c < prev    next >
C/C++ Source or Header  |  1988-08-10  |  6KB  |  209 lines

  1. /*
  2.  
  3. Function(s) demonstrated in this program: SetProp, GetProp, RemoveProp
  4.  
  5. Description:
  6.  
  7. This program demonstrates the use of the function SetProp, GetProp,
  8. and RemoveProp.  SetProp copies the character string and a data handle
  9. to the property list of the window.  This has the effect of
  10. associating a data object with the window.  The string serves as a
  11. label for the data handle.  The data handle is retrieved from the
  12. property list using the GetProp function and specifying the character
  13. string.  Before the window is destroyed the RemoveProp function must
  14. be used  to remove the single entry in the property list.  Note that there
  15. may be more than one data items associated with a window in the property
  16. list.
  17.  
  18. */
  19.  
  20. #include <windows.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include "property.h"
  24.  
  25. VOID FAR PASCAL lstrcpy(LPSTR, LPSTR);
  26. long    FAR PASCAL WndProc(HWND, unsigned, WORD, long);
  27.  
  28. /* This is the structure that is used to put into the property list. */
  29. typedef struct tagData {
  30.   short    nRow, nSeat;
  31.   char    szName[20];
  32. } SEATINGS;
  33. static char    szResName [] = "ResMenu";
  34.  
  35. int    PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  36. HANDLE      hInstance, hPrevInstance ;
  37. LPSTR       lpszCmdLine ;
  38. int    nCmdShow ;
  39. {
  40.   static char    szAppName [] = "Property" ;
  41.   HWND        hWnd ;
  42.   WNDCLASS    wndclass ;
  43.   MSG msg;
  44.  
  45.   if (!hPrevInstance)
  46.   {
  47.     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  48.     wndclass.lpfnWndProc   = WndProc ;
  49.     wndclass.cbClsExtra    = 0 ;
  50.     wndclass.cbWndExtra    = 0 ;
  51.     wndclass.hInstance     = hInstance ;
  52.     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  53.     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  54.     wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  55.     wndclass.lpszMenuName  = NULL ;
  56.     wndclass.lpszClassName = szAppName ;
  57.  
  58.     if (!RegisterClass (&wndclass))
  59.       return FALSE ;
  60.   }
  61.  
  62.   hWnd = CreateWindow(szAppName, (LPSTR)"Setting the Property List",
  63.       WS_OVERLAPPEDWINDOW,
  64.       CW_USEDEFAULT, 0,                  
  65.       CW_USEDEFAULT, 0,                  
  66.       NULL, NULL, hInstance, NULL) ;
  67.  
  68.   ShowWindow (hWnd, nCmdShow) ;
  69.   UpdateWindow (hWnd) ;
  70.  
  71.   while (GetMessage(&msg, NULL, 0, 0))
  72.   {
  73.     TranslateMessage(&msg);
  74.     DispatchMessage(&msg);
  75.   }
  76.   return (msg.wParam) ;
  77. }
  78.  
  79.  
  80. long    FAR PASCAL WndProc (hWnd, iMessage, wParam, lParam)
  81. HWND     hWnd ;
  82. unsigned    iMessage ;
  83. WORD     wParam ;
  84. LONG     lParam ;
  85. {
  86.   static HANDLE hInstance;
  87.   HANDLE hData;
  88.   HMENU hMenu;
  89.   char    szbuffer[200], szName[20];
  90.   short    nRow, nSeat;
  91.   SEATINGS FAR * pstrSeatings;
  92.   switch (iMessage)
  93.   {
  94.   case WM_CREATE:
  95.     {
  96.       hInstance = GetWindowWord(hWnd, GWW_HINSTANCE);
  97.       hMenu = LoadMenu(hInstance, "ResMenu");
  98.       SetMenu(hWnd, hMenu);
  99.       DrawMenuBar(hWnd);
  100.       break;
  101.     }
  102.   case WM_COMMAND:
  103.     {
  104.       switch (wParam)
  105.       {
  106.       case IDM_EXECUTE:
  107.     {
  108. /* Putting the structure into the property list of the window 
  109.  * If it is successful, retrieve it to check if the correct structure
  110.  * is put into the property list
  111.  */
  112.       hData = GlobalAlloc(GMEM_MOVEABLE, (LONG)sizeof(SEATINGS));
  113.  
  114.  
  115. /* Initialize the data structure to be associated with the window */
  116.  
  117.       pstrSeatings = (SEATINGS FAR * )GlobalLock(hData);
  118.       pstrSeatings->nRow = 4;
  119.       pstrSeatings->nSeat = 2;
  120.       lstrcpy (pstrSeatings->szName, "John Smith");
  121.  
  122.       GlobalUnlock(hData);
  123. /* Add a new entry into the property list of the window specified *
  124.  * by hWnd. The character string "Smith" identifies the entry to  *
  125.  * be added.
  126.  */
  127.       if (!SetProp(hWnd, "Smith", hData))
  128.         MessageBox(hWnd, (LPSTR)"The Windows function SetProp failed.",
  129.             (LPSTR)"FAIL", MB_OK | MB_ICONHAND);
  130.  
  131. /* Prepare to display message */
  132.       sprintf (szbuffer, "The following entry has been added to the \
  133. property list of the parent window using the Windows function \
  134. SetProp.\n\n  Smith at row 4, seat# 2\n");
  135.  
  136.  
  137.       MessageBox(hWnd, szbuffer, "SetProp", MB_OK);
  138.  
  139. /* Retrieve an entry from the property list of the window specified *
  140.  * by hWnd. The character string "Smith" identifies the entry to    *
  141.  * be retrieved.
  142.  */
  143.       hData = GetProp(hWnd, "Smith");
  144.  
  145.       if (!hData)
  146.       {
  147.         MessageBox(hWnd, "GetProp has failed", "GetProp", MB_OK | MB_ICONHAND);
  148.       }
  149.  
  150.       pstrSeatings = (SEATINGS FAR * )GlobalLock(hData);
  151.  
  152. /* Copy the global data objects into local data structures so that *
  153.  * we can use sprintf.  Using small memory model, sprintf will     *
  154.  * only accept pointer offsets into the current data segment
  155.  */
  156.       nRow = pstrSeatings->nRow;
  157.       nSeat =  pstrSeatings->nSeat;
  158.       lstrcpy(szName, pstrSeatings->szName);
  159.  
  160.  
  161. /* Prepare to display message */
  162.  
  163.       sprintf(szbuffer, "The following entry has been retrieved from the \
  164. property list of the parent window using the Windows function GetProp.\n\n \
  165. %s at row %d, seat# %d\n",
  166.                        szName, nRow, nSeat);
  167.  
  168.       MessageBox(hWnd, szbuffer, "GetProp", MB_OK);
  169.  
  170.       GlobalUnlock(hData);
  171.       GlobalFree(hData);
  172.  
  173. /* Remove an entry from the property list of the window specified *
  174.  * by hWnd. The character string "Smith" identifies the entry to  *
  175.  * be removed.
  176.  */
  177.       if (!RemoveProp(hWnd, "Smith"))
  178.       {
  179.         MessageBox(hWnd, "RemoveProp has failed",
  180.             "RemoveProp", MB_OK | MB_ICONHAND);
  181.       }
  182.  
  183. /* Prepare to display message */
  184.       sprintf(szbuffer, "The following entry has been removed from the \
  185. property list of the parent window using the Windows function \
  186. RemoveProp.\n\n %s at row %d, seat# %d\n",
  187.                        szName, nRow, nSeat);
  188.  
  189.       MessageBox (hWnd, szbuffer, "RemoveProp", MB_OK);
  190.  
  191.     }
  192.       }
  193.       break;
  194.     }
  195.   case WM_DESTROY:
  196.     {
  197.       PostQuitMessage(0);
  198.       break;
  199.     }
  200.   default:
  201.     {
  202.       return DefWindowProc (hWnd, iMessage, wParam, lParam) ;
  203.     }
  204.   }
  205.   return (0L);
  206. }
  207.  
  208.  
  209.