Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2259965
  • 博文数量: 218
  • 博客积分: 5767
  • 博客等级: 大校
  • 技术积分: 5883
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-01 14:44
文章存档

2012年(53)

2011年(131)

2009年(1)

2008年(33)

分类: 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 *

阅读(12029) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~