1

いくつかのテストを行っています... ownerdraw カスタム コントロールで。

このコードはコンパイルされますが、クラッシュします...「m」が原因で<undefined value>

MySplitContainerControl::WndProc(m);/* ブレーキポイントを使用すると、メッセージが表示されます .... しかし、ブレーキポイントを削除するとクラッシュします!

Splitcontainer からウィンドウの外観をオーバーライドしようとしています。

protected: static int WM_PAINT = 0x000F;
protected: virtual void WndProc(Message% m) override 
    {
    MySplitContainerControl::WndProc(m); 
    /*Form::WndProc(m);*/
    if (m.Msg == WM_PAINT)
        {
                Graphics^ graphics = Graphics::FromHwnd(this->Handle);
                PaintEventArgs^ pe = gcnew PaintEventArgs(graphics, Rectangle(0,0, this->Width, this->Height));
                OnPaint(pe);
        }

アイデアを得るために、ここで行っているのは完全なコードです。

#pragma once

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 MySplitContainer {

    /// <summary>
    /// Summary for MySplitContainerControl
    /// </summary>
    public ref class MySplitContainerControl : public System::Windows::Forms::SplitContainer
    {
    public:
        MySplitContainerControl(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~MySplitContainerControl()
        {
            if (components)
            {
                delete components;
            }
        }

    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->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        }
#pragma endregion

    protected: static int WM_PAINT = 0x000F;
    protected: virtual void WndProc(Message% m) override 
        {
        MySplitContainerControl::WndProc(m);
        /*Form::WndProc(m);*/
        if (m.Msg == WM_PAINT)
            {
                    Graphics^ graphics = Graphics::FromHwnd(this->Handle);
                    PaintEventArgs^ pe = gcnew PaintEventArgs(graphics, Rectangle(0,0, this->Width, this->Height));
                    OnPaint(pe);
            }
        }

    protected: virtual void OnPaint(PaintEventArgs ^e) override
        {

        }

    };
}
4

1 に答える 1

1

あなたが持っている:

protected: virtual void WndProc(Message% m) override 
{
    MySplitContainerControl::WndProc(m);
    // ...
}

したがって、オーバーライドさWndProcれたメソッド自体を呼び出しています。これにより、無限再帰呼び出しが発生し、StackOverflowException.

そうしましょうForm::WndProc(m)(コメント行)。WndProcそれ自体ではなく、基本クラスの を呼び出す必要があります。

第 2 に、 をオーバーライドするときは、ウィンドウに新しい(and )を作成する代わりに、andメソッドWM_PAINTを呼び出す必要があります。BeginPaintEndPaintGraphicsDC

于 2013-03-16T05:13:53.530 に答える