【发布时间】:2014-01-16 05:01:01
【问题描述】:
如何使用控制台应用程序创建 Windows 窗体?就像我运行控制台应用程序时一样,它会显示一个表单(Windows 表单)。谁能帮帮我?
【问题讨论】:
标签: c++ c windows visual-c++
如何使用控制台应用程序创建 Windows 窗体?就像我运行控制台应用程序时一样,它会显示一个表单(Windows 表单)。谁能帮帮我?
【问题讨论】:
标签: c++ c windows visual-c++
首先,您必须了解 Windows 中的窗口是如何工作的。每个窗口程序都管理着一个叫做消息队列的东西。消息是来自系统(和其他应用程序)的信息,表示发生了某事,例如有人按下了键或移动了鼠标,这样窗口就可以正确地对该用户操作做出反应。
处理消息(包括将它们分派到适当的窗口)是程序的责任,并且在 Windows 窗体中,应用程序是通过一些内部消息处理循环在 Application.Run 方法(或附近的某个地方)中完成的。但是如果你想在你的控制台应用程序中显示一个窗口,就必须有人负责这个过程,否则窗口将无法正常工作(实际上,它们根本不会工作)。
如果您以模态方式显示一个窗口,它会自行处理发送给它的消息,因此您可以从您的代码中直接调用 myWindow.ShowDialog 这将起作用 - 但会锁定控制台 input 直到窗口关闭。这意味着,您将能够通过Console.WriteLine 向控制台发送文本,但在窗口关闭之前,您将无法通过Console.ReadLine 向用户询问文本。
class Program
{
public static void Main(string[] args)
{
System.Windows.Forms.Form f = new System.Windows.Forms.Form();
f.Click += (o, e) => { Console.WriteLine("Clicked!"); };
f.ShowDialog();
Console.ReadLine();
}
}
// (run, then click on a form to observe result)
另一方面,如果您想以非对话框方式显示窗口,事情就会变得复杂。我想到的最简单的事情是创建 Windows 窗体应用程序并使用 AllocConsole 为应用程序创建单独的控制台窗口(例如 Blender 就是这样做的)。另一种选择是创建两个不同的应用程序 - 控制台和 Windows 窗体一个,从第一个运行第二个并通过某种机制(命名管道、共享全局内存、Windows 消息、TCP/IP 等)管理它们的通信
【讨论】:
不直接支持。
您可以做的是拥有两个独立的应用程序,一个表单和一个控制台。从表单一启动控制台一并在应用程序之间传递数据。如果您想将表单设置为“内部”控制台应用程序,您可以使用
http://msdn.microsoft.com/en-us/library/aa984420%28v=vs.71%29.aspx
【讨论】:
System.Windows.Forms 的引用,然后在您的控制台应用程序中写入:System.Windows.Forms.Form f = new System.Windows.Forms.Form(); f.ShowDialog();