自定义控制自定义功能

时间:2011-02-06 18:47:53

标签: inheritance c++-cli custom-controls

所以在我的程序中我有一堆非常相似的按钮,它们都有相同的变量并执行相同的功能......所以我想我会创建一个“CustomButton”类,一个C ++按钮的子代,但我的功能和所有已经存在的功能。 问题是我有班级

public ref class CustomButton : public System::Windows::Forms::Button{
protected:
    virtual void OnMouseDown(System::Windows::Forms::MouseEventArgs ^e) override{
        if(e->Button == System::Windows::Forms::MouseButtons::Left) this->Location = System::Drawing::Point(this->Location.X+1, this->Location.Y+1);
    }
    virtual void OnMouseUp(System::Windows::Forms::MouseEventArgs ^e) override{
        if(e->Button == System::Windows::Forms::MouseButtons::Left) this->Location = System::Drawing::Point(this->Location.X-1, this->Location.Y-1);
    }
};

如上所述,我可以很好地改变变量,但是当我尝试改变它的功能时......它只是停止执行其他功能。我的意思是,稍后当我这样做时......

CustomButton ^encButton;
this->encButton->Click += gcnew System::EventHandler(this, &Form1::encButton_Click);

它完全忽略它,根本不会调用encButton_Click函数。如果我尝试使它成为mousedown /无论如何。

我认为我正在覆盖一些我不喜欢做的事情......但我想不出另一种方法去做我想做的事情?

1 个答案:

答案 0 :(得分:1)

您必须调用基类方法以保持原始框架代码正常工作。修正:

virtual void OnMouseDown(System::Windows::Forms::MouseEventArgs ^e) override {
    __super::OnMouseDown(e);
    if (e->Button == System::Windows::Forms::MouseButtons::Left) {
        this->Location = System::Drawing::Point(this->Location.X+1, this->Location.Y+1);
    }
}

您可以在第一个或最后一个调用基类方法之间做出选择。虽然最后通常是正确的方法,但您正在更改按钮的状态,以保证首先调用基类方法。这取决于。