public partial class ET_member_talk : Form
{
private string withTalkerUIDHoneyName = ""; private string _UID = ""; private string _Honey_name = ""; /// <summary>
/// UID
/// </summary>
public string UID
{
get { return _UID; }
set { _UID = value; }
} /// <summary>
/// 昵称
/// </summary>
public string Honey_name
{
get { return _Honey_name; }
set { _Honey_name = value; }
} /// <summary>
/// 简单字符,格式:昵称(UID)
/// </summary>
public string WithTalkerUIDHoneyName
{
get { return withTalkerUIDHoneyName; }
set
{
if (value == "")
{ }
else
{
//例如:Tony(123456789)
string[] temp_str1 = value.Split(new char[] { '(' });//Tony 123456789)
Honey_name = temp_str1[0];//Tony
string[] temp_str2 = temp_str1[1].Split(new char[] { ')' });//123456789 )
UID = temp_str2[0];//123456789
withTalkerUIDHoneyName = value;
}
}
} public ET_member_talk(string _withTalkerUIDHoneyName)
{
InitializeComponent();
WithTalkerUIDHoneyName = _withTalkerUIDHoneyName;
this.Text = "与 " + WithTalkerUIDHoneyName + " 聊天中...";
}
}class Common
{
...
/// <summary>
/// 用于显示新建与成员聊天窗口的函数
/// </summary>
/// <param name="withTalkerUIDHoneyName">与要聊天的成员的UID和HONEY_NAME,如:UID(HONEY_NAME)</param>
public static void et_member_talk_form(string withTalkerUIDHoneyName)
{
for (int i = 0; i < ET_Meber_Chatrooms.Count; i++)
{
if (((ET_member_talk)ET_Meber_Chatrooms[i]).WithTalkerUIDHoneyName == withTalkerUIDHoneyName)
{
return;
}
}
ET_member_talk temp_et_member_talk_form = new ET_member_talk(withTalkerUIDHoneyName);
Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
//temp_et_member_talk_form.ShowDialog();
//temp_et_member_talk_form.Show();
et_test_show(temp_et_member_talk_form);
//temp_et_member_talk_form.TopMost = true;
}
...
public void action ()
{
string sender_UID = "123456789";
string sender_honey_name = "Tony";
string talk_content = "test_content";
string friend_UID = "987654321";
string friend_honey_name = "Marry";
string time = "DateTime.Now.TO.....";
//把选所有要显示在聊天文件框里的内容存放到content字符串变量中;
string content = sender_honey_name + "(" + sender_UID + ")" + " " + time + "\r\n" + talk_content + "\r\n";
bool isExists = false;
for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
{
ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
{
isExists = true;
temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
temp_et_member_talk.rtxtBox_send_Content.Text = "";
}
}
if (isExists)
{ }
else
{
Common.et_member_talk_form(sender_honey_name + "(" + sender_UID + ")");
for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
{
ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
{
isExists = true;
temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
temp_et_member_talk.rtxtBox_send_Content.Text = "";
//temp_et_member_talk.Refresh();
//Thread.Sleep(1000);
}
}
}
if (Personel_info.UID != sender_UID)
{
playSoundFromResource(Application.StartupPath + "\\sound\\msg.wav");
}
}
}
class Personel_info
{}代码太多了。而且部份代码调用了其它类的成员。所以我只能把主要的写出来了。现在,我的问题是,如:我执行Common类里的action()方法。到了:public static void et_member_talk_form(string withTalkerUIDHoneyName);方法的.....Show();之后,Show出来的窗口马上就消失了。运行时只看到闪了一个而我随便在Common 类里写一个:
public void test_Show()
{
Et_member_talk et=new Et_member_talk("Tony(123456789)");
et.Show();
}
这个随便写的方法。Show出来的窗口不会消失。就像我平时用的一样。所以我想问问大家有没试过这样的问题?一Show出来的窗口,闪一下马上就消失了。我现在郁闷啊。
{
private string withTalkerUIDHoneyName = ""; private string _UID = ""; private string _Honey_name = ""; /// <summary>
/// UID
/// </summary>
public string UID
{
get { return _UID; }
set { _UID = value; }
} /// <summary>
/// 昵称
/// </summary>
public string Honey_name
{
get { return _Honey_name; }
set { _Honey_name = value; }
} /// <summary>
/// 简单字符,格式:昵称(UID)
/// </summary>
public string WithTalkerUIDHoneyName
{
get { return withTalkerUIDHoneyName; }
set
{
if (value == "")
{ }
else
{
//例如:Tony(123456789)
string[] temp_str1 = value.Split(new char[] { '(' });//Tony 123456789)
Honey_name = temp_str1[0];//Tony
string[] temp_str2 = temp_str1[1].Split(new char[] { ')' });//123456789 )
UID = temp_str2[0];//123456789
withTalkerUIDHoneyName = value;
}
}
} public ET_member_talk(string _withTalkerUIDHoneyName)
{
InitializeComponent();
WithTalkerUIDHoneyName = _withTalkerUIDHoneyName;
this.Text = "与 " + WithTalkerUIDHoneyName + " 聊天中...";
}
}class Common
{
...
/// <summary>
/// 用于显示新建与成员聊天窗口的函数
/// </summary>
/// <param name="withTalkerUIDHoneyName">与要聊天的成员的UID和HONEY_NAME,如:UID(HONEY_NAME)</param>
public static void et_member_talk_form(string withTalkerUIDHoneyName)
{
for (int i = 0; i < ET_Meber_Chatrooms.Count; i++)
{
if (((ET_member_talk)ET_Meber_Chatrooms[i]).WithTalkerUIDHoneyName == withTalkerUIDHoneyName)
{
return;
}
}
ET_member_talk temp_et_member_talk_form = new ET_member_talk(withTalkerUIDHoneyName);
Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
//temp_et_member_talk_form.ShowDialog();
//temp_et_member_talk_form.Show();
et_test_show(temp_et_member_talk_form);
//temp_et_member_talk_form.TopMost = true;
}
...
public void action ()
{
string sender_UID = "123456789";
string sender_honey_name = "Tony";
string talk_content = "test_content";
string friend_UID = "987654321";
string friend_honey_name = "Marry";
string time = "DateTime.Now.TO.....";
//把选所有要显示在聊天文件框里的内容存放到content字符串变量中;
string content = sender_honey_name + "(" + sender_UID + ")" + " " + time + "\r\n" + talk_content + "\r\n";
bool isExists = false;
for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
{
ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
{
isExists = true;
temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
temp_et_member_talk.rtxtBox_send_Content.Text = "";
}
}
if (isExists)
{ }
else
{
Common.et_member_talk_form(sender_honey_name + "(" + sender_UID + ")");
for (int i = 0; i < Common.ET_Meber_Chatrooms.Count; i++)
{
ET_member_talk temp_et_member_talk = ((ET_member_talk)Common.ET_Meber_Chatrooms[i]);
if (temp_et_member_talk.UID == friend_UID || temp_et_member_talk.UID == sender_UID)
{
isExists = true;
temp_et_member_talk.rtxtBox_talk_content.AppendText(content);
temp_et_member_talk.rtxtBox_send_Content.Text = "";
//temp_et_member_talk.Refresh();
//Thread.Sleep(1000);
}
}
}
if (Personel_info.UID != sender_UID)
{
playSoundFromResource(Application.StartupPath + "\\sound\\msg.wav");
}
}
}
class Personel_info
{}代码太多了。而且部份代码调用了其它类的成员。所以我只能把主要的写出来了。现在,我的问题是,如:我执行Common类里的action()方法。到了:public static void et_member_talk_form(string withTalkerUIDHoneyName);方法的.....Show();之后,Show出来的窗口马上就消失了。运行时只看到闪了一个而我随便在Common 类里写一个:
public void test_Show()
{
Et_member_talk et=new Et_member_talk("Tony(123456789)");
et.Show();
}
这个随便写的方法。Show出来的窗口不会消失。就像我平时用的一样。所以我想问问大家有没试过这样的问题?一Show出来的窗口,闪一下马上就消失了。我现在郁闷啊。
如果是这样的话,在窗体属性界面里把ShowInTaskbar也设为false就不会有你说的情况了。
我没有弄隐藏任务栏我之前去查了一下,我这种情况。我在Common类中的 /// <summary>
/// 用于显示新建与成员聊天窗口的函数
/// </summary>
/// <param name="withTalkerUIDHoneyName">与要聊天的成员的UID和HONEY_NAME,如:UID(HONEY_NAME)</param>
public static void et_member_talk_form(string withTalkerUIDHoneyName)
{
for (int i = 0; i < ET_Meber_Chatrooms.Count; i++)
{
if (((ET_member_talk)ET_Meber_Chatrooms[i]).WithTalkerUIDHoneyName == withTalkerUIDHoneyName)
{
return;
}
}
ET_member_talk temp_et_member_talk_form = new ET_member_talk(withTalkerUIDHoneyName);
Common.ET_Meber_Chatrooms.Add(temp_et_member_talk_form);
//temp_et_member_talk_form.ShowDialog();
while(!temp_et_member_talk_form.IsHandleCreated)//判断句柄创建成功与否。
{
;
}
temp_et_member_talk_form.Show();
//temp_et_member_talk_form.TopMost = true;
}我发现
temp_et_member_talk_form.Show();
这句话执行不了了。原因是该控件句柄无法创建。CPU100%资源。就是卡在那个句柄死循环了。我就是不知道。为啥。一个小小的控件都要创建句柄这么久。不过我打了一个断点做测试。因为我temp_et_member_talk_form.Show()之后。我继续了一些网络通讯的代码.就是用了一个NetWorkStream网络流的Read(buffer,0,buffer.length); Byte[] buffer = new Byte[tcp_client.ReceiveBufferSize];
send_recieve_ns.Read(buffer, 0, buffer.Length);断点卡在Read()函数里是很正常啊。但这个与我的temp_et_member_talk_form窗口控件有啥关系?我就觉得奇怪。而且我试过。如:temp_et_member_talk_form是一个窗体控件类:Et_member_talk类我假如把Common类中的et_member_talk_form()函数改成一下简单的Et_member_talk简单的Show();这情况就很正常运行了。Et_member_talk类的窗口马上就正常的显示出来了。后来我怀疑是否是UI线程有关系。与是我就用上了该控件的.BegineInvoke();异步处理函数;但我对UI线程不了解。如果有那位大哥说一下就更好了。先谢谢一下。但用上了.BegineInvoke()函数后。又出现了一个"创建句柄未完成前使用,....(忘记了)"反正就是与Et_member_talk窗体类的.IsHandleCreated标识有关系。所以我就用上了我上面的
while(!temp_et_member_talk_form.IsHandleCreated)
{
;
}
但结果就是一个死循环;我现在就想知道:
UI线程是什么呢?还有控件句柄IsHandleCreated为啥一直不行创建完成?
你试试ShowDialog(),因为Show方法无法维持,如果当前没有其他模式窗口存在,进程就会终止,非模式窗口不能维持进程。
代码过多了。我只能有语言说明:“从action()函数”开始的话。你可能没看到我的代码里有ShowDialog()?在//注释里的。我都试过了。C SHARP的模式窗口和非模式窗口我还怎么了解过。准确说,我没听过有这个东西。ShowDialog我试过了。可以维持,但就是会无法对该Dialog的属性控制了。如:我把temp_et_member_talk_form.ShowDialog();后因为我的temp_et_member_talk_form窗体里有两个RichTextBox,四个Button,都不可以对其控制了。但是Button里的事件还是可以执行的。如:
public void Button_Click(object sender,EventHandle e)
{
this.RichTextBox.Text="Text_string";
MessageBox.Show("this.RichTextBox.Text='Text_string'的赋值失败");
}
这个事件可以执行。因为Show()出了一个对话框。也有相应的对话框内容,。、但是this.RichTextBox.Text="这里输什么内容,都不在该属性显示。";
this.RichTextBox里的显现不出内容。或我对temp_et_talk_form.Text="这里随便写字符串,都不起效果,赋不了值。";这个是就是ShowDialog()后的问题。可以维持窗口,但是控制不了该窗体内的东西。Show()的话就闪一下,就没了。就好像没有Console.ReadLine()的控制台程序一样了。闪一下,就没了。在任务栏里也出现了一下。就没了。但我的程序的其它窗口都还是执行中的。
就是该Et_member_talk类窗体一闪就没了。
Application.Run(new ET_member_talk());
honey_name 太别扭
会怎样?
using System;
using System.Windows.Forms;
class Form1 : Form
{
static void Main()
{
Application.Run(new Form1());
}
}但这样就是不行的
using System;
using System.Windows.Forms;
class Form1 : Form
{
static void Main()
{
Form1 f = new Form1();
f.Show();
}
}
{
Form1 f=new Form1(); Thread temp_thread=new Thread(new ThreadStart(test)); temp_thread.Start(f);
}void test(Form1 f)
{
f.Show();
}是否这样的代码弄呢?我这样试过。不行啊。他说什么错误
1 “test”的重载均与委托“System.Threading.ThreadStart”不匹配
就是去掉Show之前就的行。就是一个普普通通的Show。就什么事都有。我就觉得奇怪。
把f的构造和show都放到test中,test就不要参数了
恩,终于找到这个源码可以解决我这个问题了。就是要再一个Application.Run(新窗体类);不过这个Application.Run();得新建另一个线程去执行再才可以。感谢您啦,大哥。