导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

一个简单文字处理(实现文字输出,换行,和Backspace功能)

dengfei007 2009-08-11 09:52:50
为方便起见,我只写我有点不明白的地方,问题很小
void CMyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CFont fn;
fn.CreatePointFont(120,"楷体");
CFont *pOldfn=dc.SelectObject(&fn);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);
ShowCaret();
if ('\15'==nChar)
{
m_ptOrigin.x=0;
m_ptOrigin.y=m_ptOrigin.y+tm.tmHeight;
//m_ptOrigin.y+=tm.tmHeight;
m_strinput.Empty();
}
else if(0x08==nChar)
{
COLORREF Oldcolor;
Oldcolor=dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strinput);
m_strinput=m_strinput.Left(m_strinput.GetLength()-1);
dc.SetTextColor(Oldcolor);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strinput);
}
else
{
//m_strinput=m_strinput+nChar;在这里有问题!!!!!!!! m_strinput+=nChar;//接受其它字符输入 并且把输入的字符都赋值给字符串
}
CSize sz;
sz=dc.GetTextExtent(m_strinput);
CPoint newpt;
newpt.x=sz.cx;
newpt.y=m_ptOrigin.y;
SetCaretPos(newpt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strinput);
dc.SelectObject(pOldfn);




CView::OnChar(nChar, nRepCnt, nFlags);
}
1:我注释那一行和下面是不是一个意思?
2:另外nChar是int类型的 而m_strinput是CString类型的,这样可以用+号吗 ?
3:我又用m_strinput+ =nChar;代替了m_strinput+=nChar;这样就无法运行了 这两个有区别?
4:我在线等 要是有不明白我说的意思的 我可以进一步解释
...全文
105 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengfei007 2009-08-11
哈哈 谢谢!
回复
Fireway2008 2009-08-11
不好意思,应该用%c, 刚才打错了……
回复
yuhudie203 2009-08-11
[Quote=引用 11 楼 dengfei007 的回复:]
C/C++ codeelse
{
CString newstr;
newstr.Format("%s",nChar);
m_strinput=m_strinput+newstr;// m_strinput+=nChar;
}
我现在已经改成这样了 也通过编译了 一运行后输入字符就出现一个对话框说是内存错误什么的(我用的VC6.0)
[/Quote]
newstr.Format("%s",nChar);出错啊 nChar是一个字符
应该用%c 你试试
newstr.Format("%c",nChar);
回复
dengfei007 2009-08-11
有人吗??
回复
dengfei007 2009-08-11
	else
{
CString newstr;
newstr.Format("%s",nChar);
m_strinput=m_strinput+newstr;
// m_strinput+=nChar;

}

我现在已经改成这样了 也通过编译了 一运行后输入字符就出现一个对话框说是内存错误什么的(我用的VC6.0)
回复
Fireway2008 2009-08-11
[Quote=引用 8 楼 dengfei007 的回复:]

哦 谢谢 啊 不过我还是不是很明白 我没用转换str.Format("%s", nChar); 直接用的m_strinput+=nChar;就可以正常运行啊 为什么啊
[/Quote]
你可以尝试如下语句:
m_strinput+= _T(‘X’);
m_strinput = m_strinput + _T('X');
看看执行效果如何?


一般而言,CString 的运算操作需要对2个相同类进行的,上边语句也可以通过运行,是因为进行了强制转换,如果我没记错的话,VC6里边可以,可是再高一点的版本,如VC.net VS2005 VS2008就有严格的检查机制,不转换就不行。

具体,你先查查Format函数的用法,很重要。
回复
dengfei007 2009-08-11
怎么没人了???
回复
dengfei007 2009-08-11
[Quote=引用 6 楼 fireway2008 的回复:]
另外,你在编辑的时候,看到 回复内容面板上边的按钮了吗?
在字体A 旁边有一个#+一张纸的 图标按钮,
先把你的代码选定,然后点击它就可以出现VC样式的代码了 。

例如:
C/C++ codeCSize sz;
sz=dc.GetTextExtent(m_strinput);
CPoint newpt;
newpt.x=sz.cx;
newpt.y=m_ptOrigin.y;
SetCaretPos(newpt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strinput);
dc.SelectObject(pOldfn);
[/Quote]
哦 谢谢 啊 不过我还是不是很明白 我没用转换str.Format("%s", nChar); 直接用的m_strinput+=nChar;就可以正常运行啊 为什么啊
回复
yuhudie203 2009-08-11
[Quote=引用 5 楼 fireway2008 的回复:]
引用 1 楼 dengfei007 的回复:

1:我注释那一行和下面是不是一个意思?
2:另外nChar是int类型的 而m_strinput是CString类型的,这样可以用+号吗 ?
3:我又用m_strinput+ =nChar;代替了m_strinput+=nChar;这样就无法运行了 这两个有区别?
4:我在线等 要是有不明白我说的意思的 我可以进一步解释

补充下运行错误如下:
E:\代码\VC\临时代码\简单文字处理程序\简单文字处理程序View.cpp(155) : error C2666: '+' : 4 overloads have similar conversions


1. 意义是相同的,但是用上的运算符不同;

2. 不可以,你应该用一个CString str;
str.Format("%s", nChar);
进行转换后,才可以进行相加操作;

3. + = 中间多个空格,明显语法错误;

4。 错误提示的意思是说,你的+运算出现重复相似的定义,
应该是因为前几个问题引起的,先修复前几个问题看看。
[/Quote]
5楼的回复你可以参考下 基本就是正确答案了,
字符串不能用来加字符~也不能用来加整数,要相加必选先转换成字符串
回复
Fireway2008 2009-08-11
另外,你在编辑的时候,看到 回复内容面板上边的按钮了吗?
在字体A 旁边有一个#+一张纸的 图标按钮,
先把你的代码选定,然后点击它就可以出现VC样式的代码了 。

例如:
CSize sz; 
sz=dc.GetTextExtent(m_strinput);
CPoint newpt;
newpt.x=sz.cx;
newpt.y=m_ptOrigin.y;
SetCaretPos(newpt);
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,m_strinput);
dc.SelectObject(pOldfn);
回复
Fireway2008 2009-08-11
[Quote=引用 1 楼 dengfei007 的回复:]

1:我注释那一行和下面是不是一个意思?
2:另外nChar是int类型的 而m_strinput是CString类型的,这样可以用+号吗 ?
3:我又用m_strinput+ =nChar;代替了m_strinput+=nChar;这样就无法运行了 这两个有区别?
4:我在线等 要是有不明白我说的意思的 我可以进一步解释

补充下运行错误如下:
E:\代码\VC\临时代码\简单文字处理程序\简单文字处理程序View.cpp(155) : error C2666: '+' : 4 overloads have similar conversions

[/Quote]
1. 意义是相同的,但是用上的运算符不同;

2. 不可以,你应该用一个CString str;
str.Format("%s", nChar);
进行转换后,才可以进行相加操作;

3. + = 中间多个空格,明显语法错误;

4。 错误提示的意思是说,你的+运算出现重复相似的定义,
应该是因为前几个问题引起的,先修复前几个问题看看。
回复
dengfei007 2009-08-11
[Quote=引用 3 楼 yuhudie203 的回复:]
1.那样用是错误的 字符串不能+字符
2.不能
3.+ = 不是一个运算符,不能代表+=
[/Quote]
那为什么那样写对啊 那样写也是一个自反算术赋值运算符啊
回复
yuhudie203 2009-08-11
1.那样用是错误的 字符串不能+字符
2.不能
3.+ = 不是一个运算符,不能代表+=
回复
dengfei007 2009-08-11
我晕 怎么一贴代码就这样了 我把正确代码再复制下
else
{
//m_strinput=m_strinput+nChar;错误代码
m_strinput+=nChar; 正确代码
// m_strinput+ =nChar; 错误代码
}
其中nChar是int型的,m_strinput是CString类型的
回复
dengfei007 2009-08-11
补充下运行错误如下:
E:\代码\VC\临时代码\简单文字处理程序\简单文字处理程序View.cpp(155) : error C2666: '+' : 4 overloads have similar conversions
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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