C++Builder6界面设计精讲:组件布局与交互设计秘籍
发布时间: 2025-01-10 09:13:53 阅读量: 14 订阅数: 20
C++Builder 界面设计 编程
5星 · 资源好评率100%
![C++Builder6界面设计精讲:组件布局与交互设计秘籍](https://res.cloudinary.com/debsobrien/image/upload/f_webp,q_auto,w_900,h_600,c_fill/v1612443662/debbie.codes/blog/button-testing_2x_oliu20)
# 摘要
本文详细探讨了C++Builder6在界面设计方面的各个方面。首先概述了界面设计的基础概念,紧接着深入介绍了C++Builder6的核心组件功能、布局技术以及交互体验的增强方法。随后,文章进一步分析了事件驱动模型、交互设计技巧以及设计模式在C++Builder6中的应用。进阶部分着重于自定义组件开发、多媒体与图形界面设计以及跨平台界面设计的策略。最后,通过实战案例分析,展示了如何构建实用的界面设计框架、实现组件布局与交互逻辑,并进行了界面调试、优化和用户体验提升。本文旨在为开发者提供全面的C++Builder6界面设计指南,以创建更加直观和高效的用户界面。
# 关键字
C++Builder6;界面设计;组件技术;事件驱动模型;交互式设计;用户体验优化
参考资源链接:[C++Builder6实战教程:从入门到精通](https://wenku.csdn.net/doc/3n5481hw6z?spm=1055.2635.3001.10343)
# 1. C++Builder6界面设计概述
在软件开发领域,用户界面(UI)设计对于软件的成功至关重要。C++Builder6作为一个强大的开发工具,提供了丰富的界面设计功能,让开发者能够快速构建功能丰富、外观美观的应用程序。本章旨在为读者提供一个C++Builder6界面设计的基础概览,包括其核心设计理念、用户界面设计的重要性以及如何通过C++Builder6来实现这些设计。
## 1.1 用户界面设计的重要性
良好的用户界面设计可以增强用户体验,降低操作复杂度,并提高软件的可用性和访问性。它不仅仅是视觉上的美化,更是对软件功能和操作逻辑的优化。在C++Builder6中,开发者可以通过其直观的可视化设计工具来实现这一切。
## 1.2 C++Builder6的设计理念
C++Builder6的设计理念是通过组件化的方法,快速搭建用户界面,同时保持代码的清晰和可维护性。开发者可以利用各种预设的组件快速搭建界面,并通过事件驱动模型来处理用户交互。本章将对这些组件和模型进行初步介绍,为后续章节的深入探讨打下基础。
# 2. C++Builder6组件基础
## 2.1 C++Builder6组件介绍
### 2.1.1 标准组件与自定义组件
C++Builder6提供了丰富的标准组件库,这些组件覆盖了开发过程中常见的功能需求,如按钮、文本框、列表框等。开发者可以快速地通过拖放这些组件到窗体上,实现界面的基础功能。然而,在特定的场景下,标准组件可能无法完全满足开发需求。此时,自定义组件的作用就显得尤为重要。
自定义组件是对标准组件的扩展和深化。开发者可以通过继承现有的组件类,添加新的属性、方法或者事件来创建属于自己的组件。这样做不仅可以复用代码,还能增强程序的功能性和灵活性。例如,一个自定义的日历组件可能会包含一个标准日期选择器的功能,并增加特定的商业规则处理或数据绑定功能。
当设计自定义组件时,需要考虑以下几个方面:
- 组件的扩展性:组件应该设计为易于扩展,这样在未来需要增加新的功能时,可以较容易地进行。
- 组件的可维护性:良好的设计应确保组件易于理解和维护,使得其他开发者能够快速上手。
- 组件的性能:自定义组件不应该对应用程序的性能产生负面影响,应尽量优化以减少资源消耗。
### 2.1.2 组件的属性与事件
在C++Builder6中,组件的属性决定了组件的外观和行为。例如,`TButton`组件的`Caption`属性可以定义按钮上显示的文本,而`Enabled`属性则可以控制按钮是否可用。对于自定义组件,开发者也可以定义自己的属性来增强组件的功能。
事件是组件与外界交互的一种方式。组件可以发布事件,其他部分的代码可以响应这些事件。在C++Builder6中,事件通常与消息紧密相关,当某个动作发生时,比如按钮点击,相应的事件会被触发。开发者可以通过编写事件处理函数来响应这些事件,从而实现特定的行为。
举个例子,当用户点击一个按钮时,我们通常会处理`OnClick`事件:
```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMessage("Button was clicked!");
}
```
在此代码块中,`Button1Click`函数会在`Button1`被点击时被调用,然后显示一个消息框。
理解组件的属性和事件对于开发一个具有交互性的应用程序至关重要。通过合理设置和响应属性和事件,开发者可以构建出功能丰富且用户友好的界面。
## 2.2 组件的布局技术
### 2.2.1 网格和边距的使用
布局技术是决定用户界面整体外观的关键因素。在C++Builder6中,开发者可以使用网格(Grid)和边距(Margin)来创建一致和整齐的界面布局。
网格是窗体设计中的一种虚拟线网,它帮助开发者对齐组件。C++Builder6默认启用了8像素的网格大小,这意味着在拖动组件时,组件会被自动吸附到最近的网格线,使得布局看起来整齐有序。如果默认的网格大小不符合设计需求,开发者可以自定义网格大小来调整布局的精细程度。
边距用于指定组件边缘与其容器边缘之间的距离。在C++Builder6中,边距控制着组件与窗体边缘或其他组件之间的空间。合理设置边距可以使界面显得更加宽敞舒适,提升用户体验。
### 2.2.2 对齐和分布的高级技巧
对齐(Alignment)和分布(Spacing)是C++Builder6中实现复杂布局的高级技巧。对齐属性允许组件在特定的方向上相对于其容器或其他组件对齐,例如左对齐、居中对齐或右对齐。而分布属性则定义了组件之间的间隔,包括水平和垂直分布。
```cpp
// 示例代码:设置组件的对齐方式和间隔
Button1->Align = alLeft; // 水平方向上靠左对齐
Button1->Anchors = [akLeft, akTop]; // 组件锚定到窗体的左上角
Button2->Align = alRight; // 水平方向上靠右对齐
Button2->Anchors = [akRight, akTop]; // 组件锚定到窗体的右上角
// 设置组件之间的垂直间隔
VerticalSpacing = 10; // 纵向间隔为10像素
```
合理的对齐和分布可以使得界面元素之间的关系更为直观和有序,这对于提升应用程序的可用性和美观性至关重要。
## 2.3 增强交互体验的组件
### 2.3.1 输入组件的交互设计
输入组件如文本框(`TTextBox`)和组合框(`TComboBox`)是应用程序中最常见的用户交互方式之一。它们允许用户输入信息,并通过程序进行处理。在设计这些输入组件时,应充分考虑用户体验,包括输入验证、自动补全等高级功能。
输入组件的设计关键点包括:
- 输入验证:确保用户输入的数据格式正确,防止非法数据引发程序错误。
- 用户提示:提供实时反馈,例如在用户输入错误时给出提示。
- 自动补全:提供输入建议,加快用户输入速度并减少错误。
```cpp
// 示例代码:使用输入验证
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
// 验证输入内容
if (!Edit1->Text.IsEmpty())
{
// 输入非空,可进行后续处理
}
else
{
// 输入为空,显示错误信息
ShowMessage("Input cannot be empty!");
}
}
```
### 2.3.2 列表与组合框的应用
列表(`TListBox`)和组合框(`TComboBox`)是用于显示一系列选项的交互组件。这些组件可以包含字符串、对象甚至是自定义的图形元素。它们的应用可以极大地提升用户的交互体验,特别是在选项较多时,用户可以方便地浏览和选择。
设计列表和组合框时应注意:
- 选项组织:清晰地组织列表项,便于用户理解并作出选择。
- 数据绑定:在可能的情况下,将列表与数据源绑定,以便动态更新。
- 动态加载:允许动态地添加或删除选项,以适应不同的使用场景。
```cpp
// 示例代码:在组合框中动态加载数据
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
// 根据当前选中的项动态加载数据
if (ComboBox1->ItemIndex == 0)
{
// 第一项被选中,加载数据到列表框
ListBox1->Items->Add("Option 1");
ListBox1->Items->Add("Option 2");
// ... 添加其他选项
}
else if (ComboBox1->ItemIndex == 1)
{
// 第二项被选中,加载另一组数据
ListBox1->Items->Add("Option A");
ListBox1->Items->Add("Option B");
// ... 添加其他选项
}
}
```
通过上述示例代码可以看出,组件的交互设计不仅仅是视觉上的布局调整,更重要的是逻辑上的设计和实现,使得应用程序能够更好地响应用户的操作,从而提升整体的用户体验。
# 3. C++Builder6交互式界面设计
在C++Builder6中创建动态且响应用户操作的交互式界面是提升软件可用性的关键。本章将深入探讨事件驱动模型、高级交互设计技巧以及设计模式在界面设计中的应用,确保读者能够理解和掌握构建高度交互式应用界面的核心概念和技术。
## 3.1 事件驱动模型
### 3.1.1 事件处理流程
事件驱动模型是交互式界面设计的基础。在C++Builder6中,每个用户操作(如点击按钮、输入文本等)都会生成一个事件。应用程序通过事件处理程序(event handlers)响应这些事件,实现与用户的交互。
事件处理流程涉及以下几个主要步骤:
1. 事件触发:用户在界面上进行操作,如鼠标点击或按键。
2. 事件分发:操作系统捕获到操作并识别出具体的组件,然后将事件传递给相应的事件处理程序。
3. 事件响应:事件处理程序根据事件类型和相关的数据执行相应的代码逻辑。
4. 结果反馈:处理程序执行完毕后,界面会更新以反映操作的结果,提供直观的用户反馈。
以下是一个简单的示例,展示了如何在C++Builder6中设置一个按钮点击事件处理程序。
```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 当按钮被点击时执行的代码
ShowMessage("按钮已被点击");
}
```
在上述代码中,`Button1Click`函数定义了按钮被点击时应当执行的操作。使用`ShowMessage`函数显示一个消息框,通知用户按钮已被操作。
### 3.1.2 事件与消息的传递机制
事件和消息在C++Builder6中是应用程序响应用户操作的主要途径。消息(Messages)是操作系统向应用程序窗口发送的通知,而事件(Events)则是应用程序用来响应这些消息的具体方法。
消息传递机制涉及到Windows消息循环,这是一个不断检查消息队列并分发消息到各个窗口的过程。开发者可以利用WinAPI中的`getMessage`或`peekMessage`函数来处理消息循环。
C++Builder6封装了大部分底层的消息处理机制,提供了一个更为直观的事件处理框架。这允许开发者只关注于业务逻辑的实现,而不需要深入底层消息处理的细节。
## 3.2 高级交互设计技巧
### 3.2.1 异步事件处理
在现代软件设计中,用户界面不应该在处理耗时操作时变得无响应。异步事件处理允许应用程序在不阻塞主用户界面线程的情况下执行后台任务。
在C++Builder6中,可以使用`TThread`类创建新的线程。这样可以将耗时的任务放到后台线程去执行,而主界面线程依然可以处理用户的输入和界面更新。
```cpp
void __fastcall TForm1::StartAsyncTask(TObject *Sender)
{
// 创建并启动后台线程
TMyThread* MyThread = new TMyThread;
MyThread->FreeOnTerminate = true;
MyThread->Priority = tpNormal;
MyThread->Start();
}
```
在上述代码中,创建了一个名为`TMyThread`的新线程类的实例,并启动了它。如果设置了`FreeOnTerminate`为`true`,则线程完成任务后会自动释放自己。
### 3.2.2 动态用户界面设计
动态用户界面设计是指根据应用程序运行时的条件改变界面布局和行为的能力。这通常通过条件语句或预设的用户交互来动态调整界面元素。
在C++Builder6中,可以使用条件语句来检查特定条件(如用户权限、系统资源等)来显示或隐藏界面组件,或者根据用户的输入来动态更新界面。
```cpp
void __fastcall TForm1::UpdateUIBasedOnCondition()
{
if(UserHasPermission()) // 假设这是检查用户权限的函数
{
Panel1->Visible = true; // 条件满足时显示面板
}
else
{
Panel1->Visible = false; // 条件不满足时隐藏面板
}
}
```
在上述代码中,`UpdateUIBasedOnCondition`函数检查用户的权限,并据此决定是否显示一个界面面板。
## 3.3 设计模式在界面设计中的应用
### 3.3.1 常用设计模式概述
设计模式是软件开发中解决特定问题的一种常见方法或模板。在界面设计中,某些设计模式特别有用,如Model-View-Controller (MVC)、Observer模式和Singleton模式。
- **MVC**:将应用程序分为三个核心组件:模型(Model)负责数据和业务逻辑、视图(View)负责展示界面、控制器(Controller)负责监听用户输入并更新模型和视图。
- **Observer**:当对象状态发生改变时,自动通知一系列依赖于它的对象,适用于实现组件间的动态数据交互。
- **Singleton**:确保类只有一个实例,并提供一个全局访问点。在界面设计中,单例模式通常用于确保资源(例如配置文件、数据库连接等)的全局一致性。
### 3.3.2 设计模式在组件交互中的实践
在C++Builder6中,将设计模式应用于组件交互可以提高代码的可读性、可维护性和可扩展性。
例如,使用Singleton模式来管理应用程序中所有组件共享的资源:
```cpp
class TGlobalResource
{
private:
static TGlobalResource* Instance;
TGlobalResource(){} // 私有构造函数
public:
static TGlobalResource* GetInstance()
{
if (!Instance)
Instance = new TGlobalResource();
return Instance;
}
void UseResource() { /* 实现资源使用逻辑 */ }
};
TGlobalResource* TGlobalResource::Instance = nullptr;
```
在上述代码中,`TGlobalResource`类确保了只有一个实例存在,并通过`GetInstance`方法提供全局访问点。
通过将这些设计模式融入到C++Builder6的界面设计中,开发者可以创建出更加模块化、灵活和可维护的应用程序界面。
在本章中,我们探讨了C++Builder6中的交互式界面设计的核心概念,包括事件驱动模型、高级交互设计技巧以及设计模式的应用。通过掌握这些知识,开发者能够构建出响应迅速、用户体验优秀的应用程序。在接下来的章节中,我们将进一步深入了解如何通过自定义组件开发和多媒体图形界面设计,以及实现跨平台界面设计,为读者提供更全面的界面设计解决方案。
# 4. C++Builder6界面设计进阶
## 4.1 自定义组件开发
### 4.1.1 组件的继承与封装
在C++Builder6中,自定义组件的开发是一项重要的技能,这有助于提高软件的可重用性和灵活性。为了创建一个功能丰富的自定义组件,开发者需要掌握组件继承与封装的技巧。
组件继承涉及到派生新组件类从现有的组件类,如`TControl`或`TComponent`。派生类可以利用基类的属性、方法和事件,同时添加新的功能。例如,创建一个具有特殊行为的按钮,我们可以从`TButton`类派生一个新的类。
封装是面向对象编程的核心概念之一,指的是将数据(属性)和操作数据的方法绑定在一起,形成一个独立的对象。在自定义组件中,封装确保了组件内部状态的完整性和对外的接口清晰。
下面是一个简单的例子,展示了如何创建一个继承自`TButton`的新组件:
```cpp
// MyButton.h
class MYCOMP MyButton : public TButton
{
// 在这里添加自定义成员变量和方法
};
```
在上面的代码中,我们声明了一个名为`MyButton`的新类,它继承自标准的`TButton`。你可以在这个类中添加自定义属性和方法,改变组件的默认行为。
### 4.1.2 组件生命周期管理
组件生命周期是从创建组件实例开始,到组件被销毁的整个过程。理解组件生命周期对于管理资源和保证应用稳定运行至关重要。在C++Builder6中,组件生命周期分为几个阶段,包括构造、初始化、激活、停用和销毁。
- 构造(Constructor):在创建组件实例时调用构造函数。
- 初始化(CreateParams):创建组件的窗口句柄或平台相关的数据结构。
- 激活(AfterConstruction):组件首次被添加到窗体后调用。
- 停用(BeforeDestruction):组件从窗体移除后调用。
- 销毁(Destructor):组件对象被销毁。
为了管理这些生命周期事件,你可以重载相应的虚函数:
```cpp
// MyButton.h
class MYCOMP MyButton : public TButton
{
protected:
virtual void __fastcall CreateParams(TCreateParams &Params);
virtual void __fastcall AfterConstruction();
virtual void __fastcall BeforeDestruction();
public:
__fastcall MyButton(TComponent* Owner);
__fastcall virtual ~MyButton();
};
// MyButton.cpp
__fastcall MyButton::MyButton(TComponent* Owner)
: TButton(Owner)
{
// 构造函数代码
}
void __fastcall MyButton::CreateParams(TCreateParams &Params)
{
// 初始化参数
TButton::CreateParams(Params);
// 可以在这里修改Params的值以改变窗口样式等
}
void __fastcall MyButton::AfterConstruction()
{
// 例如,可以在这里初始化某些变量
TButton::AfterConstruction();
}
void __fastcall MyButton::BeforeDestruction()
{
// 在组件销毁前执行清理代码
TButton::BeforeDestruction();
}
__fastcall MyButton::~MyButton()
{
// 析构函数代码
}
```
在这个例子中,`CreateParams`、`AfterConstruction`和`BeforeDestruction`方法被重载以显示组件在生命周期各个阶段的活动。开发者可以在这些方法中添加任何需要的逻辑来管理组件的生命周期。
## 4.2 多媒体与图形界面设计
### 4.2.1 图形与动画的集成方法
在C++Builder6中,集成图形和动画是提高应用程序视觉吸引力的关键。借助VCL框架,开发者可以轻松地将图形和动画集成到界面设计中。
实现图形界面通常涉及使用位图、图标、图形列表等资源。而动画效果可以通过定时器组件(如`TTimer`)来实现。以下是集成图形和动画的几个步骤:
- 首先,在资源文件(.res)中包含图像文件。
- 使用`TImage`组件或`TBitmap`类在窗体中显示图像。
- 设置`TTimer`组件的间隔时间和`OnTimer`事件处理器来更新图形显示或改变位置,从而形成动画效果。
示例代码如下:
```cpp
// 动画实现示例
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int X = Image1->Left; // 当前图像的X坐标
X += 1; // 增加X坐标值,实现向右移动效果
if (X > ClientWidth) // 如果图像移出窗体边界
X = 0; // 将图像移回原点重新开始动画
Image1->Left = X; // 更新图像位置
}
```
在上述代码中,`TImage`组件被用来显示图像,并通过定时器`TTimer`实现动画效果。
### 4.2.2 音频与视频处理组件
音频和视频处理在现代应用程序中变得越来越重要。C++Builder6中提供了多种方式来集成音视频处理能力。开发者可以使用第三方库,也可以利用Windows API。
- 使用第三方库:可以通过引入第三方库如FMOD、DirectX SDK等来处理音视频数据。
- 利用Windows API:直接使用Windows API函数如`PlaySound`和`mciSendString`等来播放音频和视频。
集成视频播放功能时,`TMediaPlayer`组件是一个很好的起点。对于更复杂的音视频处理,你可能需要自定义组件或使用第三方组件。
示例代码展示如何使用`TMediaPlayer`播放音频:
```cpp
// 播放音频文件
void __fastcall TForm1::PlayAudio()
{
MediaPlayer1->Open('path_to_audio_file.mp3');
MediaPlayer1->Play();
}
```
## 4.3 跨平台界面设计
### 4.3.1 跨平台组件的使用策略
跨平台组件的使用是现代软件开发中不可或缺的一部分。C++Builder6允许开发者利用FireMonkey(FMX)框架来创建跨平台的应用程序。FMX提供了丰富的组件集合,这些组件在不同的操作系统上有着类似的外观和行为。
设计跨平台界面时,需要注意以下策略:
- 使用FMX框架提供的组件。
- 考虑不同平台的UI/UX差异,适当调整界面设计。
- 测试在所有目标平台上应用程序的表现。
### 4.3.2 兼容性测试与调整技巧
兼容性测试是确保应用程序在不同平台上正确运行的关键步骤。C++Builder6提供了多种工具和方法来帮助开发者测试和调整跨平台应用程序。
- 使用模拟器进行快速测试。
- 在实际设备上进行详尽测试,确保应用程序在真实环境中的表现。
- 使用C++Builder6的调试和诊断工具来定位和解决兼容性问题。
对组件进行调整时,可以遵循如下步骤:
- 对齐组件以适应不同的分辨率和屏幕尺寸。
- 确保资源文件和媒体文件正确地包含在所有目标平台上。
- 适配不同的操作系统风格和行为。
通过遵循这些策略和技巧,开发者可以创建出既美观又功能完善的跨平台应用程序。
# 5. C++Builder6界面设计实战案例
## 5.1 实战案例分析
在进行实战案例分析之前,选择一个合适的项目至关重要。案例需要能够充分展示C++Builder6在界面设计方面的特点和优势。例如,我们可以选择开发一个简单的个人信息管理软件,该软件要求记录和显示用户的基本信息,包括姓名、年龄、性别、兴趣等,并允许用户通过界面进行基本的数据增删改查操作。
### 5.1.1 案例选择与需求分析
首先,我们需要分析用户需求,并确定软件的基本功能模块。对于个人信息管理软件,基本功能可能包括:
- 用户信息的录入与编辑
- 用户信息的存储与读取
- 用户信息的显示与排序
- 用户信息的搜索与筛选
在需求分析阶段,还需要考虑界面的美观性和用户的易用性,这将直接影响到用户体验和软件的可用性。
### 5.1.2 设计思路与框架搭建
根据需求分析的结果,我们可以设计一个简洁的用户界面,其中包含一个主窗口,窗口中包括几个主要区域:
- 信息录入区域:包含输入框、标签和按钮,用于用户输入个人信息。
- 信息显示区域:一个表格或列表,用于展示已录入的用户信息。
- 功能按钮区:提供增加、删除、编辑、保存等功能按钮,方便用户操作。
在C++Builder6中,我们将使用FMX框架进行UI设计,它支持跨平台的界面设计,并能够使用丰富的组件来实现上述功能。
## 5.2 组件布局与交互的实现
### 5.2.1 组件布局的代码实现
在C++Builder6中,界面布局主要通过组件的属性来完成。以下是一个简单示例代码,展示如何使用TForm组件来创建一个包含标签、文本编辑框和按钮的基本布局:
```cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// 设置窗体标题
Caption = "个人信息管理";
// 创建标签组件
Label1 = new TLabel(this);
Label1->Caption = "姓名:";
Label1->Position = TPosition(10, 10);
// 创建文本编辑框组件
Edit1 = new TEdit(this);
Edit1->Position = TPosition(70, 10);
// 创建按钮组件
Button1 = new TButton(this);
Button1->Caption = "添加信息";
Button1->Position = TPosition(10, 40);
}
```
### 5.2.2 交互逻辑的代码实现
实现组件间的交互逻辑是界面设计中重要的一环。例如,我们可以为按钮添加点击事件处理函数,当用户点击“添加信息”按钮时,将输入的姓名添加到列表中显示。
```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// 获取输入框中的文本
String name = Edit1->Text;
// 将姓名添加到列表中
ListView1->Items->Add()->Caption = name;
// 清空输入框
Edit1->Text = "";
}
```
## 5.3 调试、优化与用户体验
### 5.3.1 界面调试流程与技巧
在C++Builder6中进行界面调试时,可以利用IDE提供的即时预览功能。此外,需要注意检查组件属性是否设置正确,交互逻辑是否实现无误。例如,可以通过设置断点来跟踪按钮点击事件是否被正确捕获和执行。
### 5.3.2 用户体验的优化方法
用户体验优化的关键在于细节处理。例如,我们可以添加滚动条到列表组件,以便用户查看大量信息;还可以通过设置快捷键来提高信息操作的效率。以下是将快捷键绑定到特定操作的代码示例:
```cpp
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
if (Key == VK_DELETE) // 如果按下的是删除键
{
// 执行删除操作
ListView1->Items->Remove(ListView1->Selected);
}
}
```
通过以上的分析和代码实现,我们可以看到C++Builder6如何在界面设计中提供强大的工具和灵活的方式来创建直观、高效的用户界面。通过实际案例的分析与实现,我们能够进一步了解和掌握C++Builder6在界面设计方面的高级应用。
0
0