📄 topdlg.cpp
字号:
// Get needed include files
#include "TopDlg.h"
#include "Resource.h"
#include "Utility.h"
BEGIN_MESSAGE_MAP(CToppingDialog, CPropertyPage)
ON_BN_CLICKED(ID_ADD_TOPPING, OnAddTopping)
ON_BN_CLICKED(ID_REM_TOPPING, OnRemoveTopping)
END_MESSAGE_MAP()
// Helper class, binding a Topping enum to its string name
struct CStringToEnumAssoc
{
// We have to have this constructor
CStringToEnumAssoc(const CString& strTopping,
Topping eTopping)
: m_strTopping(strTopping),
m_eTopping(eTopping)
{}
CString m_strTopping;
Topping m_eTopping;
};
// Array to map string topping name to enum value supported by
// COM PizzaOrderTaker
CStringToEnumAssoc g_aToppingAssocs[] =
{
CStringToEnumAssoc("Not a topping", (Topping) 0 ),
CStringToEnumAssoc("Pepperoni", Pepperoni ),
CStringToEnumAssoc("Sausage", Sausage ),
CStringToEnumAssoc("Ground Beef", GroundBeef ),
CStringToEnumAssoc("Green Olives", GreenOlives ),
CStringToEnumAssoc("Prosciuttini Ham", ProsciuttiniHam ),
CStringToEnumAssoc("Pastrami", Pastrami ),
CStringToEnumAssoc("Green Peppers", GreenPeppers ),
CStringToEnumAssoc("Mushrooms", Mushrooms ),
CStringToEnumAssoc("Onions", Onions ),
CStringToEnumAssoc("Tomatoes", Tomatoes ),
CStringToEnumAssoc("Pesto", Pesto ),
CStringToEnumAssoc("Jalapeno Peppers", JalapenoPeppers ),
CStringToEnumAssoc("Cheddar Cheese", CheddarCheese ),
CStringToEnumAssoc("Fontina Cheese", FontinaCheese ),
CStringToEnumAssoc("Ricotta Cheese", RicottaCheese ),
CStringToEnumAssoc("Feta Cheese", FetaCheese ),
CStringToEnumAssoc("Pineapple", Pineapple ),
CStringToEnumAssoc("Extra Cheese", ExtraCheese ),
CStringToEnumAssoc("Bacon", Bacon ),
CStringToEnumAssoc("Broccoli", Broccoli ),
CStringToEnumAssoc("Genoa Salami", GenoaSalami ),
CStringToEnumAssoc("Zucchini", Zucchini ),
CStringToEnumAssoc("Black Olives", BlackOlives ),
CStringToEnumAssoc("Anchovies", Anchovies ),
CStringToEnumAssoc("Chicken Breast", ChickenBreast ),
CStringToEnumAssoc("Shrimp", Shrimp ),
CStringToEnumAssoc("Artichoke Hearts", ArtichokeHearts )
};
// Constant that tracks the number of toppings
static const ULONG g_ulNumToppings =
sizeof(g_aToppingAssocs) / sizeof(CStringToEnumAssoc);
// Global convenience functions
CString ToppingEnumToStr(Topping eSearchTopping)
{
// Map an enum to a string
for (USHORT usLoop = 1; usLoop < g_ulNumToppings; usLoop++)
if (g_aToppingAssocs[usLoop].m_eTopping == eSearchTopping)
return g_aToppingAssocs[usLoop].m_strTopping;
// We should never get to here
ASSERT(FALSE);
return "";
}
Topping ToppingStrToEnum(const CString& strSearchTopping)
{
// Map a string to an enum
CString strRealSearchTopping = strSearchTopping.SpanExcluding("(");
strRealSearchTopping.TrimRight();
for (USHORT usLoop = 1; usLoop < g_ulNumToppings; usLoop++)
if (g_aToppingAssocs[usLoop].m_strTopping == strRealSearchTopping)
return g_aToppingAssocs[usLoop].m_eTopping;
// We should never get to here
ASSERT(FALSE);
return (Topping) 0;
}
// Constructor
CToppingDialog::CToppingDialog(CSharedData& NewSharedData)
: CPropertyPage(IDD_TOPPINGS),
m_pSharedData(&NewSharedData)
{ }
void CToppingDialog::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TOPPING_LIST, m_ToppingList);
DDX_Control(pDX, IDC_SEL_TOPPING_LIST, m_SelToppingList);
DDX_Control(pDX, IDC_RAD_WHOLEPIZZA, m_WholePizzaRB);
DDX_Control(pDX, IDC_RAD_HALFPIZZA, m_HalfPizzaRB);
DDX_Control(pDX, IDC_RAD_QUARTPIZZA, m_QuartPizzaRB);
DDX_Control(pDX, ID_ADD_TOPPING, m_AddTopping);
DDX_Control(pDX, ID_REM_TOPPING, m_RemTopping);
}
BOOL CToppingDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// Select the first topping in the list
m_ToppingList.SetCurSel(0);
// Select the "Whole Pizza" radio button
CheckRadioButton(IDC_RAD_WHOLEPIZZA, IDC_RAD_QUARTPIZZA, IDC_RAD_WHOLEPIZZA);
// Since there can be no toppings selected yet, disable the selected
// toppings listbox and the Remove button
EnableSelToppingControls(FALSE);
return TRUE;
}
BOOL CToppingDialog::OnSetActive()
{
CPropertyPage::OnSetActive();
CPropertySheet* pSheet = DYNAMIC_DOWNCAST(CPropertySheet, GetParent());
if (pSheet != NULL)
pSheet->SetWizardButtons(PSWIZB_BACK | PSWIZB_NEXT);
return TRUE;
}
void CToppingDialog::OnAddTopping()
{
HRESULT hResult;
// Retrieve the topping selected
Topping eSelTopping;
CString strSelTopping;
INT iCurrSelection = m_ToppingList.GetCurSel();
m_ToppingList.GetLBText(iCurrSelection, strSelTopping);
eSelTopping = ToppingStrToEnum(strSelTopping);
// Retrieve the topping size requested
ToppingSize eSelToppingSize;
CString strSelToppingSize;
int iCheckRadioButton = GetCheckedRadioButton(IDC_RAD_WHOLEPIZZA,
IDC_RAD_QUARTPIZZA);
switch(iCheckRadioButton)
{
case IDC_RAD_WHOLEPIZZA:
eSelToppingSize = FullPizza;
break;
case IDC_RAD_HALFPIZZA:
eSelToppingSize = HalfPizza;
strSelToppingSize = " (On Half)";
break;
case IDC_RAD_QUARTPIZZA:
eSelToppingSize = QuarterPizza;
strSelToppingSize = " (On Quarter)";
break;
// There should always be a selected radio button
default:
ASSERT(FALSE);
}
// Add it to the COM PizzaOrderTaker list first
ASSERT(m_pSharedData);
hResult = m_pSharedData->GetPizzaOrderTaker()->AddTopping(eSelTopping,
eSelToppingSize);
if (FAILED(hResult)) {
ReportError("Error adding new pizza topping.", hResult);
return;
}
// Now add the topping to the selected list box...
CString strNewToppingText(strSelTopping);
strNewToppingText += strSelToppingSize;
m_SelToppingList.AddString(strNewToppingText);
m_SelToppingList.SetCurSel(0);
EnableSelToppingControls(TRUE);
// And remove the topping from the topping list
m_ToppingList.DeleteString(iCurrSelection);
// Select the first topping and the "Whole Pizza" option (if there
// are any toppings left)
CheckRadioButton(IDC_RAD_WHOLEPIZZA, IDC_RAD_QUARTPIZZA, IDC_RAD_WHOLEPIZZA);
if (!m_ToppingList.GetCount())
EnableToppingControls(FALSE);
else
m_ToppingList.SetCurSel(0);
}
void CToppingDialog::OnRemoveTopping()
{
HRESULT hResult;
// Retrieve the topping selected
Topping eSelTopping;
CString strSelTopping;
INT iCurrSelection = m_SelToppingList.GetCurSel();
m_SelToppingList.GetText(iCurrSelection, strSelTopping);
eSelTopping = ToppingStrToEnum(strSelTopping);
// Remove the topping from the COM PizzaOrderTaker list first
ASSERT(m_pSharedData);
hResult = m_pSharedData->GetPizzaOrderTaker()->RemoveTopping(eSelTopping);
if (FAILED(hResult)) {
ReportError("Error removing pizza topping.", hResult);
return;
}
// Now add the topping to the topping combo box...
CString strTopping = ToppingEnumToStr(eSelTopping);
m_ToppingList.AddString(strTopping);
m_ToppingList.SetCurSel(0);
CheckRadioButton(IDC_RAD_WHOLEPIZZA, IDC_RAD_QUARTPIZZA, IDC_RAD_WHOLEPIZZA);
EnableToppingControls(TRUE);
// And remove the topping from the selected toppings list
m_SelToppingList.DeleteString(iCurrSelection);
// Select the first topping and the "Whole Pizza" option (if there
// are any toppings left)
if (!m_SelToppingList.GetCount())
EnableSelToppingControls(FALSE);
else
m_SelToppingList.SetCurSel(0);
}
//
// Methods for enabling/disabling control groups
//
void CToppingDialog::EnableToppingControls(BOOL boolEnableState)
{
m_ToppingList.EnableWindow(boolEnableState);
m_AddTopping.EnableWindow(boolEnableState);
m_WholePizzaRB.EnableWindow(boolEnableState);
m_HalfPizzaRB.EnableWindow(boolEnableState);
m_QuartPizzaRB.EnableWindow(boolEnableState);
}
void CToppingDialog::EnableSelToppingControls(BOOL boolEnableState)
{
m_SelToppingList.EnableWindow(boolEnableState);
m_RemTopping.EnableWindow(boolEnableState);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -