2012-02-28 65 views
1

我創建了文本框類的子類,這樣我可以捕捉到的onkeydown)所有的鍵盤事件(方法(KeyDown事件不會爲所有的鍵盤事件觸發,包括但不限於,退格鍵和箭頭鍵,但OnKeyDown會)如何在我的重寫中調用基類實現TextBox :: OnKeyDown()?

問題在於它有效地禁用了TextBox,因爲它完全繞過了控件的內部鍵盤處理。顯而易見的解決方案是在超類中調用OnKeyDown。

我該如何在Windows運行系統中執行此操作? 只是調用TextBox :: OnKeyDown(...)將不起作用,因爲它會有效地帶我到我的覆蓋

OnKeyDown()方法是IControlOverrides接口的一部分,看來我無法獲得指向該接口的TextBox對象實例的接口指針,但僅限於我的派生對象實例。

+0

在C++/cx中沒有'__super'關鍵字嗎? – user1227804 2012-02-28 11:23:23

+0

__super是typedef到基類,這意味着它與在此示例中執行TextBox :: OnKeyDown(...)相同。 – 2012-02-28 12:26:52

回答

1

繼承在C++/CX中是而不是與C++中的繼承相同。這是因爲C++/CX ref類實際上是COM對象,它通過各種聚合來實現繼承。

我一起工作的例子是

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

這將無法工作,因爲文本框::的onkeydown()將有效調用MyTextBox ::的onkeydown()。這是因爲在C++/CX和COM中如何實現虛擬方法,因此可以深入閱讀here

的Visual Studio 11開發者預覽版解決方案

短的版本是,的onkeydown()方法是IControlOverrides接口的一部分,雙方MyTextBox和文本框來實現,這要歸功於一些聰明的編譯器技巧。爲了獲得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 Beta版解決方案

由於有這麼很多其他的東西,這已經在VS 11 Beta中得到了改進。雖然「__super ::」仍然無法工作,現在工作得很好只是撥打電話,以明確其所定義的接口:該接口的onkeydown

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

在VS對象瀏覽器會告訴你()方法在(IControlOverrides)中定義。

問題解決!

+0

幾年後的更新:我試着用VS 12編譯器使用'TextBox :: OnKeyDown(e)',它只是做正確的事情。這些體操應該不再有必要。 – sethobrien 2015-03-18 17:58:20

相關問題