2009-05-31 18 views
2

私はVisual C++ 2005のMFCダイアログアプリケーションで作業しています。私のラジオボタンはm_Small、m_Medium、およびm_Largeです。それらのどれも私のm_Summary編集ボックスに想定されているものを表示しません。何が間違っていますか?ラジオボタンが機能しないのはなぜですか?

ここに私のコードです。

enum PizzaSize {Small, Medium, Large}; 

:あなたが列挙型を持っていると思います

BOOL m_Small; 
BOOL m_Medium; 
BOOL m_Large; 

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

答えて

3

ラジオボタンはそうではなく三つの変数を持つよりも、より多くのその2つの値を持つ変数に使用される傾向がありますこのタイプの変数:

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だったらどんなピザを手に入れますか? –

+0

ダイアログのコントロールのタブ順序が逐次的である限りは、できません。 –

1

ChrisFの回答が優れていますMFCでラジオボタンを行う正しい方法。

非常に重要な注意点:ラジオボタンが、列挙型のようにダイアログタブの順番で順番に並んでいることを確認してください。

+0

良い点があります。 – ChrisF

6

クラスのDoDataExchange関数にDDX_Radioの呼び出しを追加する必要があります。

あなたm_Smallm_Mediumを交換し、単一の整数でm_Largeメンバ変数する必要があり、これが機能するために:最初のラジオボタンのIDがIDC_SMALLであると仮定すると、

int m_Size; 

、そしてDDX_Radioコールは次のようになります。

DDX_Radio(pDX, IDC_SMALL, m_Size); 

(残念ながら、あなたはのでenumとしてm_Sizeを宣言することはできませんDDX_Radioにはintが必要です。

また、Aiden Ryan correctly points outとして、Visual Studioリソースエディタで、ラジオボタンがダイアログタブの順番で順番に表示されていることを確認してください。最初のラジオボタンはGroupプロパティをTrueに設定し、他のラジオボタンはGroupプロパティをFalseに設定する必要があります。

関連する問題