1

私はC++を使用しています。現在、Windowsフォームを使用してプログラムを設計しています。イベント ハンドラの作成に問題があります。特に、ファイルを保存して開くためのクリック イベント ハンドラー。私はネットを検索しましたが、これらのイベント ハンドラの書き方について適切な説明が見つかりません。だから私は明確に定義された定義を求めています。

Microsoft は完成したイベント ハンドラーのサンプルを部分的にしか提供していないため、私を Microsoft に送らないでください。

4

1 に答える 1

5

OPは確かにこれを知っていても、Visual Studio 2012がC++ / CLI Winformアプリケーションをサポートしていることは一目瞭然ではないため、他の読者のために、この質問に答えるために作成した方法を次に示します。

  1. Visual Studio 2012 の [新しいプロジェクト] ダイアログで、[Visual C++ > CLR > CLR の空のプロジェクト] を選択しました。

  2. 新しいプロジェクトでは、通常の C++main関数と Windows フォームを追加しました。

  3. リンカーの設定で、コンソール サブシステムから GUI サブシステムに変更しました (Microsoft のリンカーの非標準的な動作のため、エントリ ポイントを に調整しましたmainCRTStartup)。

とはいえ、以下は生成された Winform ヘッダーを示しており、[ファイルを開く] ダイアログを起動するイベント ハンドラー コードのみが手動で追加されています。

  • 長いコメント行------は、イベント ハンドラーを接続する方法を示しています。

  • 下部のコードは、イベント ハンドラーをコーディングする方法と、ファイルを開くダイアログを実行する方法の両方を示しています。

#pragma once

namespace CppWindowsFormsApplication {

    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 MainWindow
    /// </summary>
    public ref class MainWindow : public System::Windows::Forms::Form
    {
    public:
        MainWindow(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~MainWindow()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    protected: 

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(149, 208);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(75, 23);
            this->button1->TabIndex = 0;
            this->button1->Text = L"&Open file";
            this->button1->UseVisualStyleBackColor = true;

            // ---------------------------------------------------- !Adds event handler -------------------
            this->button1->Click += gcnew System::EventHandler(this, &MainWindow::button1_Click);
            // 
            // MainWindow
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(284, 262);
            this->Controls->Add(this->button1);
            this->Name = L"MainWindow";
            this->Text = L"MainWindow";
            this->ResumeLayout(false);

        }
#pragma endregion
    private:
        System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
        {
            OpenFileDialog^ sfd = gcnew OpenFileDialog();
            sfd->Filter = "Text Files|*.txt|All Files|*.*";
            if( sfd->ShowDialog() != System::Windows::Forms::DialogResult::OK )
            {
                return;
            }
            //MessageBox::Show( sfd->FileName );
            MessageBox::Show( "OK" );
        }
    };
}

時間がなかったので、インデントなどを修正しませんでした。このコードのほぼすべてが、Visual Studio 2012 の RAD ( Rabid Application Development ) 機能によって生成されました。


この質問の履歴に関連し、削除されました:

この質問に答える時間は本当にありませんでした。私はむしろ他の誰かに答えてもらいたいです(そしてそれからいくらかの評判を得たいです)。これは非常に単純な質問なので、これほど早く締め切らなければ、私よりも多くの時間を割いて、多くの読者が答えていただろうと確信しています。

しかし、別の場所にコードを投稿してそれに答え、他のいくつかの問題を放棄することは、それを再開させる唯一の方法でした.

すべての読者に、理解できないものを閉じるために投票しないでください.

主題を完全に理解し、質問をクローズした方がコミュニティがより良いものであることを自分自身や他の人に証明できる場合にのみ、質問をクローズするために投票してください。

質問を理解できないからといって、必ずしもその質問が良くないというわけではありません

于 2013-03-13T12:48:58.090 に答える