下面是用visual studio (VC++中MFC)编译的一个程序,出了几个错误,不知道怎么解决,恳请高手帮忙。谢谢
错误提示:e:\VC++\MFC\MFCView.cpp(112):errorC2660:“CDC::SelectGdiObject”:函数不接受1个参数e:\VC++\...
错误提示:
e:\VC++\MFC\MFCView.cpp(112): error C2660: “CDC::SelectGdiObject” : 函数不接受 1 个参数
e:\VC++\MFC\MFCView.cpp(125): error C3861: “sin”: 即使使用参数相关的查找,也未找到标识符
e:\VC++\MFC\MFCView.cpp(136): error C2146: 语法错误 : 缺少“;”(在标识符“pdc”的前面)
e:\VC++\MFC\MFCView.cpp(135): error C3861: “cos”: 即使使用参数相关的查找,也未找到标识符
源程序如下:
// MFCView.cpp : CMFCView 类的实现
//
#include "stdafx.h"
#include "MFC.h"
#include "MFCDoc.h"
#include "MFCView.h"
#include ".\mfcview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMFCView
IMPLEMENT_DYNCREATE(CMFCView, CView)
BEGIN_MESSAGE_MAP(CMFCView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_COMMAND(ID_32772, On32772)
END_MESSAGE_MAP()
// CMFCView 构造/析构
CMFCView::CMFCView()
{
// TODO: 在此处添加构造代码
}
CMFCView::~CMFCView()
{
}
BOOL CMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CView::PreCreateWindow(cs);
}
// CMFCView 绘制
void CMFCView::OnDraw(CDC* /*pDC*/)
{
CMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
}
// CMFCView 打印
BOOL CMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CMFCView 诊断
#ifdef _DEBUG
void CMFCView::AssertValid() const
{
CView::AssertValid();
}
void CMFCView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMFCDoc* CMFCView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDoc)));
return (CMFCDoc*)m_pDocument;
}
#endif //_DEBUG
// CMFCView 消息处理程序
void CMFCView::On32772()
{
// TODO: 在此添加命令处理程序代码
int i,j,px,py;
double x,y,a;
const double PI=3.1416;
CClientDC *pdc=new CClientDC(this);
CPen pen;
pen.CreatePen (PS_SOLID,1,RGB(0xff,0,0));
CPen *oldpen=(CPen*)pdc->SelectGdiObject (&pen);
i=0,j=0;
for(px=10;px<350;px+=60)
{
i=i+1;
for(py=10;py<=350;py+=60)
{
if(j==6) j=1;
else {j=j+1;}
if((i%2)==(j%2))
{
for(a=0;a<=PI;a+=PI/15)
{
y=60-60*sin(a);
pdc->MoveTo ((int)px,py+(int)y);
pdc->LineTo (px+60,py+(int)y);
}
}
else
{
for(a=0;a<=PI;a+=PI/25)
{
x=30-30*cos(a)
pdc->MoveTo (px=(int)x,py);
pdc->LineTo (px+(int)x,py+60);
}
}
}
}
pdc->DeleteDC ();
} 展开
e:\VC++\MFC\MFCView.cpp(112): error C2660: “CDC::SelectGdiObject” : 函数不接受 1 个参数
e:\VC++\MFC\MFCView.cpp(125): error C3861: “sin”: 即使使用参数相关的查找,也未找到标识符
e:\VC++\MFC\MFCView.cpp(136): error C2146: 语法错误 : 缺少“;”(在标识符“pdc”的前面)
e:\VC++\MFC\MFCView.cpp(135): error C3861: “cos”: 即使使用参数相关的查找,也未找到标识符
源程序如下:
// MFCView.cpp : CMFCView 类的实现
//
#include "stdafx.h"
#include "MFC.h"
#include "MFCDoc.h"
#include "MFCView.h"
#include ".\mfcview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMFCView
IMPLEMENT_DYNCREATE(CMFCView, CView)
BEGIN_MESSAGE_MAP(CMFCView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_COMMAND(ID_32772, On32772)
END_MESSAGE_MAP()
// CMFCView 构造/析构
CMFCView::CMFCView()
{
// TODO: 在此处添加构造代码
}
CMFCView::~CMFCView()
{
}
BOOL CMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return CView::PreCreateWindow(cs);
}
// CMFCView 绘制
void CMFCView::OnDraw(CDC* /*pDC*/)
{
CMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
}
// CMFCView 打印
BOOL CMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默认准备
return DoPreparePrinting(pInfo);
}
void CMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印前添加额外的初始化
}
void CMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 打印后添加清除过程
}
// CMFCView 诊断
#ifdef _DEBUG
void CMFCView::AssertValid() const
{
CView::AssertValid();
}
void CMFCView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMFCDoc* CMFCView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCDoc)));
return (CMFCDoc*)m_pDocument;
}
#endif //_DEBUG
// CMFCView 消息处理程序
void CMFCView::On32772()
{
// TODO: 在此添加命令处理程序代码
int i,j,px,py;
double x,y,a;
const double PI=3.1416;
CClientDC *pdc=new CClientDC(this);
CPen pen;
pen.CreatePen (PS_SOLID,1,RGB(0xff,0,0));
CPen *oldpen=(CPen*)pdc->SelectGdiObject (&pen);
i=0,j=0;
for(px=10;px<350;px+=60)
{
i=i+1;
for(py=10;py<=350;py+=60)
{
if(j==6) j=1;
else {j=j+1;}
if((i%2)==(j%2))
{
for(a=0;a<=PI;a+=PI/15)
{
y=60-60*sin(a);
pdc->MoveTo ((int)px,py+(int)y);
pdc->LineTo (px+60,py+(int)y);
}
}
else
{
for(a=0;a<=PI;a+=PI/25)
{
x=30-30*cos(a)
pdc->MoveTo (px=(int)x,py);
pdc->LineTo (px+(int)x,py+60);
}
}
}
}
pdc->DeleteDC ();
} 展开
展开全部
楼上说的对,要是SelectGdiObject还有错,可以将SelectGdiObject换成SelectObject,很可能是这个错误,我在MSDN上未找到这个函数,可能是它错了。 要是是说sin,cos未找到标识符,可以在
stdafx.h中加入#include <math.h> ,但是一般的MFC程序会包含这个头文件,这就很奇怪
pdc->MoveTo (px=(int)x,py);
中的=应该是+吧
pdc->DeleteDC ();这句是错了的,因为原来使用new用堆来动态构造CClient对象,不用了的话,
应该用delete掉,而pdc->DeleteDC ();释放了pdc->m_hDC这个成员变量而已,其他成员数据以及
本身均并没有删除,会发生内存泄露。
还有就是【猪无为】说的
“或者根本就不要new出来CClientDC,给人感觉怪怪的,一般都是直接构造对象,如
CClientDC clientDC(this);
CClientDC* pdc = &clientDC; “
这个说法是不对的,使用new或直接用栈来构造对象都是可以的,没有什么怪不怪的,只是
用new构造对象是一件很复杂的事,需要额外动用很多资源,所以在一般情况下不建议使用
堆(new)来构造对象,再说释放也得自己释放,是件麻烦事。
另外x=30 - 30 * cos(a)句是后边少了“;”的(猪无为)。
stdafx.h中加入#include <math.h> ,但是一般的MFC程序会包含这个头文件,这就很奇怪
pdc->MoveTo (px=(int)x,py);
中的=应该是+吧
pdc->DeleteDC ();这句是错了的,因为原来使用new用堆来动态构造CClient对象,不用了的话,
应该用delete掉,而pdc->DeleteDC ();释放了pdc->m_hDC这个成员变量而已,其他成员数据以及
本身均并没有删除,会发生内存泄露。
还有就是【猪无为】说的
“或者根本就不要new出来CClientDC,给人感觉怪怪的,一般都是直接构造对象,如
CClientDC clientDC(this);
CClientDC* pdc = &clientDC; “
这个说法是不对的,使用new或直接用栈来构造对象都是可以的,没有什么怪不怪的,只是
用new构造对象是一件很复杂的事,需要额外动用很多资源,所以在一般情况下不建议使用
堆(new)来构造对象,再说释放也得自己释放,是件麻烦事。
另外x=30 - 30 * cos(a)句是后边少了“;”的(猪无为)。
展开全部
对综合一下,就是要加上#include <math.h>
然后x=30 - 30 * cos(a)句后边少了“;”
SelectGdiObject改为SelectObject
另外最后一句pdc->DeleteDC();
个人感觉应该是换成
pdc->SelectObejct(oldPen);
delete pdc;
或者根本就不要new出来CClientDC,给人感觉怪怪的,一般都是直接构造对象,如
CClientDC clientDC(this);
CClientDC* pdc = &clientDC;
然后x=30 - 30 * cos(a)句后边少了“;”
SelectGdiObject改为SelectObject
另外最后一句pdc->DeleteDC();
个人感觉应该是换成
pdc->SelectObejct(oldPen);
delete pdc;
或者根本就不要new出来CClientDC,给人感觉怪怪的,一般都是直接构造对象,如
CClientDC clientDC(this);
CClientDC* pdc = &clientDC;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
x=30-30*cos(a)
pdc->MoveTo (px=(int)x,py);
有错误
要改成
x=30-30*cos(a);
pdc->MoveTo (px=(int)x,py);
pdc->MoveTo (px=(int)x,py);
有错误
要改成
x=30-30*cos(a);
pdc->MoveTo (px=(int)x,py);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
同意猪无为的观点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询