序员很快会注意到其中的不同之处。适应起来需要一个过程。
您应当注意的另一件事情是 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";
|