提前感谢你。
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
答案 0 :(得分:4)
找不到您的对话框资源。当您调用基类构造函数:CDialog(“Equilateral Triangles”)时,您告诉MFC和对话管理器您有一个对话框模板资源,其字符串为“Equilateral Triangles”。但你的rc文件没有。它有一个对话框资源,其id为Equilateral(我没有看到你在任何地方定义)。而是将IDD_EQUILATERAL作为101添加到equilateralids.h并在CDialog构造函数中引用它。
它可能适用于其他情况,因为您的ID及其字符串匹配。
作为补充,没有特殊的机制,每个项目只能获得一个.rc文件。因此,如果您有两个rc文件,请将它们合并到一个文件中。这也可能是错误的,因为第二个RC文件根本不会去任何地方。
马丁