Comment appeler la zone de mise en œuvre de la classe de base :: ONKEYDOWN () dans ma substitution?

StackOverflow https://stackoverflow.com/questions/9480839

Question

J'ai créé une sous-classe de la classe la classe de texte de sorte que je puisse capturer tous les événements de clavier dans la méthode OnKeyDown () ( l'événement de la clé à ne pas déclencherPour tous les événements du clavier, y compris, mais sans s'y limiter, les clés arrière et les touches arrows, mais que ONKEDOWDDOWDD) .

Le problème avec ceci est qu'il désactive efficacement la zone de texte, car elle contourne entièrement la manipulation du clavier interne du contrôle.La solution évidente consiste à appeler sur la superclasse.

Comment puis-je faire cela dans Windows Runtime? juste appeler textbox :: Onkeydown (...) ne fonctionnera pas, car cela m'emmène efficacement à mon dominable .

La méthode OnKeydown () fait partie de l'interface Icontroloverrides, et il semble que je ne puisse pas obtenir un pointeur d'interface sur cette interface pour l'instance d'objet Textbox, mais uniquement pour mon instance d'objet dérivée.

Était-ce utile?

La solution

Héritage en C ++ / CX est pas identique à l'héritage en C ++. En effet, les classes REF C ++ / CX sont en fait des objets COM, qui implémentent l'héritage grâce à une variété d'agrégation.

L'exemple que je travaillais avec était

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

Ce qui ne fonctionnera pas, car la zone de texte :: Onkeydown () appelle efficacement MyTextBox :: ONKEYDOWN (). Cela est dû à la manière dont les méthodes virtuelles sont implémentées dans C ++ / CX et COM, une vue d'ensemble en profondeur peut être lue ici .

Solution de prévisualisation Visual Studio 11

La version courte est que la méthode ONKEYDOWN () fait partie de l'interface Icontroloverrides, mise en œuvre par MyTextBox et Textbox, grâce à quelques astuces intelligentes du compilateur. Pour obtenir la maintien du pointeur d'interface pour la mise en œuvre de la zone de texte, nous avons d'abord besoin de demander à la zone de texte pour cela - si nous demandons à MyTextBox, nous nous retrouvons là où nous avons commencé. Et comme il s'agit d'héritage dans COM, pas C ++, nous faisons cela à travers un pointeur sur l'objet baseclass au lieu de ce :

  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 Solution

Comme avec tant d'autres choses, cela a été amélioré dans la version bêta du VS 11. Alors que "__super ::" ne fonctionnera toujours pas, cela fonctionne désormais bien pour rendre l'appel explicitement à l'interface dans laquelle il est défini:

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

Le navigateur d'objet dans VS vous montrera quelle interface la méthode OnKeydown () est définie dans (icontrolverrides).

problème résolu!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top