errorC2664的问题,困扰我一天了,请指教。

yager123 2013-05-10 09:39:45
相同的步骤,我用VC6.0来做,可以编译成功,但用VS2008却出现了errorC2664的问题,百度了很多解决方式,但是都不能解决我的问题。请指教,例题如下:我用的VS2008会出错。
错误1error C2664: “BOOL CDC::TextOutA(int,int,const CString &)”: 不能将参数 3 从“char”转换为“const CString &”
我的工程设置是用的多字节字符集,没有用Unicode字符集。。。
按照下面的步骤我用VC6.0的MFC实现没有问题,但是用VS2008的MFC来做就有问题。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
设计一个应用程序,当用户每用鼠标左键单击程序窗口用户区时,都会在鼠标光标当前位置显示一个小写字母“m”,并且该程序中的数据以序列化的方式存盘。
(1)用MFC App Wizard以MFCexp9_6为名称创建一个多文档应用程序框架;
(2)创建一个CLetter类来描述小写字母“m"和鼠标键单击时光标的当前位置,即用户在程序用户区每按下左键一次,则会动态创建一个CLetter类对象。为使类具有序列化功能,CLetter类声明了一个无参数的构造函数,使用了序列化声明和实现宏,并从CObject基类派生。CLetter类声明及实现代码如下:
//CLetter类声明-------------------------------------------------------------------------
class CLetter : public CObject
{
DECLARE_SERIAL(CLetter)
public:
char m_sLetter; //字符成员变量
int m_X,m_Y;
public:
CLetter( );
CLetter(char ch,int x,int y);
virtual void Serialize(CArchive& ar); //重载序列化函数
public:
virtual ~CLetter( );
};
//CLetter类实现---------------------------------------------------------------------------
IMPLEMENT_SERIAL(CLetter,CObject,1)
CLetter:: CLetter( ){ }
CLetter::CLetter(char ch,int x,int y)
{
m_sLetter=ch;
m_X=x;
m_Y=y;
}
CLetter::~ CLetter( ){ }


//重写的序列化函数
void CLetter::Serialize(CArchive& ar)
{
if (ar.IsStoring( ))
{
ar<<m_sLetter<<m_X<<m_Y;
}
else
{
ar>>m_sLetter>>m_X>>m_Y;
}
}
(3)在文档中定义了一个MFC提供的CTypedPtrList类型的指针链表,用以存放用户按下鼠标左键时创建的CLetter类对象,为此包含了头文件afxtempl.h。除此之外,文档类还声明并实现了两个函数:NewLetter()和DrawLetter()。前者可以将新创建的CLetter对象加入链表,后者可根据链表中对象的数据进行显示。部分实现代码如下:
//文档声明的部分代码---------------------------------------------------------------
#include <afxtempl.h> //必须包含此文件
#include "Letter.h"

class CMFCexp9_6Doc : public CDocument
{
.
.
.
public:
CTypedPtrList<CObList,CLetter*> m_LetterList;
void NewLetter(int x,int y);
void DrawLetter(CDC*pDC);
.
.
.
virtual void Serialize(CArchive& ar);
.
.
.
DECLARE_MESSAGE_MAP()
};
//文档类实现的部分代码------------------------------------------------------------------
//向链表加入新对象的成员函数
void CMFCexp9_6Doc::NewLetter(int x,int y)
{
CLetter* pLetterItem = new CLetter('m',x,y);//创建新对象
m_LetterList.AddTail(pLetterItem); //将新对象加入链表尾部
SetModifiedFlag( ); //设置文档修改标志
}
void CMFCexp9_6Doc::DrawLetter(CDC*pDC )
{
POSITION pos=m_LetterList.GetHeadPosition();//获得链表头位置
while(pos!=NULL)
{
CLetter*Letter=m_LetterList.GetNext(pos);//获得链表元素

pDC->TextOut(Letter->m_X-5, //显示
Letter->m_Y-12,
Letter->m_sLetter);//问题就是此句
}
}
//序列化函数
void CMFCexp9_6Doc::Serialize(CArchive& ar)
{

m_LetterList.Serialize(ar);
}
(4)视图类比较简单,该类声明并实现了鼠标左键按下消息处理函数和视图更新函数。前者调用了文档类的NewLetter()以创建新的对象并把鼠标光标当前位置传递到对象中,后者调用了文档类的DrawLetter()进行数据的显示。
//视图类声明的部分代码-----------------------------------------------------------
class CMFCexp9_6View : public CView
{
.
.
.
public:
CMFCexp9_6Doc* GetDocument();

public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
.
.
.
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
//视图类实现的部分代码-----------------------------------------------------------
//鼠标消息处理函数

void CMFCexp9_6View::OnLButtonDown(UINT nFlags, CPoint point)
{
CMFCexp9_6Doc*pDoc=GetDocument();
pDoc->NewLetter(point.x,point.y);
Invalidate();
CView::OnLButtonDown(nFlags, point);
}

//更新显示函数
void CMFCexp9_6View::OnDraw(CDC* pDC)
{
CMFCexp9_6Doc* pDoc = GetDocument();
pDoc->DrawLetter(pDC);
ASSERT_VALID(pDoc);
}
...全文
3386 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wushuang443 2014-10-11
  • 打赏
  • 举报
回复
设置成unicode字符集试试
yager123 2013-05-21
  • 打赏
  • 举报
回复
引用 8 楼 FireBurn 的回复:
[quote=引用 6 楼 yager123 的回复:] [quote=引用 2 楼 FireBurn 的回复:]

CString strLetter = Letter->m_sLetter;

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter);
或者试试看这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter,
1);
尝试了,不对,error变成了C2440,错误 1 error C2440: “初始化”: 无法从“char”转换为“ATL::CStringT<BaseType,StringTraits>” [/quote] 看了一下,大致是由于CString 在2008里变成了模板类,赋值和构造函数有所变化。手头没有2008,无法实验。 lz可以试一下这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
(LPCTSTR)&Letter->m_sLetter,
1);
另外一定要确认字符集是否是多字节字符集[/quote] 好的,谢谢!
  • 打赏
  • 举报
回复
长尾巴的悟空 2013-05-12
  • 打赏
  • 举报
回复
把vc6的工程用同一个字符集,然后把工程文件在2008里再编译一下试试。
jielin2012 2013-05-12
  • 打赏
  • 举报
回复
Unicode 其中有一项设置为“未设置”
FireBurn 2013-05-12
  • 打赏
  • 举报
回复
引用 6 楼 yager123 的回复:
[quote=引用 2 楼 FireBurn 的回复:]

CString strLetter = Letter->m_sLetter;

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter);
或者试试看这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter,
1);
尝试了,不对,error变成了C2440,错误 1 error C2440: “初始化”: 无法从“char”转换为“ATL::CStringT<BaseType,StringTraits>” [/quote] 看了一下,大致是由于CString 在2008里变成了模板类,赋值和构造函数有所变化。手头没有2008,无法实验。 lz可以试一下这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
(LPCTSTR)&Letter->m_sLetter,
1);
另外一定要确认字符集是否是多字节字符集
yager123 2013-05-12
  • 打赏
  • 举报
回复
引用 5 楼 gofqjyie 的回复:
把vc6的工程用同一个字符集,然后把工程文件在2008里再编译一下试试。
这样也没问题,但是在2008里按步骤新建工程,编译会出错。
yager123 2013-05-12
  • 打赏
  • 举报
回复
引用 2 楼 FireBurn 的回复:

CString strLetter = Letter->m_sLetter;

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter);
或者试试看这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter,
1);
尝试了,不对,error变成了C2440,错误 1 error C2440: “初始化”: 无法从“char”转换为“ATL::CStringT<BaseType,StringTraits>”
路口转弯 2013-05-10
  • 打赏
  • 举报
回复
pDC->TextOut(Letter->m_X-5, //显示 Letter->m_Y-12, Letter->m_sLetter);//问题就是此句 你的这个要计算出你的长度,函数原型 BOOL TextOut( HDC hdc, // handle to DC int nXStart, // x-coordinate of starting position int nYStart, // y-coordinate of starting position LPCTSTR lpString, // character string int cbString // number of characters); 也就是像这样 pDC->TextOut(Letter->m_X-5, //显示 Letter->m_Y-12, strLetter, 1);
FireBurn 2013-05-10
  • 打赏
  • 举报
回复

CString strLetter = Letter->m_sLetter;

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter);
或者试试看这个

pDC->TextOut(Letter->m_X-5,	 //显示
Letter->m_Y-12,
strLetter,
1);
yager123 2013-05-10
  • 打赏
  • 举报
回复
求指教啊,C2664这个错误很常见,百度上说多是Unicode字符集的问题,但我的这个不是,原因不明啊。。。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧