当前位置:  开发笔记 > 编程语言 > 正文

如何将图像插入RichTextBox?

如何解决《如何将图像插入RichTextBox?》经验,为你挑选了3个好方法。

我看到的大多数例子都说要把它放在剪贴板上并使用粘贴,但这似乎不是很好,因为它会覆盖剪贴板.

我确实看到一种方法,使用pinvoke手动将图像放入RTF,将图像转换为wmf.这是最好的方法吗?我还能做更直接的事吗?



1> Sylverdrag..:

最直接的方法是修改RTF代码以自己插入图片.

在RTF中,图片的定义如下:

'{'\ pict(brdr?&shading?&picttype&pictsize&metafileinfo?)data'}'问号表示控制字是可选的."data"只是十六进制格式的文件内容.如果要使用二进制文件,请使用\ bin控制字.

例如:

{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860 hex data}
{\pict\pngblip\picw10449\pich3280\picwgoal5924\pichgoal1860\bin binary data}

\ pict =启动一个图片组,\ pngblip = png图片\ picwX =图片的宽度(X是像素值)\ pichX =图片的高度\ picwgoalX =图片的所需宽度,以缇为单位

因此,要插入图片,只需打开图片,将数据转换为十六进制,将这些数据加载到字符串中,并在其周围添加RTF代码以定义RTF图片.现在,您有一个包含图片数据的自包含字符串,您可以将其插入文档的RTF代码中.不要忘记关闭"}"

接下来,从RichTextBox(rtbBox.Rtf)获取RTF代码,将图片插入适当的位置,并设置rtbBox.Rtf的代码

您可能遇到的一个问题是.NET RTB对RTF标准没有很好的支持.

我刚刚制作了一个小应用程序*,它允许您快速测试RTB中的一些RTF代码并查看它如何处理它.您可以在此处下载: RTB测试仪(http://your-translations.com/toys).

您可以将一些RTF内容(例如,从Word)粘贴到左侧RTF框中,然后单击"显示RTF代码"以在右侧RTF框中显示RTF代码,或者您可以在右侧RTB中粘贴RTF代码并单击在"应用RTF代码"上查看左侧的结果.

您当然可以根据需要编辑代码,这样可以非常方便地测试RichTextBox是否支持您需要的命令,或者学习如何使用RTF控制字.

您可以在线下载RTF的完整规范.


NB这只是我在5分钟内拍了一下的小东西,所以我没有实现文件打开或保存,拖放或其他文明的东西.



2> 小智..:

我使用以下代码首先从剪贴板获取数据,将其保存在内存中,将图像设置在剪贴板中,将其粘贴到Rich Text Box中,最后在剪贴板中恢复数据.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    OpenFileDialog1.Filter = "All files |*.*"
    OpenFileDialog1.Multiselect = True
    Dim orgdata = Clipboard.GetDataObject

    If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
        For Each fname As String In OpenFileDialog1.FileNames
            Dim img As Image = Image.FromFile(fname)
            Clipboard.SetImage(img)
            RichTextBox1.Paste()

        Next
    End If
    Clipboard.SetDataObject(orgdata)
End Sub

OpenFileDailog1,RichTextBox1和Button1分别是打开文件对话框,富文本框和按钮控件.



3> 小智..:
private void toolStripButton1_Click(object sender, EventArgs e)
    {
        FileDialog fDialog = new OpenFileDialog();
        fDialog.CheckFileExists = true;
        fDialog.CheckPathExists = true;
        fDialog.RestoreDirectory = true;
        fDialog.Title = "Choose file to import";
        if (fDialog.ShowDialog() == DialogResult.OK)
        {
            string lstrFile = fDialog.FileName;
            Bitmap myBitmap = new Bitmap(lstrFile);
            // Copy the bitmap to the clipboard.
            Clipboard.SetDataObject(myBitmap);
            DataFormats.Format format = DataFormats.GetFormat(DataFormats.Bitmap);
            // After verifying that the data can be pasted, paste
            if(top==true && this.rtTop.CanPaste(format))
            {
                rtTop.Paste(format);
            }
            if (btmLeft == true && this.rtBottomLeft.CanPaste(format))
            {
                rtBottomLeft.Paste(format);
            }
            if (btmCenter == true && this.rtBottomCenter.CanPaste(format))
            {
                rtBottomCenter.Paste(format);
            }
            if (btmRight == true && this.rtBottomRight.CanPaste(format))
            {
                rtBottomRight.Paste(format);
            }
        }
    }


`== true`实际上是我见过的最无用的代码.
推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有