2009-05-31 25 views
2

Ich arbeite an einer MFC-Dialogfeldanwendung in Visual C++ 2005. Meine Optionsfelder sind m_Small, M_Medium und M_Large. Keiner von ihnen zeigt, was sie in meinem m_Summary Bearbeitungsfeld sein sollen. Was könnte falsch sein?Warum funktionieren meine Radio-Tasten nicht?

Hier ist mein Code.

// 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

Ich frage mich, warum sie nicht einen echten Code-Tag zum Stapelüberlauf hinzufügen. Copy Paste funktioniert selten für großen Code. – toto

Antwort

3

Radiobuttons sind in der Regel für Variablen verwendet werden, die mehr als zwei Werte haben, also eher als drei Variablen mit:

BOOL m_Small; 
BOOL m_Medium; 
BOOL m_Large; 

Sie eine ENUM haben würde:

enum PizzaSize {Small, Medium, Large}; 

und eine Variable dieses Typs:

PizzaSize m_Size; 

Die Optionsfelder würden diese Variable festlegen.

Ihr Code wäre dann:

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"; 
} 

Es ist eine Weile her, seit ich C++ & MFC dies so behandeln, als Ausgangspunkt und nicht der endgültige Code getan haben;)

+0

Neben welcher Art von Pizza würdest du bekommen, wenn m_Small, m_Medium und m_Large alle WAHR wären? –

+0

Es ist nicht möglich, solange die Tab-Reihenfolge der Steuerelemente im Dialogfeld sequenziell ist. –

1

ChrisF Antwort ist ausgezeichnet , der richtige Weg, Radio-Buttons in MFC zu tun.

Ein sehr wichtiger Hinweis: Achten Sie darauf, dass die Optionsfelder der Reihe nach in der Reihenfolge der Dialogregisterkarten wie in der Enumeration stehen.

+0

Guter Punkt dort. – ChrisF

6

Sie müssen einen Anruf an DDX_Radio in der Klasse DoDataExchange Ihrer Klasse hinzufügen.

Dazu Sie arbeiten sollten Ihre m_Small, m_Medium und m_Large Membervariablen mit einer einzigen Ganzzahl ersetzen:

int m_Size; 

die ID des ersten Optionsfeld ist Angenommen IDC_SMALL, dann wird der DDX_Radio Anruf würde:

DDX_Radio(pDX, IDC_SMALL, m_Size); 

(Leider kann man m_Size als enum weil nicht erklären DDX_Radio erwartet ein int.)

Auch, wie Aiden Ryan correctly points out, im Visual Studio-Ressourcen-Editor sicherstellen, dass die Optionsfelder nacheinander in der Reihenfolge der Dialogregisterkarten angezeigt werden. Der erste Radio-Button sollte die Group-Eigenschaft auf True gesetzt haben und die anderen Radio-Buttons sollte die Group-Eigenschaft auf False gesetzt haben.

Verwandte Themen