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

📄 topdlg.cpp

📁 VC++串口通信设。本书详细说明讲解了在VC++环境下编写串口通信得过程。值得一看
💻 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 + -