⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os2dlg.cpp

📁 Unix 成组链接法 模拟UNIX系统的空闲块成组链接法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// OS2Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "OS2.h"
#include "OS2Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COS2Dlg dialog

COS2Dlg::COS2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(COS2Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(COS2Dlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

void COS2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(COS2Dlg)
	DDX_Control(pDX, IDC_Fr, pFr);
	DDX_Control(pDX, IDC_DOC, pDoc);
	DDX_Control(pDX, IDE_filesize, pEfilesize);
	DDX_Control(pDX, IDE_filename, pEfilename);
	DDX_Control(pDX, IDC_UnAlloc, pUnAlloc);
	DDX_Control(pDX, IDC_TOTALSPACE, pTotalspace);
	DDX_Control(pDX, IDC_occupynum, pOccupynum);
	DDX_Control(pDX, IDC_OCCUPYCON, pOccupycon);
	DDX_Control(pDX, IDC_Oc, pOc);
	DDX_Control(pDX, IDC_listfiles, plistfiles);
	DDX_Control(pDX, IDC_KB, pKB);
	DDX_Control(pDX, IDC_fs, pfs);
	DDX_Control(pDX, IDC_FREE, pFREE);
	DDX_Control(pDX, IDC_fn, pfn);
	DDX_Control(pDX, IDC_filesize, pfilesize);
	DDX_Control(pDX, IDC_filename, pfilename);
	DDX_Control(pDX, IDC_Alloc, pAlloc);
	DDX_Control(pDX, IDC_FORMAT, pFormat);
	DDX_Control(pDX, IDC_DISKINFO, pDiskInfo);
	DDX_Control(pDX, IDC_NUMPERGRO, pNumPerGro);
	DDX_Control(pDX, IDC_SINGLESPACE, pComboBox);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COS2Dlg, CDialog)
	//{{AFX_MSG_MAP(COS2Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(IDM_BEGIN, OnInitPro)
	ON_BN_CLICKED(IDC_FORMAT, OnFormat)
	ON_BN_CLICKED(IDC_Alloc, OnAlloc)
	ON_BN_CLICKED(IDC_UnAlloc, OnUnAlloc)
	ON_COMMAND(IDM_QUIT, OnQuit)
	ON_COMMAND(IDM_HELP, OnHelp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COS2Dlg message handlers

BOOL COS2Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	OnInitPro();
	Totalsize=100*1024;
	Remainsize=100*1024;
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void COS2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COS2Dlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COS2Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void COS2Dlg::OnInitPro() 
{
	// TODO: Add your command handler code here
   CStatic *pStat,*pStat1,*pStat2,*pStat3,*pStat4,*pStat5,*pStat6,*pStat7,*pStat8,*pStat9;
   CEdit *pEdit,*pEdit1,*pEdit2,*pEdit3,*pEdit4;
   CListBox *pListBox;
   CComboBox *pComboBox1;
   CButton *pButton1,*pButton2;
   Remainsize=100*1024;
   pStat=(CStatic *)GetDlgItem(IDC_DISKINFO);
   pStat1=(CStatic *)GetDlgItem(IDC_filename);
   pStat2=(CStatic *)GetDlgItem(IDC_filesize);
   pStat3=(CStatic *)GetDlgItem(IDC_DOC);
   pStat4=(CStatic *)GetDlgItem(IDC_fn);
   pStat5=(CStatic *)GetDlgItem(IDC_fs);
   pStat6=(CStatic *)GetDlgItem(IDC_occupynum);
   pStat7=(CStatic *)GetDlgItem(IDC_KB);
   pStat8=(CStatic *)GetDlgItem(IDC_Fr);
   pStat9=(CStatic *)GetDlgItem(IDC_Oc);
   pStat->SetWindowText("   抱歉,暂时无法获得磁盘格式化的相关信息,请格式化您的磁盘!");
   pStat1->EnableWindow(0);
   pStat2->EnableWindow(0);
   pStat3->EnableWindow(0);
   pStat4->EnableWindow(0);
   pStat5->EnableWindow(0);
   pStat6->EnableWindow(0);
   pStat7->EnableWindow(0);
   pStat8->EnableWindow(0);
   pStat9->EnableWindow(0);
   pEdit=(CEdit *)GetDlgItem(IDE_filename);
   pEdit1=(CEdit *)GetDlgItem(IDE_filesize);
   pEdit2=(CEdit *)GetDlgItem(IDC_FREE);
   pEdit3=(CEdit *)GetDlgItem(IDC_OCCUPYCON);
   pEdit4=(CEdit *)GetDlgItem(IDC_NUMPERGRO);
   pListBox=(CListBox *)GetDlgItem(IDC_listfiles);
   pComboBox1=(CComboBox *)GetDlgItem(IDC_SINGLESPACE);
   pEdit->SetWindowText("");
   pEdit1->SetWindowText("");
   pEdit2->SetWindowText("");
   pEdit3->SetWindowText("");
   pEdit4->SetWindowText("");
   pEdit->EnableWindow(0);
   pEdit1->EnableWindow(0);
   pEdit2->EnableWindow(0);
   pEdit3->EnableWindow(0);
   pTotalspace.EnableWindow(1);
   pComboBox.EnableWindow(1);
   pNumPerGro.EnableWindow(1);
   pFormat.EnableWindow(1);
   for(int nIndex=pListBox->GetCount()-1;nIndex>=0;nIndex--)
	{
	  delete (MyFiles *)plistfiles.GetItemDataPtr(nIndex);
	  pListBox->DeleteString(nIndex);
	}
   pListBox->EnableWindow(0);
   pComboBox1->SetCurSel(-1);
   pButton1=(CButton *)GetDlgItem(IDC_Alloc);
   pButton2=(CButton *)GetDlgItem(IDC_UnAlloc);
   pButton1->EnableWindow(0);
   pButton2->EnableWindow(0);
}

void COS2Dlg::OnFormat() 
{
	// TODO: Add your control notification handler code here
	CString bs,npg,tp1,tp2;
	int i=0;
	int nIndex=pComboBox.GetCurSel();
	if(nIndex!=CB_ERR)
	{
	pComboBox.GetLBText(nIndex,bs);
	 if(bs=="512KB")
			Blocksize=512;
	 else if(bs=="1MB")
			Blocksize=1*1024;
	 else if(bs=="2MB")
			Blocksize=2*1024;
     else if(bs=="4MB")
			Blocksize=4*1024;
	}
	else
	{
		MessageBox("您没有选择格式块大小,请重新选择!");
        return;
	}
	Remainsize-=Blocksize;
	pNumPerGro.GetWindowText(npg);
	if(npg=="")
	{
	  MessageBox("请输入每组块数!");
	  return;
	}
	Groupsize=atoi(npg);
	Blocknum=Totalsize/Blocksize;
	if(Blocknum%Groupsize==0)
		Groupnum=Blocknum/Groupsize;
	else
	{   if(Blocknum<Groupsize)
	        Groupnum=1;
		else 
			Groupnum=Blocknum/Groupsize+1;
	}
	switch(Groupnum)
	{
	case 1:
		  Blocks[0][0]=Blocknum-1;
		  Blocks[0][1]=0;
		  for(i=2;i<=Blocknum;i++)
		  {
		   Blocks[0][i]=i-1;
		  }
		  Blocks[0][i]=-1;
		  break;
	default:
		if(Blocknum%Groupsize==0)
		{   
			Blocks[0][0]=Groupsize;
			for(i=1;i<=Groupsize;i++)
			  Blocks[0][i]=i;
			Blocks[0][i]=-1;
			for(int count=1;count<Groupnum-1;count++)
			{
			    Blocks[(count-1)*Groupsize+1][0]=Groupsize;
				for(i=1;i<=Groupsize;i++)
					Blocks[(count-1)*Groupsize+1][i]=count*Groupsize+i;
                Blocks[(count-1)*Groupsize+1][i]=-1;
			}
			Blocks[(Groupnum-2)*Groupsize+1][0]=Groupsize-1;
			Blocks[(Groupnum-2)*Groupsize+1][1]=0;
            for(i=2;i<=Groupsize;i++)
					Blocks[(Groupnum-2)*Groupsize+1][i]=(Groupnum-1)*Groupsize+i-1;
			Blocks[(Groupnum-2)*Groupsize+1][i]=-1;
		}
		else
		{
			Blocks[0][0]=Groupsize;
			for(i=1;i<=Groupsize;i++)
			  Blocks[0][i]=i;
			Blocks[0][i]=-1;
			for(int count=1;count<Groupnum-1;count++)
			{
			    Blocks[(count-1)*Groupsize+1][0]=Groupsize;
				for(i=1;i<=Groupsize;i++)
					Blocks[(count-1)*Groupsize+1][i]=count*Groupsize+i;
                Blocks[(count-1)*Groupsize+1][i]=-1;
			}
			Blocks[(Groupnum-2)*Groupsize+1][0]=Blocknum%Groupsize-1;
			Blocks[(Groupnum-2)*Groupsize+1][1]=0;
			for(i=2;i<=(Blocknum%Groupsize);i++)
				Blocks[(Groupnum-2)*Groupsize+1][i]=(Groupnum-1)*Groupsize+i-1;
			Blocks[(Groupnum-2)*Groupsize+1][i]=-1;
		}
		break;
	}
	tp1.Format("%d",Blocknum);
    tp2.Format("%d",Groupnum);
	pDiskInfo.SetWindowText("  磁盘总空间:100MB\n  块大小:"+bs+"\n  共格式化为"+tp1+"块\n  每组"+npg+"块\n  共格式化为"+tp2+"组\n\n**其中磁盘的第一块作为专用块,不用于分配!");
	pTotalspace.EnableWindow(0);
	pComboBox.EnableWindow(0);
	pNumPerGro.EnableWindow(0);
	pFormat.EnableWindow(0);
	pfilename.EnableWindow(1);
	pfilesize.EnableWindow(1);
	pKB.EnableWindow(1);
	pEfilename.EnableWindow(1);
	pEfilesize.EnableWindow(1);
	pAlloc.EnableWindow(1);
	pUnAlloc.EnableWindow(1);
	pDoc.EnableWindow(1);
	pfn.EnableWindow(1);
	pfs.EnableWindow(1);
	pOccupynum.EnableWindow(1);
	plistfiles.EnableWindow(1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -