📄 cdiskwizdisksizepage.cpp
字号:
ex->Delete();
}
}
// SetPGPdiskSize sets the size edit box and the slider to the given size.
void
CDiskWizDiskSizePage::SetPGPdiskSize(PGPUInt32 kbSize)
{
// Set size to legal value.
if (kbSize < kMinPGPdiskKbSize)
{
kbSize = kMinPGPdiskKbSize;
}
else if (kbSize > mLocalMaxKbSize)
{
kbSize = mLocalMaxKbSize;
}
// More than or less than 1 meg in size?
if (kbSize >= kKbPerMeg)
{
mSizeValue = kbSize/kKbPerMeg;
UpdateData(FALSE);
ConvertControlsToMb();
}
else
{
mSizeValue = kbSize;
UpdateData(FALSE);
ConvertControlsToKb();
}
}
// GetPGPdiskSizeFromRegistry initializes the size from the value we
// previously stored in the registry.
void
CDiskWizDiskSizePage::GetPGPdiskSizeFromRegistry()
{
PGPdiskWin32Prefs prefs;
derr = GetPGPdiskWin32Prefs(prefs);
if (derr.IsntError())
SetPGPdiskSize(prefs.lastCreateSize);
}
// SetPGPdiskSizeInRegistry stores the current PGPdisk size in the registry.
DualErr
CDiskWizDiskSizePage::SetPGPdiskSizeInRegistry()
{
DualErr derr;
PGPdiskWin32Prefs prefs;
PGPUInt32 kbSize;
UpdateData(TRUE);
kbSize = mSizeValue;
if (mIsSizeInMb)
kbSize *= kKbPerMeg;
derr = GetPGPdiskWin32Prefs(prefs);
if (derr.IsntError())
{
prefs.lastCreateSize = kbSize;
derr = SetPGPdiskWin32Prefs(prefs);
}
return derr;
}
// UpdateSizeFromSlider updates the size edit box from the slider position.
void
CDiskWizDiskSizePage::UpdateSizeFromSlider()
{
PGPInt32 pos;
pos = mSizeSlider.GetPos();
mSizeValue = (PGPUInt32) floor((double) pos*mUnitsPerTick + 0.5);
mSizeValue += (mIsSizeInMb ? 1 : kMinPGPdiskKbSize);
UpdateData(FALSE);
}
// UpdateSliderFromSize updates the slider position from the size edit box.
void
CDiskWizDiskSizePage::UpdateSliderFromSize()
{
PGPUInt32 temp;
UpdateData(TRUE);
temp = mSizeValue;
temp -= (mIsSizeInMb ? 1 : kMinPGPdiskKbSize);
mSizeSlider.SetPos((PGPUInt32) floor((double) temp/mUnitsPerTick + 0.5));
}
// The CDiskWizDiskSizePage data exchange function.
void
CDiskWizDiskSizePage::DoDataExchange(CDataExchange *pDX)
{
try
{
CString text;
PGPBoolean skipDDX = FALSE;
CPropertyPage::DoDataExchange(pDX);
// Our goal is to coax MFC into accepting NULL fields for our size
// box.
if (mSizeEditBox.GetSafeHwnd())
mSizeEditBox.GetWindowText(text);
// Don't overwrite a null field with a 0.
if (!pDX->m_bSaveAndValidate && text.IsEmpty && (mSizeValue == 0))
{
skipDDX = TRUE;
}
// Note the way the second if statement ends within the AFX_DATA_MAP.
// This is done so our variable will still appear in the ClassWizard,
// but allows us to skip the DDX_Text when we want to. Kewl!
if (pDX->m_bSaveAndValidate && text.IsEmpty())
{
skipDDX = TRUE;
mSizeValue = 0;
}
if (!skipDDX)
//{{AFX_DATA_MAP(CDiskWizDiskSizePage)
DDX_Text(pDX, IDC_SIZE_EDIT, mSizeValue);
DDX_Control(pDX, IDC_SIDEBAR, mSidebarGraphic);
DDX_Control(pDX, IDC_SIZE_SPIN, mSizeSpin);
DDX_Control(pDX, IDC_SIZE_EDIT, mSizeEditBox);
DDX_Control(pDX, IDC_SIZE_SLIDER, mSizeSlider);
DDX_Text(pDX, IDC_MAXSIZE, mMaxSizeText);
DDX_Text(pDX, IDC_MINSIZE, mMinSizeText);
DDX_Text(pDX, IDC_FREESIZE_TEXT, mFreeSizeText);
//}}AFX_DATA_MAP
}
catch (CMemoryException *ex)
{
ex->Delete();
}
}
// OnChangeSizeEdit is called when the user enters a new size in the size
// edit box. We update the slider bar accordingly.
void
CDiskWizDiskSizePage::OnChangeSizeEdit()
{
if (mSizeEditBox.GetSafeHwnd())
UpdateSliderFromSize();
}
// OnKbCheck is called when the kB button is clicked.
void
CDiskWizDiskSizePage::OnKbCheck()
{
ConvertControlsToKb();
}
// OnMbCheck is called when the MB button is clicked.
void
CDiskWizDiskSizePage::OnMbCheck()
{
ConvertControlsToMb();
}
//////////////////////////////////////////////////////////
// CDiskWizDiskSizePage protected default message handlers
//////////////////////////////////////////////////////////
// OnHelpInfo handles context-sensitive help.
BOOL
CDiskWizDiskSizePage::OnHelpInfo(HELPINFO *pHelpInfo)
{
if ((pHelpInfo->iContextType == HELPINFO_WINDOW) &&
(pHelpInfo->iCtrlId != ((PGPUInt16) IDC_STATIC)))
{
::WinHelp((HWND) pHelpInfo->hItemHandle, App->m_pszHelpFilePath,
HELP_WM_HELP, (PGPUInt32) HelpIds);
}
return TRUE;
}
// OnHScroll is called when the user drags the slider thumb.
void
CDiskWizDiskSizePage::OnHScroll(
UINT nSBCode,
UINT nPos,
CScrollBar *pScrollBar)
{
CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar);
UpdateSizeFromSlider();
}
// OnInitDialog is overwritten to perform property page initialization.
BOOL
CDiskWizDiskSizePage::OnInitDialog()
{
DualErr dummyErr;
File existingFile;
PGPUInt32 bytesFile;
PGPUInt64 bytesFree;
CPropertyPage::OnInitDialog();
// This must be called first to make MFC happy.
UpdateData(FALSE);
// Classwizard won't subclasss our radio buttons (sniff).
mKbButton.SubclassWindow(GetDlgItem(IDC_KB_CHECK)->GetSafeHwnd());
mMbButton.SubclassWindow(GetDlgItem(IDC_MB_CHECK)->GetSafeHwnd());
// How much space do we have available?
dummyErr = App->HowMuchFreeSpace(mParentDiskWiz->mPath, &bytesFree);
// Don't fail if the disk free call fails, but make note of it.
if (dummyErr.IsntError())
{
mAreWeFailingDiskFree = FALSE;
mKbFree = (PGPUInt32) (bytesFree / kBytesPerKb);
}
else
{
mAreWeFailingDiskFree = TRUE;
mKbFree = kMaxPGPdiskKbSize*2; // fake max amount of space
}
// If the pathname contains the name of an existing file, the user wants
// to replace it, so add its size to the amount of free space.
dummyErr = existingFile.mInitErr;
if (dummyErr.IsntError())
{
dummyErr = existingFile.Open(mParentDiskWiz->mPath,
kOF_MustExist | kOF_ReadOnly);
}
if (dummyErr.IsntError())
{
existingFile.GetLength(&bytesFile);
}
if (dummyErr.IsntError())
{
mKbFree += bytesFile/kBytesPerKb;
}
if (existingFile.Opened())
{
existingFile.Close();
}
// Estimate roughly what size PGPdisk we can handle.
mLocalMaxKbSize = (PGPUInt32) min(EstimateDataSizeFromDiskSize(mKbFree),
kMaxPGPdiskKbSize);
// If this is less than one meg, disable the Mb button.
if (mLocalMaxKbSize < kKbPerMeg)
mMbButton.EnableWindow(FALSE);
pgpAssert(mLocalMaxKbSize >= kMinPGPdiskKbSize); // should've been checked
// Set PGPdisk size to what we remember it as in the registry.
GetPGPdiskSizeFromRegistry();
try
{
CString freeSpaceStr, maxPGPdiskStr;
FormatSizeString(mKbFree, freeSpaceStr.GetBuffer(kMaxStringSize),
kMaxStringSize);
freeSpaceStr.ReleaseBuffer();
FormatSizeString(mLocalMaxKbSize,
maxPGPdiskStr.GetBuffer(kMaxStringSize), kMaxStringSize);
maxPGPdiskStr.ReleaseBuffer();
// Update the contents of the free size message shown to the user.
if (mAreWeFailingDiskFree)
{
mFreeSizeText.Format(kFreeSize3MsgString, maxPGPdiskStr);
}
else if (mLocalMaxKbSize == kMaxPGPdiskKbSize)
{
mFreeSizeText.Format(kFreeSize2MsgString, freeSpaceStr,
maxPGPdiskStr);
}
else
{
mFreeSizeText.Format(kFreeSize1MsgString, freeSpaceStr);
}
}
catch (CMemoryException *ex)
{
ex->Delete();
}
UpdateData(FALSE);
return TRUE;
}
// We override OnPaint to draw the sidebar graphic at the correct depth.
void
CDiskWizDiskSizePage::OnPaint()
{
CDC memDC;
CPaintDC DC(this);
HBITMAP oldBitmap;
RECT sidebarRect;
DC.SelectPalette(&mParentDiskWiz->mSidebarPalette, FALSE);
DC.RealizePalette();
memDC.CreateCompatibleDC(&DC);
memDC.SelectPalette(&mParentDiskWiz->mSidebarPalette, FALSE);
memDC.RealizePalette();
mSidebarGraphic.GetWindowRect(&sidebarRect);
ScreenToClient(&sidebarRect);
// MFC bug - CDC::SelectObject returns incorrect pointers/handles so don't
// fool with it.
oldBitmap = (HBITMAP)
::SelectObject(memDC, mParentDiskWiz->mSidebarBitmap);
DC.BitBlt(sidebarRect.left, sidebarRect.top, sidebarRect.right,
sidebarRect.bottom, &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(oldBitmap);
memDC.DeleteDC();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -