2012-05-10 6 views
6

Ich habe eine CWnd abgeleitete Klasse mit dem Namen Button und wollen CWnd Zugänglichkeitsfunktionen verwenden, überschreiben ich diese Funktion in meiner Klasse:Überschrieben Funktionen für IAccessible Schnittstelle funktionieren nicht in cwnd-drived Klasse

virtual HRESULT get_accName(VARIANT varChild, BSTR *pszName); 
virtual HRESULT get_accChildCount(long *pcountChildren); 
virtual HRESULT get_accDefaultAction(VARIANT varChild, BSTR *pszDefaultAction); 
virtual HRESULT get_accDescription(VARIANT varChild, BSTR *pszDescription); 
virtual HRESULT get_accKeyboardShortcut(VARIANT varChild, BSTR *pszKeyboardShortcut); 
virtual HRESULT get_accParent(IDispatch **ppdispParent); 
virtual HRESULT get_accRole(VARIANT varChild, VARIANT *pvarRole); 
virtual HRESULT get_accState(VARIANT varChild, VARIANT *pvarState); 
virtual HRESULT get_accValue(VARIANT varChild, BSTR *pszValue); 

Wenn Ich führe das Programm, und setze einen Punkt in der Implementierung von irgendwelchen dieser Funktionen ein, Programm tritt nicht in diese Funktionen ein, und verwendet stattdessen Elternfunktion, kann irgendeine mir helfen?

Implementierung von get_accName:

HRESULT Button::get_accName(VARIANT varChild, BSTR *pszName) 
{ 
    //*pszName = SysAllocString(lpstrTitle); 
    return S_OK; 
} 

Ich nenne EnableActiveAccessibility() in Konstruktor dieser Klasse, aber noch nicht arbeiten.

+0

Wenn ich die get_accName Methode in IAccessible Schnittstelle für ein Kombinationsfeld in einem dialogbasierten MFC-Anwendung außer Kraft setzen, wird das Verfahren ausgeführt. Aber wenn es für andere Standardsteuerelemente wie Button, Edit, Checkbox außer Kraft gesetzt wird, kommt die Ausführung nicht dorthin. –

+0

Tun Sie nicht vorgeben, 'get_accValue' zu ​​verwenden? – sergiol

Antwort

0

Haben Sie versucht, so etwas wie:

class CWnd { 
    virtual HRESULT get_accChildCount(long *pcountChildren); 
}; 

class Button : public CWnd { 

    virtual HRESULT get_accChildCount(long *pcountChildren) { 

    HRESULT childCount = CWnd:get_accChildCount(long *pcountChildren); 

    //you can use the value from the ancestor class if it is of any use 
    //to you or add your own code 
    childCount = 1234; 

    return childCount; 
    } 
}; 
+0

Wenn eine _ "Button" _ Klasse von _ "CButton" _ geerbt wird, wird der _ "get_accName" _ nicht ausgeführt. –

0

Sie diese außer Kraft gesetzt Methoden Aufruf falsch sein kann. Versuchen Sie, das Überschreiben zu überschreiben. Es kann die Dinge klarer machen und auf etwas hinweisen, wenn etwas nicht stimmt. Siehe unten für eine Beispielimplementierung.

ref class Base 
{ 
public:  
    virtual void Boo() 
    { 
     Show("Base::Boo"); 
    }  
}; 

ref class Derived : Base 
{ 
public:  
    //Overrides Base::Boo 
    virtual void Woo() = Base::Boo 
    { 
     Show("Derived::Woo"); 
    } 
}; 

Invoke es mag:

void _tmain() 
{ 
    Base* r = new Derived(); 

    Derived* d = dynamic_cast<Derived*>(r); 
    d->Woo(); 
} 

Von CodeProjects