65.9K
CodeProject 正在变化。 阅读更多。
Home

教程:轻松在 C++ 中使用 .NET Forms

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.81/5 (9投票s)

2009年9月7日

CPOL

6分钟阅读

viewsIcon

50983

downloadIcon

2396

关于如何在 C++ 中使用 .NET Forms 的教程

引言

如果您现在在网上搜索 C++ 中 .NET Forms 的教程,您会发现关于这个主题的教程数量少得可怜,而且大多数都是针对 C# 的。如果您和我一样不喜欢使用 Win32 API,那么 Forms 是一个非常好的替代方案。

注意:我使用的是 Visual Studio 2008,如果您使用的是不同的编译器,我建议您进行试验,找出如何为所述编译器使用 Forms。

本教程将涵盖以下内容

  • 如何配置您的编译器以便使用标准的 C# 库
  • 如何创建窗体
  • 如何运行窗体
  • 如何在窗体中创建事件
  • 如何在窗体中使用公共对话框
  • 如何使用多个窗体

配置 Visual C++ 2008

这一步相当简单。转到您的项目属性,选择“配置属性”->“常规”,然后将“公共语言运行时支持”更改为“/clr”。就是这样!现在让我们开始使用 Forms 吧!

创建 .NET Form

好了,首先按照标准的 Win32 应用程序的方式创建 main 函数体

#include "iostream"
#include "windows.h"

using namespace std;
int WINAPI WinMain(HINSTANCE hInstance, 
	HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
}

很好,如果您做过任何 Win32 编程,这应该看起来很熟悉,如果没有,请不用担心,您不需要理解它就能使用 Forms。

现在,在项目的头文件中创建一个 Windows Form。选择此项后,您应该进入设计器模式,我们稍后会讨论这一点。目前,请返回到您的 main cpp 文件,并包含此 Form 以及生成的命名空间。

#include "iostream"
#include "windows.h"
#include "Form1.h"

using namespace std;
using namespace TestC;

int WINAPI WinMain(HINSTANCE hInstance, 
	HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
}

好的,现在让我们来谈谈将在 WinMain() 中使用的两个重要函数。

首先,Application::Run(System::Windows::Forms::Form^ mainForm) 是运行您的窗体的命令。在用户退出窗体或调用 Application::Exit() 之前,代码不会继续执行。

其次,Application::EnableVisualStyles() 是为您的窗体提供 Windows XP /Vista/ 7 样式的命令。我建议在将此行代码与 Forms 一起使用呈现 API(如 DirectX 或 OpenGL)时将其排除,因为您可能会在运行 Forms 时遇到崩溃。

现在您的代码应该如下所示

#include "iostream"
#include "windows.h"
#include "Form1.h"

using namespace std;
using namespace TestC;

int WINAPI WinMain(HINSTANCE hInstance, 
	HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
        Application::EnableVisualStyles();
        Application::Run(gcnew Form1());
}

现在编译并运行您的程序,一个空的窗体应该会出现在屏幕上。您现在可以随意使用 Forms 设计器,因为它相当直观。

创建事件

在初步的障碍之后,在 C++ 中使用 .NET Forms 变得非常容易。如果您以前在窗体上创建过任何控件,您会注意到点击它们时没有任何反应。我们现在来解决这个问题,首先,我们在窗体中间创建一个按钮,该按钮将导致应用程序退出(与点击窗体右上角的红色 X 效果相同)。

要创建事件,请进入设计器模式,然后在属性窗口中点击看起来像闪电的图标。您现在应该会看到一个触发器列表。我们将专注于 Click 事件(当用户点击按钮或控件时触发)。双击 Click 事件,您应该会被重定向到代码。这是一个事件,将其视为普通函数,当事件触发时(在本例中,当用户点击按钮时)它就会运行。

我们希望应用程序退出并关闭,所以添加这段代码

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
{
    Application::Exit();
}

这会销毁窗体并返回到 WinMain() 函数。

更多关于控件

您在设计器中创建的每个对象都是您窗体的成员。窗体本质上是一个以 System::Windows::Forms::Form 为父类的类。因此,您在设计器模式下创建的任何内容都可以通过 this 访问。每个成员本身也是一个类,其中包含多个成员,这些成员保存与控件相关的数据。例如:您可以像这样获取文本框中包含的文本

String^ a = this->textBox1.Text;

注意:String^ 是一个常见的 C# 数据类型(C# 中为 string,C++ 中为 String^)。

常见的 Windows 对话框

在许多程序中,您会看到常见的 Windows 对话框,例如字体对话框、保存对话框或加载对话框。以下是 .NET (3.5) 中所有对话框的列表

  • ColorDialog
  • FolderBrowserDialog
  • 字体对话框
  • OpenFileDialog
  • SaveFileDialog
  • PrintDialog
  • PrintPreviewDialog

将 Windows 对话框添加到您的窗体

现在,要将这些对话框之一添加到您的窗体中,只需将其从工具箱拖到窗体上,它们就会显示在设计器的底部。

在这个例子中,我将使用一个字体对话框;添加一个多行文本框和一个新按钮。为该按钮的点击创建新事件。现在请仔细看这段代码

private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) 
{
    fontDialog1->ShowColor = true;
    fontDialog1->Font = textBox1->Font;
    fontDialog1->Color = textBox1->ForeColor;

    if ( fontDialog1->ShowDialog() != ::DialogResult::Cancel )
    {
        textBox1->Font = fontDialog1->Font;
        textBox1->ForeColor = fontDialog1->Color;
    }
}

首先,这段代码将文本框的字体和前景色分配给字体对话框,然后运行对话框,直到用户退出对话框才会继续。然后,这段代码会检查用户是否通过按取消来结束对话框。如果用户没有按取消,它会将字体和前景色分配给文本框。

运行多个窗体

现在,我们将同时运行多个窗体。创建一个新窗体,并记住在之前的窗体声明中包含它并使用它的命名空间。

#pragma once

//A new line
#include "Form2.h"

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

//A new line
using namespace TestC2;

现在在您旧的窗体中创建一个新按钮。此按钮将具有打开第二个窗体的事件。为按钮创建一个新的 Click 事件并观察以下内容

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) 
{
    Form2^ F = gcnew Form2();
    F->ShowDialog();
}

我们在这里做的事情很简单,我们创建了一个类型为 Form2^ 的新变量(我们必须包含 ^,因为我们使用的是 gcnew 而不是 new),然后窗体将作为对话框显示,这会暂停之前的窗体并使其失效。

如果您希望新窗体与旧窗体并行运行而不是取代它,请使用 Show() 函数而不是 ShowDialog()

结论

在我看来,学习 .NET Forms 的最佳方法是进行实验,从这里开始,您就知道了如何在程序中使用 .NET Forms。 .NET Forms 一开始可能看起来令人生畏,但它比看起来容易得多。如果您对本教程感到有些困惑,我建议您学习一些 C#,它在处理 .NET Forms 时非常有用。

更多关于 .NET Forms

如果您想了解更多关于 .NET Forms 的信息,请查看我的另一篇文章:DirectX SDK with .NET Forms,网址是此链接

历史

  • 2009 年 9 月 6 日:首次发布
© . All rights reserved.