用RichEditCtrl写的一个读取.rtf格式的程序(rtfdemo)

来源:互联网 发布:find ubuntu 编辑:程序博客网 时间:2024/05/14 08:26

一部分

 // rtfdemoView.h : CrtfdemoView 类的接口
//


#pragma once
#include "afxcmn.h"


class CrtfdemoView : public CView
{
protected: // 仅从序列化创建
 CrtfdemoView();
 DECLARE_DYNCREATE(CrtfdemoView)

// 属性
public:
 CrtfdemoDoc* GetDocument() const;

// 操作
public:

// 重写
 public:
 virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

// 实现
public:
 virtual ~CrtfdemoView();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// 生成的消息映射函数
protected:
 DECLARE_MESSAGE_MAP()
public:
 CRichEditCtrl m_rich;
 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnSize(UINT nType, int cx, int cy);
 afx_msg void OnRtfopen();
 bool IsValidFilename(CString const& strFilename);
 void ReadRTFDocument(CString const& strFilename);
 CString m_strFilename;
};

#ifndef _DEBUG  // rtfdemoView.cpp 的调试版本
inline CrtfdemoDoc* CrtfdemoView::GetDocument() const
   { return reinterpret_cast<CrtfdemoDoc*>(m_pDocument); }
#endif

二部分

// rtfdemoView.cpp : CrtfdemoView 类的实现
//

#include "stdafx.h"
#include "rtfdemo.h"

#include "rtfdemoDoc.h"
#include "rtfdemoView.h"
#include "./rtfdemoview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static DWORD CALLBACK MyStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
  CFile* pFile = (CFile*) dwCookie;
  *pcb = pFile->Read(pbBuff, cb);
  return 0;
}

// CrtfdemoView

IMPLEMENT_DYNCREATE(CrtfdemoView, CView)

BEGIN_MESSAGE_MAP(CrtfdemoView, CView)
 // 标准打印命令
 ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
 ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
 ON_WM_CREATE()
 ON_WM_SIZE()
 ON_COMMAND(ID_RTFOPEN, OnRtfopen)
END_MESSAGE_MAP()

// CrtfdemoView 构造/析构

CrtfdemoView::CrtfdemoView()
: m_strFilename(_T(""))
{
 // TODO: 在此处添加构造代码

}

CrtfdemoView::~CrtfdemoView()
{
}

BOOL CrtfdemoView::PreCreateWindow(CREATESTRUCT& cs)
{
 // TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
 // 样式

 return CView::PreCreateWindow(cs);
}

// CrtfdemoView 绘制

void CrtfdemoView::OnDraw(CDC* /*pDC*/)
{
 CrtfdemoDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!pDoc)
  return;

 // TODO: 在此处为本机数据添加绘制代码
}


// CrtfdemoView 打印

BOOL CrtfdemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
 // 默认准备
 return DoPreparePrinting(pInfo);
}

void CrtfdemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: 打印前添加额外的初始化
}

void CrtfdemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
 // TODO: 打印后添加清除过程
}


// CrtfdemoView 诊断

#ifdef _DEBUG
void CrtfdemoView::AssertValid() const
{
 CView::AssertValid();
}

void CrtfdemoView::Dump(CDumpContext& dc) const
{
 CView::Dump(dc);
}

CrtfdemoDoc* CrtfdemoView::GetDocument() const // 非调试版本是内联的
{
 ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CrtfdemoDoc)));
 return (CrtfdemoDoc*)m_pDocument;
}
#endif //_DEBUG


// CrtfdemoView 消息处理程序

int CrtfdemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 CRect rect(0,0,0,0);
 
 if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

 // TODO:  在此添加您专用的创建代码
 m_rich.Create(ES_MULTILINE |ES_AUTOVSCROLL |ES_WANTRETURN |
  WS_CHILD|WS_VISIBLE|WS_VSCROLL,rect,this,1);

 return 0;
}

void CrtfdemoView::OnSize(UINT nType, int cx, int cy)
{
 CRect rect;
 CView::OnSize(nType, cx, cy);

 // TODO: 在此处添加消息处理程序代码
 GetClientRect(rect);
 m_rich.SetWindowPos(&wndTop,0,0,rect.right -rect.left ,rect.bottom -rect.top ,SWP_SHOWWINDOW);
}

void CrtfdemoView::OnRtfopen()
{
 // TODO: 在此添加命令处理程序代码
 CFileDialog m_findDlg(TRUE);
  //m_findDlg.m_ofn.lpstrFilter = "RTF Documents (*.RTF)/0*.rtf/0/0";
  m_findDlg.m_ofn.lpstrFilter = "RTF Documents (*.RTF)/0*.rtf/0/0";
  if (IDOK == m_findDlg.DoModal())
  {
    if (IsValidFilename(m_findDlg.GetFileName()))
    {
      m_strFilename = m_findDlg.GetPathName();
      UpdateData(FALSE);
      ReadRTFDocument(m_strFilename);
    }
    else
    {
      AfxMessageBox("Invalid file name");
    }
  }

}

bool CrtfdemoView::IsValidFilename(CString const& strFilename)
{
 BOOL bSuccess = FALSE;
  if (4 < strFilename.GetLength())
  {
    CString str = strFilename.Right(4);
    if (0 == str.CompareNoCase(".RTF"))
      bSuccess = TRUE;
  }
  return bSuccess;
}

void CrtfdemoView::ReadRTFDocument(CString const& strFilename)
{
 CFile file(strFilename, CFile::modeRead);
  EDITSTREAM es;
  es.dwCookie = (DWORD) &file;
  es.pfnCallback = MyStreamInCallback;
  m_rich.StreamIn(SF_RTF, es);

}
三部分

  作为例子,这个程序有很多值得细细学习的地方,很细节的东东噢!我还在查MSDN找这里面的比较生僻的函数和结构。

原创粉丝点击