利用C++的托管扩大针对Windows窗体编程[VC/C++编程]
本文“利用C++的托管扩大针对Windows窗体编程[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要:本文谈论了若何利用 Visual C++ .NET 的托管扩大针对 Windows 窗体编程,并供应了利用直接拜候 Windows 窗体类的手动编程技术的示例,以及利用 Windows 窗体计划器的示例.此外,本文还对 Windows 窗体和 Microsoft 底子类 (MFC) 利用程序举行了对比.
简介
长期以来,程序员们都利用 C 和 C++ 来开辟 Windows GUI 利用程序.关于我们当中很多人来说,这一段历史可以追溯到 Windows 2.0 期间,当时,我们利用基于 C 的 16 位 Windows API,即便只是显示一个窗口,也需求编写数十行代码.幸运的是,随着时间的推移,抽象的级别越来越高,越来越好.在 1992 年,Microsoft 发行了 Programmer's Workbench,此中包含 Microsoft 底子类库 1.0 版.Microsoft 底子类库 1.0 版包含大约 60 个类,用于包装窗口化编程和绘制部份的 16 位 Windows API.到 2002 年为止,Microsoft 底子类库 7.0 版已经发展为超越 200 个类,并且,其用处已经扩大为可以供应 Microsoft Win32 API 的完好 C++ 对象模子替换物.
固然 MFC 非常强盛,但它也有很多缺陷,比方它只是 Win32 API 外的一层薄薄的面板,并且关于很多程序员来说,它太过复杂,很难有效地利用.普通,要开辟 Windows 利用程序,仍需求直接拜候 Win32 API,分外是在对 Windows 利用程序所需的基本功效的要求不断晋升的情形下.因此,要开辟任何功效真正强盛的 Windows GUI 利用程序,需求耗费大量时间精神.为了应对利用程序开辟难度不断提高的情况,Microsoft 于 2002 年初发行了一个针对 Windows 平台的新编程环境.该环境称为 .NET 框架,它为开辟人员供应了一个托管 利用程序运行库,以及称为 .NET 框架类库的大量库..NET 框架可以管理内存和安全性,从而可以产生更为坚固的利用程序..NET 框架类库供应了一个大型、资源丰富和统一的类库,任何 .NET 语言(包含 Micrisoft 为 .NET 程序员供应的 C++ 的托管扩大和 C++ 的托管版),都可以以相同的方法平等地拜候该类库.作为 .NET 框架的一部份,Windows 窗体是一组用于构建客户端 Windows GUI 利用程序的类.
本文中,我们将深化理解若何利用 C++ 的托管扩大编写 Windows 窗体代码,先介绍若何重新开始编写,然后讲授若何利用 Microsoft Visual Studio .NET 2003 来完成这一任务.与此同时,我们将侧重介绍 Windows 窗体的一些常勤奋效,如自动筹划和数据绑定.最后,我们将把注意力集合到 Windows 窗体与 MFC 的对比以及在进一步利用托管扩大时,若何混合利用这两套工具.
什么是 Windows 窗体?
Windows 窗体是一个窗口化工具包,而不像 MFC 一样是完好的利用程序框架.事实上,相关于 Windows 窗体所供应的用于构建基于文档的独立利用程序的功效来说,MFC 供应的功效更多.比方,假如要生成一个文本编辑器,在 MFC 中,只需运行一个向导,挑选得当的选项并编写若干行代码便可完成.仅仅是通过运行该向导得到的利用程序就包含了一个状况栏、一个工具栏(浮动),并实现了全部的 File、Edit 和 Help 菜单项,此中包含近来利用的文件列表和打印以及上下文相关的帮忙,全部这些内容都包含在一个完好徽标兼容的单文档界面 (SDI)、多 SDI 或多文档界面 (MDI) 利用程序中.作为基于文档的利用程序框架,没有可以与 MFC 相匹敌的竞争者.
但是,程序员们目前偏向于构建更多基于 HTML 的利用程序,大概可以与业务对象或数据库服务器通信的利用程序,而不是基于文档的利用程序..NET 框架和 Windows 窗体恰是为这一目的而量身定做的.
这并非说 Windows 窗体不能用来构建优异的基于文档的利用程序.实际上,由于 Windows 窗体只是 .NET 框架所供应的超越 2000 个类中的一小部份,您所需求的内容很有大概 Windows 窗体并没有供应,而是位于该框架中的其他部份中.比方,Windows 窗体本身并不供应任何对象序列化支持,但是 .NET 框架类库的别的部份供应了多种序列化对象图的办法.
这是 MFC 和 Windows 窗体之间的主要辨别.MFC 旨在替换底子 Win32 API,但这并不能禁止 Win32 API 增长.事实上,就像 MFC 随时间的不断增长一样,底子 OS 的功效最少增添了十倍.但是,Windows 窗体只是 Win32 的窗口化部份的替换物..NET 框架类的别的部份负责替换别的的 Win32.当然,框架永久不大概替换整个 Win32 API,不过,由于在可预期的将来,大大都要增添到 Windows 中的新功效都要被增添到框架中,替换整个 Win32 API 将是一个将来的目标.
因此,固然 Windows 窗体不能具有 MFC 的全部功效,但它的确供应了一组很强的功效,可以极大地便利客户端利用程序开辟人员,这此中包含一些 MFC 完好不具有的功效.下面,我们将介绍若何重新开始构建利用程序,然后讲授 Visual Studio .NET 2003 为 Windows 窗体 C++ 程序员供应的工作效率改良功效.
重新开始成立 Windows 窗体
典型的 Windows 窗体利用程序有至少一个窗体.窗体就是一个窗口,也就是从 Windows 1.0 开始我们所看到的 Microsoft 用户界面单元.普通,Windows 窗体利用程序中的一个窗体是主窗体,意思是它是利用程序的生存周期内大概显示的全部其他窗体的父级或全部者.该窗体是显示主菜单以及工具栏、任务栏等的位置.主窗体完毕时,利用程序也退出.
利用程序的主窗体可以是一个简单的消息框、一个对话框、一个 SDI 窗口、一个 MDI 窗口,大概更为复杂的控件,如 Visual Studio .NET 这样的利用程序中具有多个子窗口、工具窗口和浮竣工具栏的窗体.
假如您的利用程序极其简单,可以利用充斥在任何窗口化系统中的俭朴的消息框来实现它:
#using <mscorlib.dll>
#using <System.dll>
#using <System.Windows.Forms.dll>
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
System::Windows::Forms::MessageBox::Show("Hello, Windows Forms");
}
作为 C++ 程序员,您一定非常熟习 WinMain 进口点,在托管利用程序中,仍需求该进口点.在我们的第一个 Windows 窗体利用程序中,唯一一行实际的代码调用了 Windows::System::Forms::MessageBox 类的静态 Show 办法,这其实只是调用包含在 Window::Systems::Forms 命名空间 内的 MessageBox 类的静态办法的长写情势..NET 框架类库中遍及利用了命名空间来将类、构造、列举等范例脱离为差别的逻辑组.由于有数以千计的 Microsoft 雇员要从事增添 .NET 框架类库的工作,并且有数以百计的第三方组织要扩大该类库,同时有数以百万计的程序员正在尝试学习它,因此这种脱离是非常必要的.没有命名空间,就需求采取各种复杂的约定来唯一地命名各种对象(像现有的 Win32 API 一样).
命名空间中的范例的定义位于 .NET 程序集 中.程序集是打包为 DLL 或 EXE 的托管范例的容器.#using 指令用于将程序集合的范例利用到您的利用程序中.比方,mscorlib 和 System 程序集供应了基本的 .NET 框架范例,如 int 和 string.System.Windows.Forms 程序集包含了 Windows 窗体范例.
利用 #using 将程序集利用到利用程序中后,便可以从前面讲到的长写情势引用范例,大概,可以利用尺度的 C++ using namespace 语句来省略键入代码的工作:
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
using namespace System::Windows::Forms;
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
MessageBox::Show("Hello, Windows Forms");
}
因此,固然这个简单的示例很有效地演示了最基本的 .NET 框架和 C++ 的托管扩大的概念,但它并不能很好地演示典型的 Windows 窗体程序.关于真实的利用程序,将需求一个 Form 类(或从 Form 派生的类)的实例,以下所示:
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
Form* form = new Form();
...
}
form 变量引用了托管范例的一个实例.托管对象是由 .NET 框架的大众语言运行库 (CLR) 处理的,它们的生存周期由垃圾回收器掌握的,该回收器在一定的时间撤消分配内存.因此,C++ 程序员无需显式地删除托管范例,但是一样不能期望在任何特按时刻(如关闭范围时)破坏对象.
成立窗体后,就需求显示它.假如您曾经看过 Windows 窗体的文档,大概已经注意到了 Form 办法 Show,这意味着:
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
Form* form = new Form();
form->Show(); // This is not what you want to do.
}
固然上面的代码可以显示窗体,但是必须眼疾手快才可以看到该窗体,这是因为 Show 以无情势的方法显示窗体.这意味着在 Show 将新的窗体显示到屏幕上之后,会立行将掌握权返回给 Main 函数,该函数在返回时将退出进程,同时关闭方才显示不久的窗体.要以有情势的方法显示窗体,文档倡议利用 ShowDialog 函数:
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
Form* form = new Form();
form->ShowDialog(); // This is not quite what you want to do.
}
固然这些代码事实上可以显示一个空窗体,并且在用户关闭它之后才会将掌握权返回给 Main 函数,但普通您并不会编写这样的代码.相反,您将把一个窗体指定为主窗体,使得利用程序的其他部份可以把它当作主窗体来举行拜候.为此,可以将主窗体作为一个参数传送给 Windows 窗体的 Application 对象的 Run 办法:
#using <mscorlib.dll>
#using <System.dll>
#using <System.Windows.Forms.dll>
using namespace System::Windows::Forms;
void __stdcall WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
long lpCmdLine,
int nCmdShow)
{
Application::Run(new Form);
}
Application 类的静态 Run 办法将显示主窗体并开始发送 Windows 消息,直到主窗体关闭为止.主窗体关闭后,Run 将返回,让我们的 Main 函数退出,以便完毕进程.要实际查看这一历程,可以利用下面的号令行编译这个小小的 Windows 窗体利用程序:
C:MSDNMYFIRS~1>cl /clr MyFirstApp.cpp
以上是“利用C++的托管扩大针对Windows窗体编程[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |