home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_05 / Device / DevPage.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-11  |  5.5 KB  |  207 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   : devpage.cpp                                                         //
  10. //  Description: KDevicePage class                                                   //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define NOCRYPT
  16. #define WINVER       0x0500
  17.  
  18. #include <windows.h>
  19. #include <tchar.h>
  20.  
  21. #include "resource.h"
  22.  
  23. #include "..\\..\\include\\property.h"
  24. #include "..\\..\\include\\listview.h"
  25.  
  26. #include "DevPage.h"
  27. #include "DevCaps.h"
  28. #include "DCAttr.h"
  29.  
  30. void AddDisplayDevices(HWND hList)
  31. {
  32.     DISPLAY_DEVICE Dev;
  33.  
  34.     Dev.cb = sizeof(Dev);
  35.  
  36.     SendMessage(hList, CB_RESETCONTENT, 0, 0);
  37.  
  38.     for (unsigned i=0; 
  39.          EnumDisplayDevices(NULL, i, & Dev, 0);
  40.          i++ )
  41.         SendMessage(hList, CB_ADDSTRING, 0, (LPARAM) Dev.DeviceName);
  42.  
  43.      SendMessage(hList, CB_SETCURSEL, 0, 0);
  44. }
  45.  
  46.  
  47. int FrameBufferSize(int width, int height, int bpp)
  48. {
  49.     int bytepp = ( bpp + 7 ) / 8;                 // bytes per pixel
  50.     int byteps = ( width * bytepp + 3 ) / 4 * 4; // bytes per scanline
  51.  
  52.     return height * byteps;                         // bytes per frame buffer
  53. }
  54.  
  55.  
  56. void AddDisplaySettings(HWND hList, LPCTSTR pszDeviceName)
  57. {
  58.     DEVMODE  dm;
  59.  
  60.     dm.dmSize         = sizeof(DEVMODE);
  61.     dm.dmDriverExtra = 0;
  62.  
  63.     SendMessage(hList, LB_RESETCONTENT, 0, 0);
  64.  
  65.     for (unsigned i=0;
  66.          EnumDisplaySettings(pszDeviceName, i, & dm);
  67.          i++ )
  68.     {
  69.         TCHAR szTemp[MAX_PATH];
  70.  
  71.         wsprintf(szTemp, _T("%d by %d, %d bits, %d Hz, %d Kb"), 
  72.             dm.dmPelsWidth, 
  73.             dm.dmPelsHeight, 
  74.             dm.dmBitsPerPel,
  75.             dm.dmDisplayFrequency,
  76.             FrameBufferSize(dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel) / 1024
  77.             );
  78.  
  79.         SendMessage(hList, LB_ADDSTRING, 0, (LPARAM) szTemp);
  80.     }
  81. }
  82.  
  83.  
  84. BOOL KDevicePage::OnInitDialog(HWND hWnd)
  85. {
  86.     AddDisplayDevices(GetDlgItem(hWnd, IDC_DEVICE));
  87.  
  88.     OnDeviceChange(hWnd);
  89.  
  90.     return TRUE;
  91. }
  92.  
  93.  
  94. BOOL KDevicePage::OnDeviceChange(HWND hWnd)
  95. {
  96.     TCHAR szDeviceName[MAX_PATH];
  97.  
  98.     GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);
  99.     
  100.     {
  101.         unsigned iDevNum = 0; 
  102.         DISPLAY_DEVICE Device;
  103.  
  104.         Device.cb = sizeof(Device);
  105.  
  106.         while ( EnumDisplayDevices(NULL, iDevNum, & Device, 0) )
  107.             if ( _tcscmp(szDeviceName, Device.DeviceName)==0 )
  108.                 break;
  109.             else
  110.                 iDevNum ++;
  111.  
  112.         SetDlgItemText(hWnd, IDC_DEVICESTRING, Device.DeviceString);
  113.         SetDlgItemText(hWnd, IDC_DEVICEID,     Device.DeviceID);
  114.         SetDlgItemText(hWnd, IDC_DEVICEKEY,    Device.DeviceKey);
  115.  
  116.         SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_RESETCONTENT, 0, 0);
  117.                     
  118.         if ( Device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP )
  119.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "ATTACHED_TO_DESKTOP");
  120.  
  121.         if ( Device.StateFlags & DISPLAY_DEVICE_MULTI_DRIVER )
  122.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MULTI_DRIVER");
  123.  
  124.         if ( Device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE )
  125.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "PRIMARY_DEVICE");
  126.  
  127.         if ( Device.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER )
  128.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MIRRORING_DRIVER");
  129.  
  130.         if ( Device.StateFlags & DISPLAY_DEVICE_VGA_COMPATIBLE )
  131.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "VGA_COMPATIBLE");
  132.  
  133.         if ( Device.StateFlags & DISPLAY_DEVICE_MODESPRUNED )
  134.             SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_ADDSTRING, 0, (LPARAM) "MODESPRUNED");
  135.  
  136.         SendDlgItemMessage(hWnd, IDC_STATEFLAGS, CB_SETCURSEL, 0, 0);
  137.     }
  138.  
  139.     AddDisplaySettings(GetDlgItem(hWnd, IDC_MODES), szDeviceName);
  140.  
  141.     return TRUE;
  142. }
  143.  
  144.  
  145.  
  146. BOOL KDevicePage::OnDeviceCaps(HWND hWnd)
  147. {
  148.     TCHAR szDeviceName[MAX_PATH];
  149.  
  150.     GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);
  151.  
  152.     HDC hDC = CreateDC(_T("DISPLAY"), szDeviceName, NULL, NULL);
  153.  
  154.     KDeviceCaps caps(hDC);
  155.  
  156.     caps.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DEVICECAPS));
  157.     
  158.     DeleteDC(hDC);
  159.  
  160.     return TRUE;
  161. }
  162.  
  163.  
  164. BOOL KDevicePage::OnDCAttributes(HWND hWnd)
  165. {
  166.     TCHAR szDeviceName[MAX_PATH];
  167.  
  168.     GetDlgItemText(hWnd, IDC_DEVICE, szDeviceName, MAX_PATH);
  169.  
  170.     HDC hDC = CreateDC(_T("DISPLAY"), szDeviceName, NULL, NULL);
  171.  
  172.     KDCAttributes attr(hDC);
  173.  
  174.     attr.Dialogbox(m_hInstance, MAKEINTRESOURCE(IDD_DCATTRIBUTES), hWnd);
  175.     
  176.     DeleteDC(hDC);
  177.  
  178.     return TRUE;
  179. }
  180.  
  181.  
  182. BOOL KDevicePage::DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  183. {
  184.     switch (uMsg)
  185.     {
  186.         case WM_INITDIALOG:
  187.             return OnInitDialog(hWnd);
  188.  
  189.         case WM_COMMAND:
  190.             switch ( LOWORD(wParam) )
  191.             {
  192.                 case IDC_DEVICE:
  193.                     if ( HIWORD(wParam)==CBN_SELCHANGE )
  194.                         return OnDeviceChange(hWnd);
  195.                     break;
  196.  
  197.                 case IDC_DEVICECAPS:
  198.                     return OnDeviceCaps(hWnd);
  199.  
  200.                 case IDC_DCATTR:
  201.                     return OnDCAttributes(hWnd);
  202.             }
  203.     }
  204.     
  205.     return FALSE;
  206. }
  207.