全部博文(218)
分类: WINDOWS
2011-10-14 09:32:28
开发平台:visual studio 2010
(1).新建一个基于对话框的MFC,命名为"RichEditDemo"
(2)在主对话框上添加一个Rich Edit控件,将其ID修改为"IDC_EDIT",
(3)在CRichEditDemoApp的InitInstance函数中添加初始化代码:
//初始化Rich Edit控件
AfxInitRichEdit2();
注意visual studio 2010使用的是RichEdit2.0,所以这里AfxInitRichEdit2,否则使用AfxInitRichEdit
并通过类向导添加一个控件型成员变量,变量名为"m_edit".
(4).在主对话框上添加4个按钮控件,控件ID分别为"IDC_BTN_COLOR"."IDC_BTN_FONT"."IDC_BTN_SAVE"."IDC_BTN_LOAD".按钮文本分别为"颜色""字体""保存""打开"
通过类向导为上述4个按钮添加单击事件响应函数.代码如下"
//颜色按钮的响应函数
void CRichEditDemoDlg::OnBnClickedBtnColor()
{
// TODO: 在此添加控件通知处理程序代码
//自定义并初始化文字格式结构
CHARFORMAT cf={0};
cf.cbSize=sizeof(cf);
//取得文本框当前文字的格式
m_edit.GetSelectionCharFormat(cf);
//创建颜色对话框,并用取得的文字格式初始化对话框
CColorDialog dlg(cf.crTextColor,CC_FULLOPEN,this);
//显示对话框,选择颜色
if(dlg.DoModal()==IDOK)
{
//取得用户所选颜色
cf.crTextColor=dlg.GetColor();
//将文本格式信息设置到文本框当前文本
cf.dwMask=CFM_COLOR;
cf.dwEffects=0;
m_edit.SetSelectionCharFormat(cf);
}
}
//字体按钮的响应函数
void CRichEditDemoDlg::OnBnClickedBtnFont()
{
// TODO: 在此添加控件通知处理程序代码
//定义并初始化文字格式结构
CHARFORMAT cf={0};
cf.cbSize=sizeof(cf);
//取得文本框当前文字的格式
m_edit.GetSelectionCharFormat(cf);
//创建字体对话框,并用取得的文字格式初始化对话框
CFontDialog dlg(cf);
//显示对话框,选择字体信息
if(dlg.DoModal()==IDOK)
{
//取得用户所选字体信息
dlg.GetCharFormat(cf);
//将文本格式信息设置到文本框当前文本
cf.dwMask&=~CFM_COLOR;
m_edit.SetSelectionCharFormat(cf);
}
}
//保存按钮的响应函数
void CRichEditDemoDlg::OnBnClickedBtnSave()
{
// TODO: 在此添加控件通知处理程序代码
//显示一个保存文件对话框,以获取文本名
CFileDialog dlg(FALSE,_T("rtf"),NULL,
OFN_PATHMUSTEXIST |
OFN_OVERWRITEPROMPT |
OFN_HIDEREADONLY,
_T("*.rtf | *.rtf | *.* | *.*||" ),this);
if(dlg.DoModal()!=IDOK)
return;
//打开或创建文件
CString strFile=dlg.GetPathName();
CFile file;
if(!file.Open(strFile,CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox(_T("打开或创建文件夹失败!"));
return;
}
//生成回调数据
EDITSTREAM es={0};
es.dwCookie=(DWORD)&file;
es.pfnCallback=StreamOutProc;
//根据文件后缀,判断要保存RTF格式还是纯文本格式
int nFormat;
if(_tcsicmp(dlg.GetFileExt(),_T("rtf"))==0)
nFormat=SF_RTF;
else
nFormat=SF_TEXT;
//从控件获取数据
m_edit.StreamOut(nFormat,es);
//关闭文件
file.Close();
}
//打开按钮响应函数
void CRichEditDemoDlg::OnBnClickedBtnLoad()
{
// TODO: 在此添加控件通知处理程序代码
//显示一个打开对话框,以选择要打开的文件
CFileDialog dlg(TRUE,NULL,NULL,
OFN_FILEMUSTEXIST, _T("*.rtf | *.rtf | *.* | *.*||" ),this);
if(dlg.DoModal()!=IDOK)
return;
//打开文件
CString strFile=dlg.GetPathName();
CFile file;
if(!file.Open(strFile,CFile::modeRead))
{
AfxMessageBox(_T("打开文件失败!"));
return;
}
//清空文本框
m_edit.SetWindowText(_T(""));
//生成回调数据
EDITSTREAM es={0};
es.dwCookie=(DWORD)&file;
es.pfnCallback=streamInProc;
//判断文件后缀,以决定是否加载RTF格式文本
int nFormat;
if(_tcsicmp(dlg.GetFileExt(),_T("rtf"))==0)
nFormat=SF_RTF;
else
nFormat=SF_TEXT;
//向控件传输数据
m_edit.StreamIn(nFormat,es);
//关闭文件
file.Close();
}
(5).在主对话框类(RichEditDemoDlg.h)添加两个静态函数.作为RICH EDIT控件的输入.输入数据回调函数.声明如下:
protected:
static DWORD CALLBACK StreamOutProc(
DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb);
static DWORD CALLBACK streamInProc(
DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb);
(6)在RichEditDemoDlg.cpp中添加上述两个函数的实现代码:
//向控件传输数据的回调函数
DWORD CALLBACK CRichEditDemoDlg::streamInProc(
DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG * pcb)
{
//取得传进来的文件指针
CFile *pFile=(CFile*)dwCookie;
//从文件读取数据到缓冲
*pcb=pFile->Read(pbBuff,cb);
return 0;
}
//从控件传输数据的回调函数
DWORD CALLBACK CRichEditDemoDlg::StreamOutProc(
DWORD dwCookie,LPBYTE pbBuff,LONG cb,LONG *pcb)
{
//取得传进来的文件
CFile *pFile=(CFile*)dwCookie;
//向文件中写入数据
pFile->Write(pbBuff,cb);
*pcb=cb;
return 0;
}
我引用了别人写的一个类,error C2664: “BuildCommDCBW”: 不能将参数 1 从“char *”转换为“LPCWSTR”经常出现这样的错误,但我用同样的编译器编译别人的程序很正常,这是为什么啊?
因为你们两个的工程属性不一样,你是Unicode估计
方法1:
项目属性->常规->使用字符集 改为 使用多字节字符集
方法2:
将char*换为TCHAR *