【问题标题】:Console App that produced a form(Windows Form)?生成表单(Windows 表单)的控制台应用程序?
【发布时间】:2014-01-16 05:01:01
【问题描述】:

如何使用控制台应用程序创建 Windows 窗体?就像我运行控制台应用程序时一样,它会显示一个表单(Windows 表单)。谁能帮帮我?

【问题讨论】:

    标签: c++ c windows visual-c++


    【解决方案1】:

    首先,您必须了解 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 等)管理它们的通信

    【讨论】:

      【解决方案2】:

      不直接支持。

      您可以做的是拥有两个独立的应用程序,一个表单和一个控制台。从表单一启动控制台一并在应用程序之间传递数据。如果您想将表单设置为“内部”控制台应用程序,您可以使用

      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();
      • 问题表述为“如何使用控制台应用程序创建 Windows 窗体?”你不能直接这样做。而且您也不能将它们作为一个窗口链接在一起,但是(正如我指出的那样)您可以制造它的错觉。编辑:我不应该说你不能,一个可能可以,但就我所知的任何传统方式而言,不是。
      • 实例化表单并在其上调用 ShowDialog 有什么更传统的方法?您甚至可以非常简单地将 Windows 窗体添加到控制台项目并在 VS 设计器中对其进行编辑。我看不到这里“不直接支持”什么。 “不常见”,也许吧。顺便说一句,相反需要 ~1 行代码(向 WF 应用程序添加控制台支持)
      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2018-04-09
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多