早在MFC男人的激动人心的日子里是男性;辛苦工作在C和写几百行做的事情,现在可笑simple.nbsp的;然而,我们在今天的一个不存在我们的袖子的伎俩塑料梦幻般的。NET:
AfxGetMainWnd()和AfxGetApp()是两个神奇的宏,我们可以从几乎任何地方在我们的应用程序利用到我们的主窗口或应用程序,分别获得一个指针。
昨天,我在写一个快速的客户机/服务器app.nbsp;服务器是一个WinForm托盘的应用程序,其主要形式包括一个简单的列表显示状态messages.nbsp我想侦听传入流量的线程来更新状态; list.nbsp;我真的错过AfxGetMainWnd(),因为我有一个很难找到一种方式来获得我的主要window.nbsp的句柄,因为这是一个托盘的应用程序,这将启动最小化,我无法使用_FormMain.ActiveForm或MainWindowHandle.nbsp Process.GetCurrentProcess(); MainWindowHandle,事实上,当我双击托盘图标打开主窗口的处理成为有效的,我可以使用it.nbsp有趣,但每分钟最小化的窗口托盘的处理成为空again.nbsp,所以我没有可靠的方式得到处理,谈谈我的主窗口卡住。
有可能已被一个更好的办法,但是这是一个简单的项目,我想上quick.nbsp移动,我改变了我的主窗口的一个单身,隐藏的构造和揭露它返回一个实例的实例变量的形式。
要做到这一点,让我们看看构造函数:private _FormMain()
{
InitializeComponent();
}
private static _FormMain m_Form = null;
public static _FormMain Instance
{
get
{
if (m_Form == null)
m_Form = new _FormMain();
return m_Form;
}
}
然后,我们需要一个简单的改变在Program.cs:
最后,处理从另一个线程调用:// This delegate enables asynchronous calls from other threads
delegate void AddMessageCallback(string sMsg, Color c);
public void AddMessage(string sMsg, Color c)
{
if (_ListStatus.InvokeRequired)
{
AddMessageCallback amc = new AddMessageCallback(AddMessage);
this.Invoke(amc, new object[] { sMsg, c });
}
else
{
ListViewItem lvi = new ListViewItem(sMsg);
lvi.ForeColor = c;
_ListStatus.Items.Add(lvi);
_ListStatus.Refresh();
}
}
注意委托/调用AddMessage使用的代码是直接从MSDN的。
这样一来,我能够从我的代码中的任何位置,只需拨打以下:_FormMain.Instance.AddMessage(Client has connected? Color.Green);