试图以另一种形式显示图像

时间:2015-08-12 13:38:43

标签: c#

我正在尝试使用C#创建聊天程序。在我的程序中,我有一个表情符号表单,其中包含表情符号列表。我想在主窗体中的richtextbox中显示它们。知道怎么样?我被困在试图解决这个问题。我真的不知道怎么做。

顺便说一句,表情符号是按钮。我已经尝试在文本框中显示它们但只是以相同的形式显示它们。每当我点击表情符号时,我希望它显示在主窗体的richtextbox中。

This is my main form

My emoticon

嗯,我尝试的唯一代码就是在表情符号表单的richtextbox上显示它,如下所示:

public void Image(Bitmap displayPic)
{
    Clipboard.SetDataObject(displayPic);
    DataFormats.Format imgFormat = DataFormats.GetFormat(DataFormats.Bitmap);
    if (richTextBox1.CanPaste(imgFormat))
    {
        richTextBox1.Paste(imgFormat);
    }
    else
    {
        MessageBox.Show("The data format provided is not supported by this control.");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Bitmap bit = new Bitmap(Properties.Resources.shocked);
    Image(bit);
}

3 个答案:

答案 0 :(得分:1)

您可以使用剪贴板尝试这样:

情感表格 点击情感你有这个代码:

Form1 f1 = new Form1();
Image img = Image.FromFile(fname)
Clipboard.SetImage(img);
f1.insertImotion()

聊天表单

public void insertImotion(Clipboard)
{
RichTextBox1.Paste();
}

答案 1 :(得分:1)

基本上,您只需要建立一个通信系统。在这种情况下,您通常不会直接访问富文本框,而是要求表单很好“请将此表情符号插入文本中”。

这可以通过为主窗体提供一个公共函数来插入所述笑脸,使表情符号形成一个构造函数来接受主窗体的对象类型,并将主窗体的对象存储在表情符号形式的私有变量中,这样就可以了可以随时拨打电话。

对于线程安全性,Delegates应该用于以不同的形式访问任何UI东西,因为它在另一个线程上运行。你应该谷歌一点,以了解更多相关信息。

Form MainForm
{
    // Button to open the smileys window. Note you give "this" (MainForm)
    // to the EmoteForm so it can call this object's public functions.
    private void btnOpenEmoticons_Click(object sender, EventArgs e)
    {
        // open the smileys window, giving this as parameter
        EmoteForm emoticons = new EmoteForm(this);
        emoticons.Show();
    }

    // Delegates are always needed to access user interface stuff from external
    // sources, since they generally run on different threads.
    private delegate void InsertEmoticonDelegate(RichTextBox rtb, String emotCode);

    //The function you call from the emoticons form
    public void InsertEmoticon(String emotCode)
    {
        // Invoke and Delegate are needed for thread safety:
        // you're asking this nicely, not stuffing it in there.
        chatTextBox.Invoke(new InsertEmoticonDelegate(AddEmoticon), chatTextBox, emotCode));
    }

    // needs to match the Delegate so it can be called with Invoke
    private void AddEmoticon(RichTextBox rtb, String emotCode)
    {
        // perform code to add the image defined by the "emotCode" string
        // into the rich text box "rtb".
    }
}

表情形式:

Form EmoteForm
{
    private MainForm m_MainWindow;

    // public constructor
    public EmoteForm (MainForm mainWindow)
    {
        this.m_MainWindow = mainWindow;
        InitializeComponents();
    }

    // The smiley button you click
    private void somesmileybutton_Click(object sender, EventArgs e)
    {
        this.m_MainWindow.InsertEmoticon(":D");
    }
}

通讯将如下发生:

    单击
  • btnOpenEmoticons,创建一个新的EmoteForm对象,将主窗体作为参数,然后显示该窗体。
  • 点击EmoteForm,点击somesmileybutton。使用字符串“:D”
  • 调用m_MainWindow的公共InsertEmoticon函数
  • chatTextBox(很好)被要求在繁忙的日程安排中找到一个位置来执行InsertEmoticonDelegate类型的功能,这意味着一个RichTextBox和{{1}作为参数。
  • 此委托的实际给定参数是String作为要执行的函数,富文本框本身和字符串“:D”作为其参数。
  • 执行AddEmoticon函数,并从给定的参数中找出要放入给定富文本框的笑脸。

当然,您实际上可以像我一样给出Image对象而不是笑脸代码字符串,但我不知道......对我来说管理代码似乎更简单。

至于实际将图像插入到富文本中......最简单的解决方案似乎是备份当前在剪贴板中的内容,然后将图像放入剪贴板,然后将其粘贴到富文本中文本框,然后还原剪贴板的原始内容。听起来很难看,但显然有效。获得Image对象后,这应该可以解决问题:

AddEmoticon

答案 2 :(得分:0)

我认为你必须使用剪贴板来执行此操作。

试试这段代码:

{{1}}