VolumeDlg.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:4k
源码类别:

Shell编程

开发平台:

Visual C++

  1. // VolumeDlg.h : Declaration of the CVolumeDlg
  2. #ifndef __VOLUMEDLG_H_
  3. #define __VOLUMEDLG_H_
  4. #include "resource.h"       // main symbols
  5. #include "PieChart.h"
  6. EXTERN_C const CLSID CLSID_VolumeDlg;
  7. /////////////////////////////////////////////////////////////////////////////
  8. // CVolumeDlg
  9. // The Amiga Property page for ADF files (volumes).
  10. //
  11. // It is implemented as a Property Sheet Shell extension,
  12. // so it needs to be a COM object supporting IShellPropSheetExt
  13. // and IShellExtInit.
  14. class ATL_NO_VTABLE CVolumeDlg :
  15.    public CComObjectRootEx<CComSingleThreadModel>,
  16.    public CComCoClass<CVolumeDlg, &CLSID_VolumeDlg>,
  17.    public CShellPropertyPage<CVolumeDlg>
  18. {
  19. public:
  20.    enum { IDD = IDD_PROP_VOLUME };
  21.    enum { IDS_TABCAPTION = IDS_VOLUME_CAPTION };
  22.    enum { ID_TAB_INDEX = 1 };
  23. DECLARE_PROTECT_FINAL_CONSTRUCT()
  24. BEGIN_COM_MAP(CVolumeDlg) 
  25.    COM_INTERFACE_ENTRY_IID(IID_IShellPropSheetExt, IShellPropSheetExt)
  26.    COM_INTERFACE_ENTRY_IID(IID_IShellExtInit, IShellExtInit)
  27. END_COM_MAP()
  28. BEGIN_MSG_MAP(CVolumeDlg)
  29.    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  30. END_MSG_MAP()
  31. // CVolumeDlg
  32. public:
  33.    static HRESULT WINAPI UpdateRegistry(BOOL bRegister)
  34.    {
  35.       CComBSTR bstrCLSID(CLSID_VolumeDlg);
  36.       CComBSTR bstrDescription;
  37.       CComBSTR bstrProject;
  38.       bstrDescription.LoadString(IDS_DESCRIPTION);
  39.       bstrProject.LoadString(IDS_PROJNAME);
  40.       _ATL_REGMAP_ENTRY rm[] = { 
  41.          { OLESTR("CLSID"), bstrCLSID },
  42.          { OLESTR("PROJECTNAME"), bstrProject },
  43.          { OLESTR("DESCRIPTION"), bstrDescription },
  44.          { NULL,NULL } };
  45.       return _Module.UpdateRegistryFromResource(IDR_VOLUMEDLG, bRegister, rm);
  46.    }
  47. // Attributes:
  48. public:
  49.    CPieChart m_pie;
  50. // Message handlers
  51. public:
  52.    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  53.    {
  54.       ATLASSERT(m_szFileName[0]);
  55.       CAdfDevice dev;
  56.       CAdfVolume vol;
  57.       if( OpenAmigaDevice(m_szFileName, TRUE, NULL, dev, vol)!=S_OK ) return 0;
  58.       CResString<64> sType;
  59.       TCHAR szTemp[200];
  60.       UINT idStr;
  61.       // Name
  62.       vol.GetName(szTemp, lengthof(szTemp));
  63.       SetDlgItemText(IDC_NAME, szTemp);
  64.       // Type
  65.       switch( dev.GetType() ) {
  66.       case DEVTYPE_FLOPDD: idStr = IDS_FLOPDD; break;
  67.       case DEVTYPE_FLOPHD: idStr = IDS_FLOPHD; break;
  68.       case DEVTYPE_HARDDISK: idStr = IDS_HARDDISK; break;
  69.       case DEVTYPE_HARDFILE: idStr = IDS_HARDFILE; break;
  70.       default: 
  71.          idStr = IDS_UNKNOWN;
  72.       }
  73.       sType.LoadString(idStr);
  74.       SetDlgItemText(IDC_TYPE, sType);
  75.       // File System
  76.       idStr = isFFS(vol.GetDOSType()) ? IDS_FFS : IDS_OFS;
  77.       sType.LoadString(idStr);
  78.       SetDlgItemText(IDC_FILESYSTEM, sType);
  79.       // Flags
  80.       sType.LoadString( isFFS(vol.GetDOSType()) ? IDS_FLAG_FFS : IDS_FLAG_OFS );
  81.       _tcscpy(szTemp, sType);
  82.       if( isINTL(vol.GetDOSType()) ) {
  83.          _tcscat(szTemp, _T(" "));
  84.          sType.LoadString(IDS_FLAG_INTL);
  85.          _tcscat(szTemp, sType);
  86.       }
  87.       if( isDIRCACHE(vol.GetDOSType()) ) {
  88.          _tcscat(szTemp, _T(" "));
  89.          sType.LoadString(IDS_FLAG_DIRCACHE);
  90.          _tcscat(szTemp, sType);
  91.       }
  92.       SetDlgItemText(IDC_FLAGS, szTemp);
  93.       // Capacity
  94.       Int2Str( szTemp, (vol.GetLastBlock() + 1 - vol.GetFirstBlock()) * LOGICAL_BLOCK_SIZE );
  95.       SetDlgItemText(IDC_CAPACITY, szTemp);
  96.       // Used space      
  97.       Int2Str( szTemp, ((vol.GetLastBlock() + 1 - vol.GetFirstBlock()) - vol.GetFreeBlockCount()) * LOGICAL_BLOCK_SIZE );
  98.       SetDlgItemText(IDC_USEDSPACE, szTemp);
  99.       // Free space
  100.       Int2Str( szTemp, (vol.GetFreeBlockCount()) * LOGICAL_BLOCK_SIZE );
  101.       SetDlgItemText(IDC_FREESPACE, szTemp);
  102.       
  103.       // Percent control
  104.       DWORD dwPercent = (((vol.GetLastBlock() + 1 - vol.GetFirstBlock()) - vol.GetFreeBlockCount()) * 100) /
  105.                         (vol.GetLastBlock() + 1 - vol.GetFirstBlock());
  106.       m_pie.SubclassWindow(GetDlgItem(IDC_PIE));
  107.       m_pie.SetPercent(dwPercent);
  108.       return 1;
  109.    }
  110.    void Int2Str(LPTSTR pszText, DWORD i)
  111.    {
  112.       USES_CONVERSION;
  113.       WCHAR szwTemp[64];
  114.       LONGLONG longlong = i;
  115.       ::StrFormatByteSizeW(longlong, szwTemp, lengthof(szwTemp));
  116.       ATLASSERT(!::IsBadWritePtr(pszText, lengthof(szwTemp)));
  117.       _tcsncpy(pszText, W2CT(szwTemp), lengthof(szwTemp));
  118.    }
  119. };
  120. #endif //__VOLUMEDLG_H_