0

3つのエンティティを持つシナリオがあります。

  • 1つのメソッドスタブを持つインターフェイス
  • `System :: 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)ましたが失敗しました。

4

1 に答える 1

3

C ++/CLIイベントの「raise」内部メソッドは常に保護されていると宣言されます。NWHolderに「FireKeyDownEvent」という名前のメソッドを追加し、好きなようにアクセスできるようにします。

于 2012-07-07T01:01:24.367 に答える