2011-01-26 8 views
1

フォーム内のピクチャボックスにWndProc Funectionを使用するには? 私はこのコードのようにそれを試してみたが、それはすべてのメッセージが私の 公衆への送信動作していないではない:仮想無効にWndProc(メッセージ%M)WndProcの使い方

using namespace System; 
using namespace System::ComponentModel; 
using namespace System::Collections; 
using namespace System::Windows::Forms; 
using namespace System::Data; 
using namespace System::Drawing; 
namespace MyProject { 
    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     Form1(void) { 
      InitializeComponent(); 
      //TODO: Add the constructor code here 
     } 
    protected: 
     ~Form1() { 
      if (components) 
       delete components; 
     } 
    private: 
     System::Windows::Forms::PictureBox^ pictureBox1; 
     System::ComponentModel::Container ^components; 

     void InitializeComponent(void) { 
      this->pictureBox1 = gcnew System::Windows::Forms::PictureBox(); 
      (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(
       this->pictureBox1))->BeginInit(); 
      this->SuspendLayout(); 
      // 
      // pictureBox1 
      // 
      this->pictureBox1->Location = System::Drawing::Point(41, 27); 
      this->pictureBox1->Name = L"pictureBox1"; 
      this->pictureBox1->Size = System::Drawing::Size(206, 203); 
      this->pictureBox1->TabIndex = 0; 
      this->pictureBox1->TabStop = false; 
      // 
      // Form1 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(292, 265); 
      this->Controls->Add(this->pictureBox1); 
      this->Name = L"Form1"; 
      this->Text = L"Form1"; 
      (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(
       this->pictureBox1))->EndInit(); 
      this->ResumeLayout(false); 
     } 
    }; 

    ref class pictureBox1 : PictureBox { 
    public: 
     virtual void WndProc(Message% m) override { 
      __super::WndProc(m); 
     } 
    }; 
}//close NameSpace 
+0

ウィンドウプロシージャが実行されます 'BackColor'各時間を設定する理由は絶対にありません。コンストラクタでそれを設定し、最初に 'WndProc'をオーバーライドすることなく使用することができます。 –

+0

@Cody:私の答えに彼のコメントを見てください。彼はDirectXを使用しています。 – SLaks

+0

あなたのクラスとフィールドに名前を付ける必要があります。 – SLaks

答えて

1

SLaksが提供する答えが正しいか、と私はあなたがに必要な彼のコメントではなくコピーするよりも、コードが何を意味するのかを理解し、スタックオーバーフローオフ魔法のスニペットを貼り付けると100%同意します。

でも、カスタムのPictureBoxクラス(WndProcの機能をオーバーライドしたクラス)を使用するコードをどのように書くべきかについてはまだ叫んでいます。これは、すべての参照をSystem::Windows::Forms::PictureBoxに変更してpictureBox1(あなたのカスタムクラス)に変更するという単純な問題です。もちろん、どちらか一方の名前を変更する必要がありますが、すべてのデフォルトの名前よりも良い名前を選択することをお勧めします。例えば

、以下を試してみてください。

namespace MyProject { 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 


    public ref class Form1 : public System::Windows::Forms::Form 
    { 
    public: 
     Form1(void) 
     { 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 

    protected: 

     ~Form1() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
    private: pictureBox1^ myPictureBox; 
    protected: 

    private: 

     System::ComponentModel::Container ^components; 


     void InitializeComponent(void) 
     { 
      this->myPictureBox = (gcnew pictureBox1()); 
      (cli::safe_cast<System::ComponentModel::ISupportInitialize^ >(this->myPictureBox))->BeginInit(); 
      this->SuspendLayout(); 
      // 
      // myPictureBox 
      // 
      this->myPictureBox->Location = System::Drawing::Point(41, 27); 
      this->myPictureBox->Name = L"myPictureBox"; 
      this->myPictureBox->Size = System::Drawing::Size(206, 203); 
      this->myPictureBox->TabIndex = 0; 
      this->myPictureBox->TabStop = false; 
      // 
      // Form1 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(292, 265); 
      this->Controls->Add(this->myPictureBox); 
      this->Name = L"Form1"; 
      this->Text = L"Form1"; 
      (cli::safe_cast<System::ComponentModel::ISupportInitialize^>(this->myPictureBox))->EndInit(); 
      this->ResumeLayout(false); 

     } 

    }; 




ref class pictureBox1 : PictureBox { 
    //protected: 
    public:  
     virtual void WndProc(Message% m) override { 
         __super::WndProc(m); 
     } 
    }; 




}//close NameSpace 
+0

「コディーグレイ」ありがとうございました!私はそれをテストし、非常にgoooooooodを動作させる! – user572312

+0

しかし、私は新しい画像ボックスクラスを作りたくない。私は自分の画像ボックスのフォームを使用して、新しい画像ボックスを作ってみませんか? – user572312

+0

あなたはどんな考えを持っていますか? – user572312

2

あなたは新しいクラスを作成していますが、それを使ったことがありません。
ピクチャボックスを新しいクラスのインスタンスに変更する必要があります。

ただし、 ではありません。

WndProcは、絶対に必要でない限り.Net開発で使用しないでください。ここでは必要ありません。
.Netイベントを使用する必要があります。

+1

OK。あなたはまだあなたの問題が何であるかを理解する必要があります。 – SLaks

+0

私のコードを修正して真のコードを入力することはできますか? – user572312

+2

**私の答えで言ったことを理解していますか?** – SLaks

関連する問題