这是一个非常经典的话题,但首先需要明确一个关键点:

**核心概念:C# vs. C++
- WinForms (Windows Forms) 是一个由微软开发的图形用户界面框架。
- 这个框架主要和 C# 语言绑定,当你使用 Visual Studio 创建 "Windows Forms App" 项目时,默认使用的语言就是 C#。
- C 语言本身没有原生的、官方的 WinForms 支持,C 语言是一种过程式语言,而 WinForms 是一个基于 .NET Framework 的面向对象的框架。
当人们说“用 C 语言做 WinForms”时,通常有以下几种情况:
- 最常见的情况(实际上不是 C 语言): 用户可能混淆了 C 和 C#,他们想说的是用 C# 来写 WinForms 程序,这是最标准、最推荐的方式。
- 使用 C++/CLI: C++ 有一个扩展叫做 C++/CLI (Common Language Infrastructure),它允许你在 C++ 代码中使用 .NET 框架,包括 WinForms,这是一种混合模式,可以同时使用非托管的 C++ 代码和托管的 .NET 代码。
- 使用第三方库(C 语言): 存在一些第三方库,试图用纯 C 语言模仿 WinForms 的 API,让你能用 C 的语法来创建窗口和控件,但这并不是微软官方的 WinForms,功能和生态都远不如 C# 版本。
用 C# 开发 WinForms(最推荐的方式)
这应该是你真正想学习的,C# 和 WinForms 是天作之合,非常适合快速开发 Windows 桌面应用。
环境准备
你需要安装 Visual Studio,社区版是免费的,完全足够个人学习和开发。
- 下载地址:https://visualstudio.microsoft.com/zh-hans/vs/community/
- 安装时,请确保选择 “.NET 桌面开发” 工作负载,它包含了 C# 和 WinForms 的所有必要组件。
创建你的第一个 WinForms 项目
- 打开 Visual Studio。
- 点击 “创建新项目”。
- 在模板搜索框中输入
Windows Forms,然后选择 “Windows 窗体应用 (.NET Framework)” 或 “Windows 窗体应用” (.NET 5/6/7/8 版本,推荐新版)。 - 给你的项目起个名字,
MyFirstWinApp,然后点击 “创建”。
Visual Studio 会为你生成一个基本的项目结构,并自动打开一个名为 Form1 的窗体设计器。

理解项目结构
Form1.cs: 这是你的窗体的 C# 代码文件,它定义了窗体的行为(逻辑)。Form1.Designer.cs: 这是窗体的自动生成代码文件,它包含了所有你在设计器中拖放的控件(如按钮、文本框)的初始化代码。一般情况下,你不需要手动修改这个文件。Program.cs: 这是应用程序的入口点。static void Main方法在这里,负责启动你的应用程序并创建主窗体。
一个简单的例子:Hello, WinForms!
让我们创建一个简单的应用,包含一个文本框和一个按钮,点击按钮后,文本框的内容会改变。
步骤 1:使用设计器添加控件
- 从 Visual Studio 的 “工具箱” (Toolbox) 中,拖拽一个
TextBox控件到Form1窗体上。 - 再拖拽一个
Button控件到窗体上。 - 选中
Button,在 “属性” (Properties) 窗口中,找到Text属性,将其值改为 “点击我”。 - 选中
TextBox,在 “属性” 窗口中,找到(Name)属性,将其值改为txtDisplay,Text属性清空。
步骤 2:编写事件处理代码
-
双击 “点击我” 按钮,Visual Studio 会自动切换到
Form1.cs文件,并为你生成一个按钮点击事件的空方法,如下所示:using System; using System.Windows.Forms; namespace MyFirstWinApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnClickMe_Click(object sender, EventArgs e) { // 在这里编写按钮被点击后要执行的代码 } } } -
在
btnClickMe_Click方法中,编写如下代码:private void btnClickMe_Click(object sender, EventArgs e) { // 将文本框的内容设置为 "你好,世界!" txtDisplay.Text = "你好,世界!"; }
步骤 3:运行程序
按 F5 键,或者点击工具栏上的绿色 “播放” 按钮,程序会启动,你将看到一个窗口,点击 “点击我” 按钮,文本框里就会出现 “你好,世界!”。
这就是 WinForms 开发的基本流程:拖拽控件 + 编写事件处理代码。
用 C++/CLI 开发 WinForms
如果你因为某些原因(比如需要调用遗留的 C++ 库)而必须使用 C++,C++/CLI 是一个选择。
环境准备
同样需要 Visual Studio,并且安装 “使用 C++ 的桌面开发” 工作负载。
创建项目
- 创建新项目。
- 搜索
CLR,选择 “CLR 空项目”。 - 添加一个新项,选择 “Windows 窗体 (.NET)”,这会为你生成一个窗体文件。
一个简单的 C++/CLI 例子
代码风格和 C# 非常相似,但语法是 C++ 的。
MyForm.h (头文件)
#pragma once
#include <windows.h>
#include <msclr\auto_gcroot.h> // 用于在非托管 C++ 中托管 .NET 对象
// 使用 .NET 命名空间
using namespace System;
using namespace System::Windows::Forms;
// 定义我们的窗体类
public ref class MyForm : public Form
{
public:
MyForm();
private:
// 声明控件
TextBox^ txtDisplay;
Button^ btnClickMe;
// 声明事件处理方法
void btnClickMe_Click(Object^ sender, EventArgs^ e);
};
MyForm.cpp (实现文件)
#include "MyForm.h"
MyForm::MyForm()
{
// 初始化窗体
this->Text = "C++/CLI WinForms 示例";
this->Size = System::Drawing::Size(300, 200);
// 创建并配置文本框
txtDisplay = gcnew TextBox();
txtDisplay->Location = System::Drawing::Point(20, 20);
txtDisplay->Size = System::Drawing::Size(260, 20);
this->Controls->Add(txtDisplay);
// 创建并配置按钮
btnClickMe = gcnew Button();
btnClickMe->Text = "点击我";
btnClickMe->Location = System::Drawing::Point(20, 60);
btnClickMe->Size = System::Drawing::Size(260, 30);
// 绑定事件
btnClickMe->Click += gcnew EventHandler(this, &MyForm::btnClickMe_Click);
this->Controls->Add(btnClickMe);
}
void MyForm::btnClickMe_Click(Object^ sender, EventArgs^ e)
{
txtDisplay->Text = "你好,来自 C++/CLI!";
}
main.cpp (入口点)
#include "MyForm.h"
using namespace System;
using namespace System::Windows::Forms;
// 程序的入口点
int main(array<String^>^ args)
{
// 启动窗体应用程序
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew MyForm());
return 0;
}
C++/CLI 的语法比 C# 复杂,因为它混合了托管和非托管世界的概念,但对于需要桥接两者的情况非常有用。
总结与对比
| 特性 | C# + WinForms | C++/CLI + WinForms | 纯 C 语言 (第三方库) |
|---|---|---|---|
| 语言 | C# (面向对象) | C++/CLI (混合) | C (过程式) |
| 官方支持 | 是,完全支持 | 是,但为 C++ 设计 | 否,第三方库 |
| 开发效率 | 非常高,简单易学 | 较高,但比 C# 复杂 | 较低,功能受限 |
| 性能 | 良好 (JIT 编译) | 极高 (可调用非托管代码) | 高 (直接编译为机器码) |
| 主要用途 | 快速开发 Windows 桌面应用、工具软件 | 需要结合现有 C++ 库的 GUI 项目 | 教学、嵌入式 GUI 或特定领域 |
| 推荐度 | ⭐⭐⭐⭐⭐ (首选) | ⭐⭐⭐ (特定场景) | ⭐ (不推荐) |
结论与建议
对于绝大多数 Windows 桌面应用开发需求,请直接使用 C# 和 WinForms,它是微软官方提供的、功能最完善、学习资源最丰富、开发效率最高的组合。
如果你是 C 语言学习者,想了解 Windows 界面编程,可以先从 Win32 API 开始,这是最底层、最纯粹的 Windows 窗口编程方式,能让你深刻理解窗口消息机制,当你掌握了 Win32 API 后,再回头看 C# WinForms,会感觉它就像一个帮你把所有复杂事情都做好的高级工具箱。
学习路径建议:
-
如果你是初学者,目标是快速做出应用:
- 直接学习 C# + WinForms,这是最直接、最高效的路径。
-
如果你是 C/C++ 程序员,需要调用现有库:
- 学习 C++/CLI,用它来创建 WinForms 界面,并在其中调用你的 C/C++ 代码。
-
如果你想深入理解 Windows 系统本身:
- 学习 C 语言 + Win32 API,这会非常辛苦,但收获也最大,能让你明白 GUI 程序背后的原理。
