2012-07-06 45 views
0

我有三个实体的场景:C++ CLI的KeyDown ::引发错误错误C3767候选人功能(S)无法访问

  • 一个方法的接口存根
  • 从`系统继承的类:: Windows :: Forms :: NativeWindow`并实现接口
  • 包装类,它具有类类型的私有成员和接口类型的公共属性。这个类也有一个`KeyDown`事件成员,这是可以调用/从窗口类中引发

这是我使用的文件:

INativeWindow.h

#pragma once 
public interface class INativeWindow 
{ 
    void Nothing(); 
}; 

CLINativeWindow.h

#pragma once 
ref class NWHolder; 
public ref class CLINativeWindow : System::Windows::Forms::NativeWindow, INativeWindow 
{ 
public: 
    NWHolder^ Parent; 
    virtual void Nothing() sealed; 
    void DoIt(); 
}; 

CLINativeWindow.cpp

#include "stdafx.h" 
#include "CLINativeWindow.h" 

void CLINativeWindow::Nothing() 
{ 
    Console::Write("None"); 
} 
void CLINativeWindow::DoIt() 
{ 
    Parent->KeyDown(this, nullptr); 
}; 

NWHolder.h

#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_; 
}; 

NWHolder.cpp

#include "stdafx.h" 
#include "NWHolder.h" 


INativeWindow^ NWHolder::OwnNativeWindow::get() 
{ 
    return nativeWindow_; 
} 

void NWHolder::OwnNativeWindow::set(INativeWindow^ value) 
{ 
    nativeWindow_ = dynamic_cast<CLINativeWindow^>(value); 
} 

编译时间,我得到这个错误: Error 1 error C3767: 'NWHolder::KeyDown::raise': candidate function(s) not accessible ..\NativeWindows\CLINativeWindow.cpp 10

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

回答

3

C++/CLI事件的'raise'内部方法总是被声明为protected。在名为“FireKeyDownEvent”的NWHolder上添加一个方法,并为其提供任何辅助功能。

+0

已经做到了这一点,这是我也偶然发现的最优雅的方式.. – teodron 2012-07-07 08:41:25