【问题标题】:How to use WndProc?如何使用 WndProc?
【发布时间】:2011-01-26 14:05:41
【问题描述】:

如何在我的表单中为图片框使用 WndProc 函数? 我像这段代码一样尝试它,但它不起作用,也没有任何消息发送到我的 public: virtual void WndProc(Message%m)

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

【问题讨论】:

  • 绝对没有理由在每次执行窗口过程时都设置BackColor。您可以在构造函数中设置它,而无需首先覆盖WndProc
  • @Cody:查看他对我的回答的评论。他正在使用 DirectX。
  • 你应该为你的班级和你的领域命名。
  • 是插入 BackColor 代码以查看我的 void WndProc 是否被调用
  • 这是对他所有其他问题的欺骗吗?

标签: .net winapi visual-c++ c++-cli wndproc


【解决方案1】:

您创建了一个新类,但从未使用过它。
您需要将图片框更改为新类的实例。

但是,不要

WndProc 除非绝对必要,否则不应在 .Net 开发中使用;在这里,没有必要。
您应该使用 .Net 事件。

【讨论】:

  • 好的。您仍然需要了解您的问题是什么。
  • 你明白我在回答中所说的话吗?
  • @user572313 如果你用星号对包裹你的 cmets,你也可以 SHOUT IN BOLD 这可能会帮助你得到答案......
【解决方案2】:

SLaks 提供的答案是正确的,我 100% 同意他的 cmets,即您需要理解代码的含义,而不是从 Stack Overflow 上复制和粘贴一个神奇的 sn-p。

但我看到您仍然在尖叫应该如何编写代码以使用您的自定义 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

【讨论】:

  • 非常感谢“科迪·格雷”!我对其进行了测试并且工作得非常好!
  • 但我不想创建一个新的图片框类。我想用我的图片框表格,不做一个新的图片框
  • @user572312:对不起,我不明白你的意思。您已经创建了一个新的图片框类。它是最底层的pictureBox1,它继承自System::Windows::Forms::PictureBox 基类。如果您想创建另一个图片框类,您可以从该类继承,就像它从其基类继承一样。
  • 我想在我的表单中为我的图片框定义“virtual void WndProc”[不想创建一个新的图片框类]然后当我按下我的图片框 WndProc 调用上的一个键时
  • 如果您想在表单中添加 第二个 图片框,您需要创建该类的新实例并使用 Form::Controls propertyAdd发给ControlCollection
猜你喜欢
  • 2020-05-13
  • 2011-10-11
  • 1970-01-01
  • 2018-04-14
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多