MFC:击键后对话框不显示

Posted

技术标签:

【中文标题】MFC:击键后对话框不显示【英文标题】:MFC: Dialog box not displaying after keystroke 【发布时间】:2011-05-21 05:55:16 【问题描述】:

提前感谢您的时间。

对 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:马丁,非常感谢,我唯一要做的就是确保 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 中添加“等边三角形”,然后在 .rc 文件中添加“等边三角形”。 MFC 新手,*注意!*a

【问题讨论】:

你不能在 Stack Overflow 上 PM。压缩文件,然后发布一个链接。 【参考方案1】:

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

它可能适用于另一种情况,因为您的 ID 和它的字符串匹配。

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

马丁

【讨论】:

Martyn,我非常感谢您的建议。我将在早上尝试进行这些更改,并报告我有希望的成功!非常感谢您的好意,请原谅我对 MFC 的理解不佳。

以上是关于MFC:击键后对话框不显示的主要内容,如果未能解决你的问题,请参考以下文章

MFC ActiveX 击键

屏幕键盘上的 MFC C++ 作为父对话框

添加 syslink 不显示 mfc 对话框

从 mfc 扩展 dll 导出的无模式对话框不显示

MFC 对话框不显示,返回-1 原因

MFC 对话框中的 Visual C++ 数据不显示