home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_03 / Handles / Handles.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-11  |  5.5 KB  |  213 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : handles.cpp                                                         //
  10. //  Description: GDI handles property page, Chapter 3                                //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15.  
  16. #include <windows.h>
  17. #include <tchar.h>
  18. #include <assert.h>
  19. #include <ddraw.h>
  20. #include "resource.h"
  21. #include "creator.h"
  22. #include "handles.h"
  23.  
  24. const LPCTSTR Numbers[] = 
  25. {
  26.     _T("1"),
  27.     _T("16"),
  28.     _T("256"),
  29.     _T("4096"),
  30.     _T("65536")
  31. };
  32.  
  33.  
  34. const LPCTSTR ObjTypes[] =
  35. {
  36.     _T("Invalid Object"),
  37.     _T("OBJ_PEN"),
  38.     _T("OBJ_BRUSH"),
  39.     _T("OBJ_DC"),
  40.     _T("OBJ_METADC"),
  41.     _T("OBJ_PAL"),
  42.     _T("OBJ_FONT"),       
  43.     _T("OBJ_BITMAP"),     
  44.     _T("OBJ_REGION"),     
  45.     _T("OBJ_METAFILE"),   
  46.     _T("OBJ_MEMDC"),      
  47.     _T("OBJ_EXTPEN"),     
  48.     _T("OBJ_ENHMETADC"),  
  49.     _T("OBJ_ENHMETAFILE")
  50. };
  51.  
  52.  
  53. LPCTSTR GetObjectTypeName(HGDIOBJ Handle)
  54. {
  55.     return ObjTypes[GetObjectType(Handle)];
  56. }
  57.  
  58.  
  59. BOOL KHGDIOBJ::Generate(HWND rslt, bool search)
  60. {
  61.     if (m_nCreator < 0) return FALSE;
  62.     if (m_nCopy    < 0) return FALSE;
  63.  
  64.     int repeat = 1;
  65.     for (int i=0; i<m_nCopy; i++)
  66.         repeat *= 16;
  67.  
  68.     HGDIOBJ last = NULL;
  69.  
  70.     for (i=0; i<repeat; i++)
  71.     {
  72.         TCHAR temp[64];
  73.         HGDIOBJ handle = CreateObject(m_nCreator, m_hDCScreen, i);
  74.  
  75.         if ( (handle == last) || (handle == (HGDIOBJ) 0xFFFFFFFF) )
  76.             break;
  77.  
  78.         wsprintf(temp, "%08lx %s %d", handle, Commands[m_nCreator], i);
  79.         SendMessage(rslt, LB_ADDSTRING, 0, (LPARAM) temp);
  80.             
  81.         last = handle;
  82.     }
  83.  
  84.     if ( last)
  85.     {
  86.         // find all top level dialog box ( propertysheet )
  87.         for (HWND hWnd = NULL; hWnd = FindWindowEx(NULL, hWnd, WC_DIALOG, NULL); )
  88.         {
  89.             // locate it's fisrt child ( propertypage 0 )
  90.             HWND hChild = GetWindow(hWnd, GW_CHILD);
  91.  
  92.             // send a message to it
  93.             if (hChild)
  94.                 SendMessage(hChild, WM_SHAREHANDLE, (WPARAM) last, GetCurrentProcessId());
  95.         }
  96.     }
  97.  
  98.     return TRUE;
  99. }
  100.  
  101.  
  102. HRESULT DirectDrawTest(HWND hWnd)
  103. {
  104.     LPDIRECTDRAW lpdd;
  105.  
  106.     HRESULT hr = DirectDrawCreate(NULL, & lpdd, NULL);
  107.  
  108.     DWORD i = GetCurrentThreadId();
  109.  
  110.     if ( hr == DD_OK )
  111.     {
  112.         LPDIRECTDRAW lpdd2;
  113.  
  114.         hr = DirectDrawCreate(NULL, & lpdd2, NULL);
  115.  
  116.         lpdd->SetCooperativeLevel(hWnd, DDSCL_NORMAL);
  117.     
  118.         DDSURFACEDESC ddsd;
  119.         ddsd.dwSize = sizeof(ddsd);
  120.         ddsd.dwFlags = DDSD_CAPS;
  121.         ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
  122.     
  123.         LPDIRECTDRAWSURFACE lpddsprimary;
  124.  
  125.         hr = lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL);
  126.         if ( hr == DD_OK )
  127.         {
  128.             char mess[MAX_PATH];
  129.  
  130.             wsprintf(mess, 
  131.                 "DirectDraw object at %x, vtable at %x\n"
  132.                 "DirectDraw surface object at %x, vtable at %x",
  133.                 lpdd, * (unsigned *) lpdd, 
  134.                 lpddsprimary, * (unsigned *) lpddsprimary);
  135.             MessageBox(NULL, mess, "DirectDrawTest", MB_OK);
  136.  
  137.             lpddsprimary->Release();
  138.         }
  139.  
  140.         lpdd->Release();
  141.     }
  142.  
  143.     return hr;
  144. }
  145.  
  146.  
  147. BOOL KHGDIOBJ::OnInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)
  148. {
  149.     m_hWnd           = hWnd;
  150.     m_hDCScreen    = GetDC(hWnd);
  151.     WM_SHAREHANDLE = RegisterWindowMessage("WM_SHAREHANDLE");
  152.  
  153.     for (int i=0; i<nTotalCommands; i++)
  154.         SendDlgItemMessage(hWnd, IDC_COMMAND, CB_ADDSTRING, 0, (LPARAM) Commands[i]);
  155.     SendDlgItemMessage(hWnd, IDC_COMMAND, CB_SETCURSEL, 0, 0);
  156.  
  157.     for (i=0; i<sizeof(Numbers)/sizeof(Numbers[0]); i++)
  158.         SendDlgItemMessage(hWnd, IDC_NUMBER, CB_ADDSTRING, 0, (LPARAM) Numbers[i]);
  159.     SendDlgItemMessage(hWnd, IDC_NUMBER, CB_SETCURSEL, 0, 0);
  160.  
  161.     DirectDrawTest(hWnd);
  162.  
  163.     return TRUE;
  164. }
  165.  
  166.  
  167. BOOL KHGDIOBJ::OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
  168. {
  169.     if (LOWORD(wParam) == IDC_CREATE)
  170.     {
  171.         m_nCreator = SendDlgItemMessage(hWnd, IDC_COMMAND, CB_GETCURSEL, 0, 0);
  172.         m_nCopy    = SendDlgItemMessage(hWnd, IDC_NUMBER,  CB_GETCURSEL, 0, 0);
  173.  
  174.         Generate(GetDlgItem(hWnd, IDC_RESULT), FALSE);
  175.  
  176.         return TRUE;
  177.     }
  178.  
  179.     return FALSE;
  180. }
  181.  
  182.  
  183. BOOL KHGDIOBJ::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  184. {
  185.     if ( uMsg == WM_SHAREHANDLE )
  186.     {
  187.         TCHAR Mess[MAX_PATH];
  188.  
  189.         wsprintf(Mess, "Object created in process 0x%X, GetObjectType (0x%x) returns %d, %s",
  190.                             lParam, wParam, GetObjectType((HGDIOBJ) wParam),
  191.                             GetObjectTypeName((HGDIOBJ) wParam));
  192.  
  193.         if ( GetObjectType((HGDIOBJ) wParam)==OBJ_REGION )
  194.             wsprintf(Mess+strlen(Mess), "rgnsize %d", GetRegionData((HRGN) wParam, 0, NULL));
  195.  
  196.         SetDlgItemText(hWnd, IDC_SHAREHANDLE, Mess);
  197.  
  198.         return TRUE;
  199.     }
  200.  
  201.     switch (uMsg)
  202.     {
  203.         case WM_INITDIALOG:
  204.             return OnInitDialog(hWnd, wParam, lParam);
  205.  
  206.         case WM_COMMAND:
  207.             return OnCommand(hWnd, wParam, lParam);
  208.     }
  209.     
  210.     return FALSE;
  211. }
  212.  
  213.