2012-02-28 14 views
1

は私が含め、KeyDownイベントは、すべてのキーボードイベントをトリガしませんは、OnKeyDown内のすべてのキーボードイベント()メソッド(を捉えることができるようにのTextBoxクラスのサブクラスを作成しますが、バックスペースに制限されておらず、矢印キーが、OnKeyDownになります)オーバーライドで基本クラスの実装TextBox :: OnKeyDown()を呼び出すにはどうすればよいですか?

この問題は、TextBoxがコントロールの内部キーボード処理を完全にバイパスするため、TextBoxを効果的に無効にすることが問題です。明らかな解決策は、スーパークラスのOnKeyDownを呼び出すことです。

Windowsランタイムでどうすればいいですか? TextBox :: OnKeyDown(...)を呼び出すだけでは、オーバーライドが有効になります。

OnKeyDown()メソッドはIControlOverridesインターフェイスの一部であり、TextBoxオブジェクトインスタンスのインターフェイスへのインターフェイスポインタを取得できないようですが、派生オブジェクトインスタンスのみです。

+0

C++/cxに '__super'キーワードはありませんか? – user1227804

+0

__superは、この例ではTextBox :: OnKeyDown(...)を実行するのと同じであるという意味で、ベースクラスにtypedefされています。 –

答えて

1

C++/CXの継承は、ではなく、で、C++の継承と同じです。これは、C++/CXのrefクラスは実際にはCOMオブジェクトであり、さまざまな集約を通じて継承を実装しているからです。テキストボックス(TextBox)::は、OnKeyDown()が効果的にMyTextBoxを::は、OnKeyDownを呼び出しますので

は、私が働いていた例は()、動作しません

public ref class MyTextBox : public TextBox { 
    MyTextBox() {}; 
    ~MyTextBox() {}; 
    virtual void OnKeyDown(KeyEventArgs^ e) override { 
    TextBox::OnKeyDown(e); 
    }; 
}; 

ました。これは、仮想メソッドがC++/CXおよびCOMでどのように実装されているかに基づいており、詳細な概要はhereとなります。

のVisual Studio 11の開発者プレビューソリューション

ショートバージョンは、OnKeyDown()メソッドは、MyTextBoxをとテキストボックスの両方により実現し、いくつかの巧妙なコンパイラのトリックのおかげでIControlOverridesインタフェースの一部であるということです。 TextBox実装用のインターフェイスポインタを取得するには、最初にTextBoxにそれを尋ねる必要があります.MyTextBoxに問い合わせると、私たちはどこから始めたのでしょう。これは継承がCOM、ないC++であるため、そして、私たちはやること基底クラスへのポインタを通じてオブジェクトの代わりに、この

virtual void OnKeyDown(KeyEventArgs^ e) override { 
    struct IControlOverrides^ ico; 
    HRESULT hr = __cli_baseclass->__cli_QueryInterface(const_cast<class Platform::Guid%>(reinterpret_cast<const class Platform::Guid%>(__uuidof(struct IControlOverrides^))),reinterpret_cast<void**>(&ico)); 
    if (!hr) { 
     hr = ico->__cli_OnKeyDown(e); 
    }; 
    }; 

のVisual Studio 11ベータ版のソリューション

そうと同じようにこれはVS 11 Betaで改善されています。

virtual void OnKeyDown(KeyEventArgs^ e) override { 
    IControlOverrides::OnKeyDown(e); 
    }; 

VSでのオブジェクトブラウザは、あなたが表示されますは、OnKeyDownをインターフェイス:「__super ::」まだ動作しません、それは今も元気に動作している間だけ、それが定義されているインターフェイスに明示的に呼び出しを作るために()メソッドは(IControlOverrides)で定義されています。

問題が解決しました。

+0

数年後のアップデート:VS 12コンパイラで 'TextBox :: OnKeyDown(e)'を使ってみました。ちょうど良いことです。これらの体操はもはや必要ではありません。 – sethobrien

関連する問題