2009-05-31 175 views
2

我正在使用Visual C++ 2005中的MFC对话框应用程序。我的单选按钮是m_Small,m_Medium和m_Large。他们都没有显示他们应该在我的m_Summary编辑框中。什么可能是错的?为什么我的单选按钮不起作用?

这是我的代码。

// Pizza_ProgramDlg.cpp : implementation file 
// 

#include "stdafx.h" 
#include "Pizza_Program.h" 
#include "Pizza_ProgramDlg.h" 

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 


// CAboutDlg dialog used for App About 

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

// Dialog Data 
    enum { IDD = IDD_ABOUTBOX }; 

    protected: 
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support 

// Implementation 
protected: 
    DECLARE_MESSAGE_MAP() 
}; 

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

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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
END_MESSAGE_MAP() 


// CPizza_ProgramDlg dialog 




CPizza_ProgramDlg::CPizza_ProgramDlg(CWnd* pParent /*=NULL*/) 
    : CDialog(CPizza_ProgramDlg::IDD, pParent) 
    , m_Name(_T("")) 
    , m_Address(_T("")) 
    , m_Phone(_T("")) 
    , m_Summary(_T("")) 
    , m_Extra(FALSE) 
    , m_Pepperoni(FALSE) 
    , m_Sausage(FALSE) 
    , m_Peppers(FALSE) 
    , m_Mushrooms(FALSE) 
    , m_Onions(FALSE) 
    , m_Eatin(0) 
    , m_Medium(0) 
    , m_Large(0) 
    , m_Takeout(0) 
    , m_Delivery(0) 
    , m_Small(0) 
{ 
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 

void CPizza_ProgramDlg::DoDataExchange(CDataExchange* pDX) 
{ 
    CDialog::DoDataExchange(pDX); 
    DDX_Text(pDX, IDC_EDIT_NAME, m_Name); 
    DDV_MaxChars(pDX, m_Name, 1000); 
    DDX_Text(pDX, IDC_EDIT_ADDRESS, m_Address); 
    DDV_MaxChars(pDX, m_Address, 1000); 
    DDX_Text(pDX, IDC_EDIT_PHONE, m_Phone); 
    DDV_MaxChars(pDX, m_Phone, 1000); 
    DDX_Text(pDX, IDC_EDIT_SUMMARY, m_Summary); 
    DDV_MaxChars(pDX, m_Summary, 1000); 
    DDX_Check(pDX, IDC_CHECK_EXTRA, m_Extra); 
    DDX_Check(pDX, IDC_CHECK_PEPPERONI, m_Pepperoni); 
    DDX_Check(pDX, IDC_CHECK_SAUSAGE, m_Sausage); 
    DDX_Check(pDX, IDC_CHECK_PEPPERS, m_Peppers); 
    DDX_Check(pDX, IDC_CHECK_MUSHROOMS, m_Mushrooms); 
    DDX_Check(pDX, IDC_CHECK_ONIONS, m_Onions); 
} 

BEGIN_MESSAGE_MAP(CPizza_ProgramDlg, CDialog) 
    ON_WM_SYSCOMMAND() 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    //}}AFX_MSG_MAP 
    ON_EN_CHANGE(IDC_EDIT_SUMMARY, &CPizza_ProgramDlg::OnEnChangeEditSummary) 
    ON_BN_CLICKED(IDOK, &CPizza_ProgramDlg::OnBnClickedOk) 
    ON_BN_CLICKED(IDC_BUTTON_PROCESS, &CPizza_ProgramDlg::OnBnClickedButtonProcess) 
END_MESSAGE_MAP() 


// CPizza_ProgramDlg message handlers 

BOOL CPizza_ProgramDlg::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 

    return TRUE; // return TRUE unless you set the focus to a control 
} 

void CPizza_ProgramDlg::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 CPizza_ProgramDlg::OnPaint() 
{ 
    if (IsIconic()) 
    { 
     CPaintDC dc(this); // device context for painting 

     SendMessage(WM_ICONERASEBKGND, reinterpret_cast<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 function to obtain the cursor to display while the user drags 
// the minimized window. 
HCURSOR CPizza_ProgramDlg::OnQueryDragIcon() 
{ 
    return static_cast<HCURSOR>(m_hIcon); 
} 


void CPizza_ProgramDlg::OnEnChangeEditSummary() 
{ 

    // TODO: If this is a RICHEDIT control, the control will not 
    // send this notification unless you override the CDialog::OnInitDialog() 
    // function and call CRichEditCtrl().SetEventMask() 
    // with the ENM_CHANGE flag ORed into the mask. 

    // TODO: Add your control notification handler code here 
} 

void CPizza_ProgramDlg::OnBnClickedOk() 
{ 
    // TODO: Add your control notification handler code here 
    OnOK(); 
} 

void CPizza_ProgramDlg::OnBnClickedButtonProcess() 
{ 
    // TODO: Add your control notification handler code here 

    UpdateData(TRUE); 
    m_Summary += "Customer's Name: "; 
    m_Summary += m_Name; 
    m_Summary += char(13); 
    m_Summary += char(10); 
    m_Summary += "Customer's Address: "; 
    m_Summary += m_Address; 
    m_Summary += char(13); 
    m_Summary += char(10); 
    m_Summary += "Customer's Phone Number: "; 
    m_Summary += m_Phone; 


    if (m_Small==TRUE) 
{ 
    m_Summary += char(13); 
    m_Summary += char(10); 
    m_Summary += "Small Pizza $5.00"; 
} 
    else if (m_Medium==TRUE) 
{ 
    m_Summary += char(13); 
    m_Summary += char(10); 
    m_Summary += "Medium Pizza $10.00"; 
} 
    else if (m_Large==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Large Pizza $15.00"; 
    } 

    if (m_Extra==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Extra Cheese +$1.00"; 
    } 

     if (m_Pepperoni==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Pepperoni +$1.00"; 
    } 

     if (m_Sausage==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Sausage +$1.00"; 
    } 

     if (m_Peppers==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Peppers +$1.00"; 
    } 

      if (m_Mushrooms==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Mushrooms +$1.00"; 
    } 
       if (m_Onions==TRUE) 
    { 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Onions +$1.00"; 
    } 

    UpdateData(FALSE); 
} 
+0

我想知道他们为什么不添加真正的代码标签来堆栈溢出。复制粘贴很少适用于大型代码。 – toto 2009-05-31 15:59:51

回答

3

单选按钮往往被用于具有两个以上值的变量,因此而不是三个变量:

BOOL m_Small; 
BOOL m_Medium; 
BOOL m_Large; 

你必须枚举:

enum PizzaSize {Small, Medium, Large}; 

和这种类型的变量:

PizzaSize m_Size; 

单选按钮可以设置这个变量。

那么您的代码将变为:

switch (m_Size) 
{ 
    case Small: 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Small Pizza $5.00"; 
     break; 
    case Medium: 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Medium Pizza $10.00"; 
    case Large: 
     m_Summary += char(13); 
     m_Summary += char(10); 
     m_Summary += "Large Pizza $15.00"; 
} 

这是一段时间,因为我已经做C++ & MFC所以把它当作一个起点,而不是最终的代码;)

+0

除了m_Small,m_Medium和m_Large都是TRUE,你会得到哪种披萨? – 2009-05-31 17:23:01

+0

只要对话框上控件的Tab键顺序是连续的,就不可能。 – 2009-05-31 19:00:52

1

ChrisF的答案是优秀,在MFC中做单选按钮的正确方法。

一个非常重要的注意事项:确保单选按钮在对话框标签顺序中按照枚举顺序排列。

6

您需要在DoDataExchange函数中添加对DDX_Radio的调用。

对于这个工作,你应该有一个整数替换您的m_Smallm_Mediumm_Large成员变量:

int m_Size; 

假设第一个单选按钮的ID是IDC_SMALL,那么DDX_Radio电话是:

DDX_Radio(pDX, IDC_SMALL, m_Size); 

(不幸的是,你不能声明m_Size作为enum因为DDX_Radio预计int。)

此外,作为Aiden Ryan correctly points out,在Visual Studio资源编辑器中确保单选按钮以对话框选项卡顺序依次出现。第一个单选按钮应该将组属性设置为True,其他单选按钮应该将组属性设置为False。

相关问题