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

Shell编程

开发平台:

Visual C++

  1. #if !defined(AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_)
  2. #define AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_
  3. #pragma once
  4. #include "Folder.h"
  5. // The ShellNew wizard. 
  6. //
  7. // It is a regular ATL dialog implementation.
  8. // The wizard-look comes from the dialog template, not Windows.
  9. class CShellNewDlg :
  10.    public CDialogImpl<CShellNewDlg>
  11. {
  12. public:
  13.    enum {IDD = IDD_NEWSHELL};
  14. BEGIN_MSG_MAP(CShellNewDlg)
  15.    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
  16.    MESSAGE_HANDLER(WM_HSCROLL, OnSizeChange)
  17.    COMMAND_ID_HANDLER(IDOK, OnOk)
  18.    COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
  19.    COMMAND_ID_HANDLER(IDC_ADFFILE, OnChange)
  20.    COMMAND_ID_HANDLER(IDC_HARDDISK, OnChange)
  21.    COMMAND_ID_HANDLER(IDC_PRESETSIZE, OnPresetChange)
  22.    COMMAND_ID_HANDLER(IDC_CUSTOMSIZE, OnChange)
  23. END_MSG_MAP()
  24.    CResString<64> m_sLabel;
  25.    TCHAR m_szTargetFile[MAX_PATH];
  26.    void _Init(LPCTSTR szTargetName)
  27.    {
  28.       ATLASSERT(szTargetName);
  29.       ATLASSERT(_tcslen(szTargetName)>0);
  30.       m_sLabel.LoadString(IDS_DISKLABEL);
  31.       _tcscpy( m_szTargetFile, szTargetName );
  32.    }
  33.    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  34.    {
  35.       CheckDlgButton(IDC_ADFFILE, BST_CHECKED);
  36.       CheckDlgButton(IDC_PRESETSIZE, BST_CHECKED);
  37.       SendDlgItemMessage(IDC_SIZESLIDER, TBM_SETRANGE, FALSE, MAKELONG(1, 9));
  38.       SendDlgItemMessage(IDC_SIZESLIDER, TBM_SETPOS, TRUE, 1);
  39.       SetDlgItemInt(IDC_DISKSIZE, 2, FALSE);
  40.       EnableButtons();
  41.       return 0;
  42.    }
  43.    LRESULT OnOk(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  44.    {
  45.       bool bFloppy = IsDlgButtonChecked(IDC_ADFFILE)==BST_CHECKED;
  46.       bool bHD = IsDlgButtonChecked(IDC_HIGHDENSITY)==BST_CHECKED;
  47.       
  48.       long lSize = GetDlgItemInt(IDC_DISKSIZE, NULL, FALSE);
  49.       bool bFFS = IsDlgButtonChecked(IDC_FFS)==BST_CHECKED;
  50.       bool bInternational = IsDlgButtonChecked(IDC_INTERNATIONAL)==BST_CHECKED;
  51.       bool bCache = IsDlgButtonChecked(IDC_CACHE)==BST_CHECKED;
  52.       bool bBoot = IsDlgButtonChecked(IDC_BOOT)==BST_CHECKED;
  53.       if( !bFloppy ) {
  54.          if( lSize<2 || lSize>2047 ) {
  55.             CResString<64> sCaption(IDS_ERROR);
  56.             CResString<200> sText(IDS_SIZETOOBIG);
  57.             MessageBox(sText, sCaption, MB_ICONWARNING | MB_OK);
  58.             return 0;
  59.          } 
  60.       }
  61.       // Before we continue, we would like to have the wait cursor
  62.       ::EnableWindow(GetDlgItem(IDOK), FALSE);
  63.       ::EnableWindow(GetDlgItem(IDCANCEL), FALSE);
  64.       CWaitCursor wait;
  65.       // Get the new device flags
  66.       int iFlags = 0;
  67.       if( bFFS ) iFlags |= FSMASK_FFS;
  68.       if( bInternational ) iFlags |= FSMASK_INTL;
  69.       if( bCache ) iFlags |= FSMASK_DIRCACHE;
  70.       // Create a new harddrive or floppy...
  71.       Device *dev = NULL;
  72.       if( bFloppy ) {
  73.          dev = adfCreateDumpDevice(m_szTargetFile, 80, 2, bHD ? 22 : 11);
  74.          if( dev==NULL ) goto error;
  75.          if( adfCreateFlop(dev, m_sLabel, iFlags)!=RC_OK ) goto error;
  76.       }
  77.       else {
  78.          dev = adfCreateDumpDevice(m_szTargetFile, (lSize*1024*1024)/LOGICAL_BLOCK_SIZE, 1, 1);
  79.          if( dev==NULL ) goto error;
  80.          if( adfCreateHdFile(dev, m_sLabel, iFlags)!=RC_OK ) goto error;
  81.       }
  82.       // Install bootblock
  83.       if( bFloppy && bBoot ) {
  84.          Volume *vol = adfMount(dev, 0, FALSE);
  85.          if( vol==NULL ) goto error;
  86.   
  87.          TCHAR szBootBlockFile[MAX_PATH];
  88.          ::GetModuleFileName(_Module.GetModuleInstance(), szBootBlockFile, MAX_PATH);
  89.          ::PathRemoveFileSpec(szBootBlockFile);
  90.          ::PathAppend(szBootBlockFile, _T("stdboot.bbk"));
  91.          CFile f;
  92.          if( f.Open(szBootBlockFile) ) {
  93.             BYTE bData[1024];
  94.             if( f.Read(bData, 1024) ) {
  95.                adfInstallBootBlock(vol, bData);
  96.             }
  97.             f.Close();
  98.          }
  99.          adfUnMount(vol);
  100.       }
  101.       adfUnMountDev(dev);
  102.       // Let Shell update its display
  103.       ::SHChangeNotify(SHCNE_CREATE, SHCNF_PATH | SHCNF_FLUSH, m_szTargetFile, NULL);
  104.       EndDialog(wID);
  105.       return 0;
  106. error:
  107.       if( dev!=NULL ) adfUnMountDev(dev);
  108.       ::EnableWindow(GetDlgItem(IDOK), TRUE);
  109.       ::EnableWindow(GetDlgItem(IDCANCEL), TRUE);
  110.       ::MessageBeep(MB_ICONERROR);
  111.       return 0;
  112.    }
  113.    LRESULT OnCancel(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  114.    {
  115.       EndDialog(wID);
  116.       return 0;
  117.    }
  118.    LRESULT OnPresetChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled)
  119.    {
  120.       OnSizeChange(0,0,0,bHandled);
  121.       EnableButtons();
  122.       return 0;
  123.    }
  124.    LRESULT OnChange(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
  125.    {
  126.       EnableButtons();
  127.       return 0;
  128.    }
  129.    LRESULT OnSizeChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
  130.    {
  131.       long lShift = SendDlgItemMessage(IDC_SIZESLIDER, TBM_GETPOS, 0,0);
  132.       long lSize = 1 << lShift;
  133.       SetDlgItemInt(IDC_DISKSIZE, lSize, FALSE);
  134.       return 0;
  135.    }
  136.    void EnableButtons()
  137.    {
  138.       BOOL bFloppy = IsDlgButtonChecked(IDC_ADFFILE)==BST_CHECKED;
  139.       ::EnableWindow(GetDlgItem(IDC_HIGHDENSITY), bFloppy);
  140.       ::EnableWindow(GetDlgItem(IDC_BOOT), bFloppy);
  141.       ::EnableWindow(GetDlgItem(IDC_PRESETSIZE), !bFloppy);
  142.       ::EnableWindow(GetDlgItem(IDC_CUSTOMSIZE), !bFloppy);
  143.       BOOL bPresetSize = IsDlgButtonChecked(IDC_PRESETSIZE)==BST_CHECKED;
  144.       ::EnableWindow(GetDlgItem(IDC_SIZESLIDER), !bFloppy && bPresetSize);
  145.       SendDlgItemMessage(IDC_DISKSIZE, EM_SETREADONLY, (!bFloppy && !bPresetSize)==FALSE, 0);
  146.       
  147.       ::EnableWindow(GetDlgItem(IDOK), TRUE);
  148.       ::EnableWindow(GetDlgItem(IDCANCEL), TRUE);
  149.    }
  150. };
  151. #endif // !defined(AFX_PROPFILE_H__20010103_C70B_4547_8230_0080AD509054__INCLUDED_)