一开始走了很多弯路,后来发现直接使用RichEdit2.0就OK.使用原因:由于RichEdit2.0A自动为宽字符(WideChar),所以它可以解决中文乱码以及一些汉字问题
一、原理:
添加两个重叠的RichEdit,然后设置行高为字体高度的一倍。两个错开,一个用于文本显示,一个用于用户输入。关闭窗口时判分。
二、在对话框里添加两个重叠的RICHEDIT2.0。
方法一:(msdn上的做法,适用于用VC.NET及以后版本创建的工程)
To update rich edit controls in existing Visual C++ applications to version 2.0,
open the .RC file as text, change the class name of each rich edit control from "RICHEDIT" to "RichEdit20a".
Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
方法二:以对话框为例:
(1) 增加一全局变量 HMODULE hMod;
(2) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
(3) 在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".
(4) 在对话框头文件添加 CRichEditCtrl m_richedit;
在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);
本文采用第二种方法。
三、初始化RichEdit(两个richedit都差不多,用户输入那个放在上面,所以要设置其为背景透明)
包括三个过程
1.读入文件
2.设置行高
3.设置字体
4.设置背景透明
/* 读入文件*/
/*设置行高*/
/*设置字体*/
/* 设置背景透明*/
三、关闭时候判分
//这个需要更改,写得太简单了
四、将用户输入文件保存
/*写文件*/
五、其他
1)vc刚开始的时候,默认的文本为选中,可设置
m_RichEd_test.SetSel(-1,0); //取消选择,光标会落在结束处。
关键是这个函数要写在OnShowWindow里面。
2)设置可换行
m_RichEd_test.SetOptions(ECOOP_OR,ES_MULTILINE|ES_WANTRETURN );
注意:用
::SetWindowLong(m_RichEd_test.GetSafeHwnd(),GWL_STYLE, ::GetWindowLong(m_RichEd_test.GetSafeHwnd(),GWL_STYLE)|ES_WANTRETURN); 这句话不行
本文实验环境:
VC6.0++
WINDOWS XP
//一些基本知识
关于SubClassDlgItem
http://www.cnblogs.com/SummerHeart/archive/2008/05/15/1197462.html
子类化
SubClass Dialog 上面的一个控件呀!
SubClass 某个控件后,其原来的 WindowProc 替换成你自己写的 CYourCWndClass 的 WindowProc,这样你就可以处理这个控件的所有消息了;用 ClassWizard 维护自己的 CYourCWndClass 就可以了。
在MFC中除了SubClassDlgItem外还有SubclassWindow函数用来执行同样的功能。在与某个控件ID关联起来之后,所有该控件的消息将会有该类来响应。通常使用过程如下
一、从希望Subclass的控件派生一个类例如从CEdit->CMyEdit;
二、在CMyEdit中完成希望处理的消息,例如OnChar等;
三、在对话框类中定义一个CMyEdit类的成员变量m_myEdit;
四、在Dialog的OnInitDialog中加入m_myEdit(IDC_EDIT, this);
这样当在IDC_EDIT上发生OnChar时,将会调用CMyEdit中的OnChar
补充一下,用一个窗口过程替换另一个过程的行为叫SUBCLASSING,这是WINDOWS意义上的派生子类,与面向对象语言的派生子类是完全不同的概念。SubClassDlgItem让对话框内指定子控制自己的窗口过程替代默认窗口过程,以拦截消息。
在VC 中,DoDataExchange函数中的DDX_Control之类的函数会调用SubClassDlgItem完成窗口子类化,这样控件自己就能处理消息了。
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
参数nID是控件的ID,pParent是指向父窗口的指针.若连接成功则函数返回TRUE,否则返回FALSE.
综上所述,要在程序中使用派生控件,应该按下面两步进行:
1、在对话框模板中放置好基类控件.
2、在对话框类中嵌入派生控件类的对象.
3、在OnInitDialog中调用SubclassDlgItem将派生类的控件对象与对话框中的基类控件相连接,则这个基类控件变成了派生控件.
例如,如果要在对话框中使用新设计的编辑框控件,应先在对话框模板中的合适位置放置一个普通的编辑框,然后,在OnInitDialog函数中按下面的方式调用SubclassDlgItem即可:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);
return TRUE;
}