Winforms C++;CLI KeyDown::引发错误C3767候选函数不可访问

Winforms C++;CLI KeyDown::引发错误C3767候选函数不可访问,winforms,events,event-handling,compiler-errors,c++-cli,Winforms,Events,Event Handling,Compiler Errors,C++ Cli,我有一个包含三个实体的场景: 带有一个方法存根的接口 从“System::Windows::Forms::NativeWindow”继承并实现接口的类 具有类类型的私有成员和接口类型的公共属性的包装类。此类还有一个“KeyDown”事件成员,可从窗口类调用/引发该成员 以下是我正在使用的文件: 第二个窗口 ClintaviveWindow.h CLINativeWindow.cpp NWHolder.h NWHolder.cpp #包括“stdafx.h” #包括“NWHolder.h” IN

我有一个包含三个实体的场景:

带有一个方法存根的接口
  • 从“System::Windows::Forms::NativeWindow”继承并实现接口的类
  • 具有类类型的私有成员和接口类型的公共属性的包装类。此类还有一个“KeyDown”事件成员,可从窗口类调用/引发该成员
  • 以下是我正在使用的文件:

    第二个窗口

    ClintaviveWindow.h

    CLINativeWindow.cpp

    NWHolder.h

    NWHolder.cpp

    #包括“stdafx.h”
    #包括“NWHolder.h”
    INativeWindow ^NWHolder::OwnNativeWindow::get()
    {
    返回本机窗口;
    }
    void NWHolder::OwnNativeWindow::set(INativeWindow^值)
    {
    nativeWindow=动态转换(值);
    }
    
    在编译时,我得到以下错误:
    错误1错误C3767:'NWHolder::KeyDown::raise':候选函数不可访问..\NativeWindows\CLINativeWindow.cpp 10


    有什么可以做的吗?我甚至尝试了
    #pragma make_public(System::Windows::Forms::KeyEventHandler)
    ,但失败了。

    C++/CLI事件的“raise”内部方法始终声明为受保护。在NWHolder上添加一个名为“FireKeyDownEvent”的方法,并为其提供您喜欢的任何可访问性。

    C++/CLI事件的“raise”内部方法始终声明为受保护。在NWHolder上添加一个名为“FireKeyDownEvent”的方法,并为其提供您喜欢的任何可访问性

    #pragma  once
    public interface class INativeWindow
    {
        void Nothing();
    };
    
    #pragma  once
    ref class NWHolder;
    public ref class CLINativeWindow : System::Windows::Forms::NativeWindow, INativeWindow
    {
    public:
        NWHolder^ Parent;
        virtual void  Nothing() sealed;
        void DoIt();
    };
    
    #include "stdafx.h"
    #include "CLINativeWindow.h"
    
    void CLINativeWindow::Nothing()
    {
        Console::Write("None");
    }
    void CLINativeWindow::DoIt()
    {
        Parent->KeyDown(this, nullptr);
    };
    
    #pragma  once
    #include "INativeWindow.h"
    #include "CLINativeWindow.h"
    
    public ref class NWHolder
    {
    
    internal:
        event System::Windows::Forms::KeyEventHandler^ KeyDown;
    public:
        virtual property INativeWindow^ OwnNativeWindow
        {
            INativeWindow^ __clrcall get() sealed;
            void __clrcall set(INativeWindow^ value) sealed; 
        }
    
    private:
        CLINativeWindow^ nativeWindow_;
    };
    
    #include "stdafx.h"
    #include "NWHolder.h"
    
    
    INativeWindow^ NWHolder::OwnNativeWindow::get()
    {
        return nativeWindow_;
    }
    
    void NWHolder::OwnNativeWindow::set(INativeWindow^ value)
    {
        nativeWindow_ = dynamic_cast<CLINativeWindow^>(value); 
    }