65.9K
CodeProject 正在变化。 阅读更多。
Home

支持表格和图像的示例编辑器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.28/5 (15投票s)

2005年7月15日

1分钟阅读

viewsIcon

157428

downloadIcon

4926

使用新的富文本编辑控件 4.1 来支持编辑器中的表格和图像。

Sample screenshot

引言

TapEditor 只是一个编辑器应用程序,用于演示如何使用新文档的 msfedit.dll 来支持我们的编辑器添加表格。

在这个新版本中,富文本编辑控件支持一些新功能。表格就是其中之一。现在我们使用下面的代码来帮助你的编辑器支持表格。有关 richedit 控件 4.1 的更多信息,您可以访问 链接。

使用代码

  1. 创建一个基本视图为 CrichEditView 的编辑器。
  2. 在编辑器的 InitInstance() 函数中,添加以下代码来加载 msfedit.dll
    // Initialize RichEdit control
    if (LoadLibrary(_T("MSFTEDIT.DLL")) == NULL)
    {
        AfxMessageBox(_T("Could not load the RichControl Dll."), 
                                      MB_OK|MB_ICONEXCLAMATION);
        return FALSE;
    }
  3. 在视图的 PreCreateWindow 函数中,像这样指定,以告诉视图创建新富文本编辑控件版本的类 RICHEDIT50W
    BOOL CTapEditorView::PreCreateWindow(CREATESTRUCT& cs)
    {
        BOOL bRes = CRichEditView::PreCreateWindow(cs);
        cs.style |= ES_SELECTIONBAR;
        cs.lpszClass = szClassRE; // Create RICHEDIT50W class
        return bRes;
    }

    请将此代码添加到 CPP 视图文件的顶部。

    static const TCHAR szClassRE[] = TEXT("RICHEDIT50W");
  4. 现在要插入表格,添加一个新函数,例如 OnInsertTable,并指定如下代码
    void CTapEditorView::OnInsertTable() 
    {
        CInsertTableDlg dlg;
    
        if(dlg.DoModal() == IDCANCEL)
            return;
    
        int rows = dlg.m_nRows,
        cols = dlg.m_nColumns;
    
        CString s = "{\\rtf1";
        CString s = "{\\rtf1";
        CString sTable = s + 
            "file://ansi//ansicpg1252//deff0//deflang1033{//fonttbl"
            "{\\f0\\froman\\fprq2\\fcharset0 Times New Roman;}"
            "{\\f1\\fswiss\\fcharset0 Arial;}}"
            "{\\*\\generator Msftedit 5.41.15.1503;}\\viewkind4\\uc1";
        CString row,col;
        row = "file://trowd//trgaph108//trleft8//"  
              "trbrdrl//brdrs//brdrw10 file://trbrdrt//"
              "brdrs\\brdrw10 file://trbrdrr//brdrs//" 
              "brdrw10 file://trbrdrb//brdrs//brdrw10 \\"
              "trpaddl108\\trpaddr108\\trpaddfl3\\trpaddfr3";
        col = "file://clbrdrl//brdrw10//brdrs//clbrdrt//brdrw10//brdrs//clbrdrr//"
            "brdrw10\\brdrs\\clbrdrb\\brdrw10\\brdrs\\cellx";
        CString endcell = "file://cell/";
        CString endrow = "file://row/";
        int i,j;
        int width = 8748/cols;
        CString sColw;
     
        // Loop for numbers of rows
        for(i=0;i<rows;i++)
        {
            sTable += row;
    
            // Loop for number of columns
            for(j=0;j<cols;j++)
            {
                sTable += col;
                sColw.Format(_T("%d"),width *(j+1));
                sTable += sColw;
            }
            sTable += "file://pard//intbl";
            for(j=0;j<cols;j++)
            {
                sTable += endcell;
            }
            sTable += endrow;
        }
        sTable += "file://par}";/
    
    #ifdef _UNICODE
        LONG len = sTable.GetLength() * 2;
        char* data = new char[len + 1];
        ClearString(sTable, data);
        SETTEXTEX st;
        st.codepage = 1200; 
        st.flags = ST_SELECTION | ST_KEEPUNDO;
        SendMessage(EM_SETTEXTEX, (WPARAM)&st, (LPARAM)(LPCTSTR)data);
        delete data;
    #else
        SetTextEX(m_hWnd, sTable, ST_SELECTION|ST_KEEPUNDO, 1200);
    #endif
    
    }
  5. 要插入图像,再次像上面一样使用新函数 OnInsertImage,并使用下面的代码
    void CTapEditorView::OnInsertImage()
    {
        CString sFilter = "All image file|*.bmp;*.jpg;*.gif|"
           "Bitmap Files (*.bmp)|*.bmp|JPEG Files (*.jpg)|*.jpg|"
           "GIF Files (*.gif)|*.gif|";
        CFileDialog dlg(TRUE, NULL, NULL, 
           OFN_FILEMUSTEXIST|OFN_READONLY, sFilter);
        if(dlg.DoModal() == IDOK)
        {
            CTapBitmap bmp;
            if(bmp.Load(dlg.GetPathName())==FALSE)
            {
                AfxMessageBox(_T("Could not load image."));
                return;
            }
            CEnBitmap enBitmap;
            CBitmap Bitmap;
            if (enBitmap.Attach(bmp.GetBMP(), 0))
            {
                Bitmap.DeleteObject();
                Bitmap.Attach(enBitmap.Detach());
    
                IRichEditOle *pRichEditOle;
                pRichEditOle = GetRichEditCtrl().GetIRichEditOle();
                HBITMAP hBitmap = (HBITMAP)Bitmap;
                if(hBitmap)
                {
                    CImageDataObject::InsertBitmap(pRichEditOle, hBitmap);
                }
            }
        }
    }
  6. 最后,不要忘记包含头文件。

    包含 tapex.h 文件以插入表格。

    #include "tapex.h"

    并包含 TapBitmap.hEnBitmap.hImageDataObject.h 以插入图像。

    #include "TapBitmap.h"
    #include "EnBitmap.h"
    #include "ImageDataObject.h"

此示例适用于 VC++ 6,因此如果您不想出现错误,则不需要添加 richedit.h 头文件。

如果您使用 Visual Studio .NET 或 VC++ 7,则不需要使用 tapex.htapex.cpp 文件。有关更多信息,请使用 链接。

© . All rights reserved.