MFC:击键后不显示对话框

时间:2011-05-21 05:55:16

标签: visual-c++ mfc dialog modal-dialog

提前感谢你。

MFC非常新,并试图在星期天之前完成一个cs项目。我们将创建一个在网格中显示多边形的简单程序。矩形工作得很好,但是当我开始添加三角形时,我无法弄明白为什么三角形对话框拒绝显示。这是一些代码:

CEquilDialog.h:

 #include <afxwin.h>

class CEquilDialog : public CDialog {
public:
    CEquilDialog();
    afx_msg void OnOK();
    afx_msg void OnCancel();
    int m_nSideLength;
    COLORREF m_Color;
private:
    DECLARE_MESSAGE_MAP()
};

CEquilDialog.cpp:

#include "CEquilDialog.h"
#include "CEquilateralIds.h"

const int TEXT_MAX = 20;

CEquilDialog::CEquilDialog() : CDialog("Equilateral Traingle") {
    m_nSideLength = 0;
}

afx_msg void CEquilDialog::OnOK() {
    char editText[TEXT_MAX + 1];
    CEdit* SideLengthEdit = (CEdit* )(GetDlgItem(IDC_SideLength));
    SideLengthEdit->GetWindowText(editText,TEXT_MAX);
    m_nSideLength = atoi(editText);
    if (m_nSideLength <= 0) {
        EndDialog(!IDOK);
        return;
    }
    int color = GetCheckedRadioButton(IDC_Red, IDC_Blue);
    switch(color) {
        case IDC_Red:
            m_Color = RGB(255,0,0);
            break;
        case IDC_Yellow:
            m_Color = RGB(255,255,0);
            break;
        case IDC_Blue:
            m_Color = RGB(0,0,255);
            break;
        default:
            m_Color = RGB(255,255,255);
    }
    EndDialog(IDOK);
}
afx_msg void CEquilDialog::OnCancel() {
    m_nSideLength = 0;
    EndDialog(!IDOK);
}   

BEGIN_MESSAGE_MAP(CEquilDialog, CDialog)
    ON_COMMAND(IDC_OK, OnOK)
    ON_COMMAND(IDC_Cancel, OnCancel)
END_MESSAGE_MAP()

CEquilateralIds.h

#define IDC_OK          2000
#define IDC_Cancel      2011
#define IDC_SideLength  2012
#define IDC_Red         2013
#define IDC_Yellow      2014
#define IDC_Blue        2015

Equilateral.rc(资源文件)

#include <afxres.h>
#include "CEquilateralIds.h"

Equilateral DIALOG 50,50,150,150
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU

CAPTION "Create Triangle"
{
    LTEXT "Enter Side Length", IDC_STATIC, 10, 5, 50, 8
    EDITTEXT IDC_SideLength, 25, 15, 60, 16
    GROUPBOX "Select color", IDC_STATIC, 10, 70, 60+15, 50
    AUTORADIOBUTTON "Red", IDC_Red, 25, 80, 50, 16, WS_GROUP
    AUTORADIOBUTTON "Yellow", IDC_Yellow, 25, 91, 50, 16
    AUTORADIOBUTTON "Blue", IDC_Blue, 25, 102, 50, 16
    PUSHBUTTON "OK", IDC_OK, 10, 125, 30, 15, NOT WS_TABSTOP
    PUSHBUTTON "Cancel", IDC_Cancel, 10+60+15, 125, 30, 15, NOT WS_TABSTOP
}

所有这些代码与我的矩形文件相同(相同的文件只有矩形而不是equil,也有高度和宽度而不仅仅是SideLength) - 这里是CShapesWin.cpp(调用对话框的地方):

#include <afxwin.h>
#include "CShapesWin.h"
#include "CRectDialog.h"
#include "CEquilDialog.h"
#include "CRectangleIds.h"
#include "CEquilateralIds.h"

CShapesWin::CShapesWin() {
    Create(NULL, "DrawShapes");
}

afx_msg void CShapesWin::OnPaint() {
    CPaintDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    m_doc.Paint(dc, rect);
}

afx_msg void CShapesWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
    CRectDialog rectDialog;
    CEquilDialog equilDialog;
    switch(nChar) {
        case 38: // Up arrow
        case 40: // Down arrow
            // Pop up a dialog box and get the response
            if (rectDialog.DoModal() == IDOK) {
                if (m_doc.Add(new CRectangle(rectDialog.m_nHeight, 
                    rectDialog.m_nWidth, rectDialog.m_Color)) == TRUE) {
                        Invalidate(TRUE);
                }
            }
            break;
        case 39: // Right arrow
        case 37: // Left arrow
            if (equilDialog.DoModal() == IDOK) {
                if (m_doc.Add(new CEquilateral(equilDialog.m_nSideLength, 
                    equilDialog.m_Color)) == TRUE) {
                        Invalidate(TRUE);
                }
            }
            else {
                MessageBox("Whoops, no dialoge box... :(");
            }
            break;
        default:
            MessageBox("Key not recognized");
    }
}

BEGIN_MESSAGE_MAP(CShapesWin, CFrameWnd)
    ON_WM_PAINT()
    ON_WM_KEYDOWN()
END_MESSAGE_MAP()

通过调试,我看到调用equilDialog.DoModel()尝试被调用,但它每次都失败,而我的rect.Dialog.DoModel()永远不会失败....我完全迷失了,如果任何人都可以帮助我会非常感激!

编辑:谢谢布莱恩,似乎我忘记了如何使用电脑!以下是包含zip文件的公共链接:http://dl.dropbox.com/u/1734050/SO%20Polygon%20Project.zip

编辑2:Martin,非常感谢,我唯一要做的就是确保CEquilDialog.cpp文件中的字符串在资源文件中匹配。一旦我这样做,对话框就像一个魅力。

对于MFC的新手并且遇到对话框问题,请记住以下内容:

在声明构造函数时,在任何dialog.cpp文件中:

CYourDialog::CYourDialog() : CDialog("StringToMatchInResourceFile") { m_nSomeVariable = 0; }

“StringToMatchInResourceFile”必须位于.rc文件中:

#include <afxres.h>
#include "CEquilateralIds.h"

StringToMatchInResourceFile DIALOG 50,50,150,150
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
...

我所做的是在dialog.cpp中有“Equilateral Triangle”,然后在.rc文件中有“Equilateral”。 MFC新手,* 注意! * a

1 个答案:

答案 0 :(得分:4)

找不到您的对话框资源。当您调用基类构造函数:CDialog(“Equilateral Triangles”)时,您告诉MFC和对话管理器您有一个对话框模板资源,其字符串为“Equilateral Triangles”。但你的rc文件没有。它有一个对话框资源,其id为Equilateral(我没有看到你在任何地方定义)。而是将IDD_EQUILATERAL作为101添加到equilateralids.h并在CDialog构造函数中引用它。

它可能适用于其他情况,因为您的ID及其字符串匹配。

作为补充,没有特殊的机制,每个项目只能获得一个.rc文件。因此,如果您有两个rc文件,请将它们合并到一个文件中。这也可能是错误的,因为第二个RC文件根本不会去任何地方。

马丁