快速业务通道

使用C++的托管扩展针对Windows窗体编程

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
序员很快会注意到其中的不同之处。适应起来需要一个过程。

您应当注意的另一件事情是 C++ 的托管扩展项目向导将实现代码生成到了 .h 文件而不是 .cpp 文件中。这可能是由于 C++ 设计器必须适应现有的设计器体系结构而不是 Visual Studio .NET 2002,而后者仅支持 C# 和 Visual Basic .NET 这样的语言,这些语言不分割声明和定义代码。生成的头文件(可以通过右键单击设计图面然后选择 View Code 或通过按 F7 来访问)如下所示:

namespace MySecondApp
{
 using namespace System;
 using namespace System::ComponentModel;
 using namespace System::Collections;
 using namespace System::Windows::Forms;
 using namespace System::Data;
 using namespace System::Drawing;
 /// <summary>
 /// Summary for Form1
 public __gc class Form1 : public System::Windows::Forms::Form
 { 
 public:
  Form1(void)
  {
   InitializeComponent();
  }
 
 private:
  /// <summary>
  /// Required designer variable.
  /// </summary>
  System::ComponentModel::Container * components;
  /// <summary>
  /// Required method for Designer support - do not modify
  /// the contents of this method with the code editor.
  /// </summary>
  void InitializeComponent(void)
  {
   this->components = new System::ComponentModel::Container();
   this->Size = System::Drawing::Size(300,300);
   this->Text = "Form1";
  } 
 };
}

上面的大多数代码应当都是为大家所熟知的,包括顶部的 using 语句和从 Form 基类派生的自定义窗体。唯一一处与您的实现不同的地方是窗体的构造函数中调用 InitializeComponent 以设置窗体的属性,而不是在构造函数本身中进行设置。之所以这么做,是为了使 Windows 窗体设计器有地方放置初始化窗体上的控件和窗体本身的代码。

Windows 窗体应用程序项目模板产生了一个 .cpp 文件:

int APIENTRY _tWinMain(HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
           LPTSTR lpCmdLine,
           int nCmdShow)
{
 System::Threading::Thread::CurrentThread->ApartmentState =
  System::Threading::ApartmentState::STA;
 Application::Run(new Form1());
 return 0;
}

以上代码看上去同样很熟悉。Main 函数提供了应用程序的入口点和对 Application::Run 的调用,传入主窗体类的一个实例。将 ApartmentState 变量设置为单线程单元 (STA),是为了 COM 的适当惰性初始化能够在拖放操作中以用户友好的方式使用,以及宿主 COM 控件。

返回到 InitializeComponent 实现,可以看到窗体设计器在那里放置了代码。例如,将按钮从工具箱拖动到窗体的设计图面将把 InitializeComponent 实现更改为如下所示的代码:

void InitializeComponent(void)
{
  this->button1 = new System::Windows::Forms::Button();
  this->SuspendLayout();
  //
  // button1
  //
  this->button1->Location = System::Drawing::Point(0, 0);
  this->button1->Name = "button1";
  this->button1->TabIndex = 0;
  this->button1->Text = "button1";
  //
  // Form1
  //
  this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
  this->ClientSize = System::Drawing::Size(288, 253);
  this->Controls->Add(this->button1);
  this->Name = "Form1";
  this->Text = "Form1";
 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号