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:击键后对话框不显示的主要内容,如果未能解决你的问题,请参考以下文章