我正在尝试使用C#创建聊天程序。在我的程序中,我有一个表情符号表单,其中包含表情符号列表。我想在主窗体中的richtextbox中显示它们。知道怎么样?我被困在试图解决这个问题。我真的不知道怎么做。
顺便说一句,表情符号是按钮。我已经尝试在文本框中显示它们但只是以相同的形式显示它们。每当我点击表情符号时,我希望它显示在主窗体的richtextbox中。嗯,我尝试的唯一代码就是在表情符号表单的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);
}
答案 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}}