Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

AccessibleObject Class

Definition

Namespace:
System.Windows.Forms
Assembly:
System.Windows.Forms.dll
Source:
AccessibleObject.cs
Source:
AccessibleObject.cs
Source:
AccessibleObject.cs
Source:
AccessibleObject.cs
Source:
AccessibleObject.cs

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Provides information that accessibility applications use to adjust an application's user interface (UI) for users with impairments.

public ref class AccessibleObject : MarshalByRefObject, Accessibility::IAccessible, System::Reflection::IReflect
public ref class AccessibleObject : System::Runtime::InteropServices::StandardOleMarshalObject, Accessibility::IAccessible, System::Reflection::IReflect
[System.Runtime.InteropServices.ComVisible(true)]
public class AccessibleObject : MarshalByRefObject, Accessibility.IAccessible, System.Reflection.IReflect
[System.Runtime.InteropServices.ComVisible(true)]
public class AccessibleObject : System.Runtime.InteropServices.StandardOleMarshalObject, Accessibility.IAccessible, System.Reflection.IReflect
public class AccessibleObject : System.Runtime.InteropServices.StandardOleMarshalObject, Accessibility.IAccessible, System.Reflection.IReflect
[<System.Runtime.InteropServices.ComVisible(true)>]
type AccessibleObject = class
 inherit MarshalByRefObject
 interface IReflect
 interface IAccessible
 interface UnsafeNativeMethods.IEnumVariant
 interface UnsafeNativeMethods.IMarshal
[<System.Runtime.InteropServices.ComVisible(true)>]
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible
 interface UnsafeNativeMethods.IEnumVariant
 interface UnsafeNativeMethods.IOleWindow
[<System.Runtime.InteropServices.ComVisible(true)>]
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible.Interface
 interface IAccessible
 interface IAccessibleEx.Interface
 interface IServiceProvider.Interface
 interface IRawElementProviderSimple.Interface
 interface IRawElementProviderFragment.Interface
 interface IRawElementProviderFragmentRoot.Interface
 interface IInvokeProvider.Interface
 interface IValueProvider.Interface
 interface IRangeValueProvider.Interface
 interface IExpandCollapseProvider.Interface
 interface IToggleProvider.Interface
 interface ITableProvider.Interface
 interface ITableItemProvider.Interface
 interface IGridProvider.Interface
 interface IGridItemProvider.Interface
 interface IEnumVARIANT.Interface
 interface IOleWindow.Interface
 interface ILegacyIAccessibleProvider.Interface
 interface ISelectionProvider.Interface
 interface ISelectionItemProvider.Interface
 interface IRawElementProviderHwndOverride.Interface
 interface IScrollItemProvider.Interface
 interface IMultipleViewProvider.Interface
 interface ITextProvider.Interface
 interface ITextProvider2.Interface
 interface IDispatch.Interface
 interface IDispatchEx.Interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible
 interface UnsafeNativeMethods.IAccessibleEx
 interface UnsafeNativeMethods.IServiceProvider
 interface UnsafeNativeMethods.IRawElementProviderSimple
 interface UnsafeNativeMethods.IRawElementProviderFragment
 interface UnsafeNativeMethods.IRawElementProviderFragmentRoot
 interface UnsafeNativeMethods.IInvokeProvider
 interface UnsafeNativeMethods.IValueProvider
 interface UnsafeNativeMethods.IRangeValueProvider
 interface UnsafeNativeMethods.IExpandCollapseProvider
 interface UnsafeNativeMethods.IToggleProvider
 interface UnsafeNativeMethods.ITableProvider
 interface UnsafeNativeMethods.ITableItemProvider
 interface UnsafeNativeMethods.IGridProvider
 interface UnsafeNativeMethods.IGridItemProvider
 interface UnsafeNativeMethods.IEnumVariant
 interface UnsafeNativeMethods.IOleWindow
 interface UnsafeNativeMethods.ILegacyIAccessibleProvider
 interface UnsafeNativeMethods.ISelectionProvider
 interface UnsafeNativeMethods.ISelectionItemProvider
 interface UnsafeNativeMethods.IRawElementProviderHwndOverride
 interface UnsafeNativeMethods.IScrollItemProvider
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible
 interface Interop.UiaCore.IAccessibleEx
 interface Interop.Ole32.IServiceProvider
 interface Interop.UiaCore.IRawElementProviderSimple
 interface Interop.UiaCore.IRawElementProviderFragment
 interface Interop.UiaCore.IRawElementProviderFragmentRoot
 interface Interop.UiaCore.IInvokeProvider
 interface Interop.UiaCore.IValueProvider
 interface Interop.UiaCore.IRangeValueProvider
 interface Interop.UiaCore.IExpandCollapseProvider
 interface Interop.UiaCore.IToggleProvider
 interface Interop.UiaCore.ITableProvider
 interface Interop.UiaCore.ITableItemProvider
 interface Interop.UiaCore.IGridProvider
 interface Interop.UiaCore.IGridItemProvider
 interface Interop.Oleaut32.IEnumVariant
 interface Interop.Ole32.IOleWindow
 interface Interop.UiaCore.ILegacyIAccessibleProvider
 interface Interop.UiaCore.ISelectionProvider
 interface Interop.UiaCore.ISelectionItemProvider
 interface Interop.UiaCore.IRawElementProviderHwndOverride
 interface Interop.UiaCore.IScrollItemProvider
 interface Interop.UiaCore.IMultipleViewProvider
 interface Interop.UiaCore.ITextProvider
 interface Interop.UiaCore.ITextProvider2
type AccessibleObject = class
 inherit StandardOleMarshalObject
 interface IReflect
 interface IAccessible
 interface Interop.UiaCore.IAccessibleEx
 interface IServiceProvider.Interface
 interface Interop.UiaCore.IRawElementProviderSimple
 interface Interop.UiaCore.IRawElementProviderFragment
 interface Interop.UiaCore.IRawElementProviderFragmentRoot
 interface Interop.UiaCore.IInvokeProvider
 interface Interop.UiaCore.IValueProvider
 interface Interop.UiaCore.IRangeValueProvider
 interface Interop.UiaCore.IExpandCollapseProvider
 interface Interop.UiaCore.IToggleProvider
 interface Interop.UiaCore.ITableProvider
 interface Interop.UiaCore.ITableItemProvider
 interface Interop.UiaCore.IGridProvider
 interface Interop.UiaCore.IGridItemProvider
 interface IEnumVARIANT.Interface
 interface IOleWindow.Interface
 interface Interop.UiaCore.ILegacyIAccessibleProvider
 interface Interop.UiaCore.ISelectionProvider
 interface Interop.UiaCore.ISelectionItemProvider
 interface Interop.UiaCore.IRawElementProviderHwndOverride
 interface Interop.UiaCore.IScrollItemProvider
 interface Interop.UiaCore.IMultipleViewProvider
 interface Interop.UiaCore.ITextProvider
 interface Interop.UiaCore.ITextProvider2
Public Class AccessibleObject
Inherits MarshalByRefObject
Implements IAccessible, IReflect
Public Class AccessibleObject
Inherits StandardOleMarshalObject
Implements IAccessible, IReflect
Inheritance
AccessibleObject
Inheritance
Derived
Attributes
Implements

Examples

The following code example demonstrates the creation of an accessibility-aware chart control, using the AccessibleObject and Control.ControlAccessibleObject classes to expose accessible information. The control plots two curves along with a legend. The ChartControlAccessibleObject class, which derives from ControlAccessibleObject, is used in the CreateAccessibilityInstance method to provide custom accessible information for the chart control. Because the chart legend is not an actual Control -based control, but instead is drawn by the chart control, it does not have any built-in accessible information. Because of this, the ChartControlAccessibleObject class overrides the GetChild method to return the CurveLegendAccessibleObject that represents accessible information for each part of the legend. When an accessible-aware application uses this control, the control can provide the necessary accessible information.

#using <Accessibility.dll>
#using <System.dll>
#using <System.Windows.Forms.dll>
#using <System.Drawing.dll>

using namespace System;
using namespace System::Drawing;
using namespace System::Windows::Forms;

// Declare a chart control that demonstrates accessibility in Windows Forms.
public ref class ChartControl: public System::Windows::Forms::UserControl
{
public:
 ref class ChartControlAccessibleObject;

 // forward declaration
 // Inner Class that represents a legend for a curve in the chart.
 ref class CurveLegend
 {

 // Inner class CurveLegendAccessibleObject represents accessible information
 // associated with the CurveLegend object.
 public:
 ref class CurveLegendAccessibleObject: public AccessibleObject
 {
 private:
 CurveLegend^ curveLegend;

 public:
 CurveLegendAccessibleObject( CurveLegend^ curveLegend )
 : AccessibleObject()
 {
 this->curveLegend = curveLegend;
 }


 private:

 property ChartControlAccessibleObject^ ChartControl 
 {

 // Private property that helps get the reference to the parent ChartControl.
 ChartControlAccessibleObject^ get()
 {
 return dynamic_cast<ChartControlAccessibleObject^>(Parent);
 }

 }

 internal:

 property int ID 
 {

 // Internal helper function that returns the ID for this CurveLegend.
 int get()
 {
 for ( int i = 0; i < ChartControl->GetChildCount(); i++ )
 {
 if ( ChartControl->GetChild( i ) == this )
 {
 return i;
 }

 }
 return -1;
 }

 }

 public:

 property Rectangle Bounds 
 {

 // Gets the Bounds for the CurveLegend. This is used by accessibility programs.
 virtual Rectangle get() override
 {
 
 // The bounds is in screen coordinates.
 Point loc = curveLegend->Location;
 return Rectangle(curveLegend->chart->PointToScreen( loc ),curveLegend->Size);
 }

 }

 property String^ Name 
 {

 // Gets or sets the Name for the CurveLegend. This is used by accessibility programs.
 virtual String^ get() override
 {
 return curveLegend->Name;
 }

 virtual void set( String^ value ) override
 {
 curveLegend->Name = value;
 }

 }

 property AccessibleObject^ Parent 
 {

 // Gets the Curve Legend Parent's Accessible object.
 // This is used by accessibility programs.
 virtual AccessibleObject^ get() override
 {
 return curveLegend->chart->AccessibilityObject;
 }

 }

 property System::Windows::Forms::AccessibleRole Role 
 {

 // Gets the role for the CurveLegend. This is used by accessibility programs.
 virtual System::Windows::Forms::AccessibleRole get() override
 {
 return ::AccessibleRole::StaticText;
 }

 }

 property AccessibleStates State 
 {

 // Gets the state based on the selection for the CurveLegend.
 // This is used by accessibility programs.
 virtual AccessibleStates get() override
 {
 AccessibleStates state = AccessibleStates::Selectable;
 if ( curveLegend->Selected )
 {
 state = static_cast<AccessibleStates>(state | AccessibleStates::Selected);
 }

 return state;
 }

 }

 // Navigates through siblings of this CurveLegend. This is used by accessibility programs.
 virtual AccessibleObject^ Navigate( AccessibleNavigation navdir ) override
 {
 
 // Uses the internal NavigateFromChild helper function that exists
 // on ChartControlAccessibleObject.
 return ChartControl->NavigateFromChild( this, navdir );
 }


 // Selects or unselects this CurveLegend. This is used by accessibility programs.
 virtual void Select( AccessibleSelection selection ) override
 {
 
 // Uses the internal SelectChild helper function that exists
 // on ChartControlAccessibleObject.
 ChartControl->SelectChild( this, selection );
 }

 };


 private:

 // class CurveLgendAccessibleObject
 String^ name;
 ChartControl^ chart;
 CurveLegendAccessibleObject^ accObj;
 bool selected;
 Point location;

 public:
 CurveLegend( ChartControl^ chart, String^ name )
 {
 this->chart = chart;
 this->name = name;
 selected = true;
 }


 property AccessibleObject^ AccessibilityObject 
 {

 // Gets the accessibility object for the curve legend.
 AccessibleObject^ get()
 {
 if ( accObj == nullptr )
 {
 accObj = gcnew CurveLegendAccessibleObject( this );
 }

 return accObj;
 }

 }

 property Rectangle Bounds 
 {

 // Gets the bounds for the curve legend.
 Rectangle get()
 {
 return Rectangle(Location,Size);
 }

 }

 property Point Location 
 {

 // Gets or sets the location for the curve legend.
 Point get()
 {
 return location;
 }

 void set( Point value )
 {
 location = value;
 chart->Invalidate();
 
 // Notifies the chart of the location change. This is used for
 // the accessibility information. AccessibleEvents::LocationChange
 // tells the chart the reason for the notification.
 chart->AccessibilityNotifyClients( AccessibleEvents::LocationChange, (dynamic_cast<CurveLegendAccessibleObject^>(AccessibilityObject))->ID );
 }

 }

 property String^ Name 
 {

 // Gets or sets the Name for the curve legend.
 String^ get()
 {
 return name;
 }

 void set( String^ value )
 {
 if ( name != value )
 {
 name = value;
 chart->Invalidate();
 
 // Notifies the chart of the name change. This is used for
 // the accessibility information. AccessibleEvents::NameChange
 // tells the chart the reason for the notification.
 chart->AccessibilityNotifyClients( AccessibleEvents::NameChange, (dynamic_cast<CurveLegendAccessibleObject^>(AccessibilityObject))->ID );
 }
 }

 }

 property bool Selected 
 {

 // Gets or sets the Selected state for the curve legend.
 bool get()
 {
 return selected;
 }

 void set( bool value )
 {
 if ( selected != value )
 {
 selected = value;
 chart->Invalidate();
 
 // Notifies the chart of the selection value change. This is used for
 // the accessibility information. The AccessibleEvents value depends upon
 // if the selection is true (AccessibleEvents::SelectionAdd) or
 // false (AccessibleEvents::SelectionRemove).
 chart->AccessibilityNotifyClients( selected ? AccessibleEvents::SelectionAdd : AccessibleEvents::SelectionRemove, (dynamic_cast<CurveLegendAccessibleObject^>(AccessibilityObject))->ID );
 }
 }

 }

 property System::Drawing::Size Size 
 {

 // Gets the Size for the curve legend.
 System::Drawing::Size get()
 {
 int legendHeight = chart->Font->Height + 4;
 Graphics^ g = chart->CreateGraphics();
 int legendWidth = (int)g->MeasureString( Name, chart->Font ).Width + 4;
 return System::Drawing::Size( legendWidth, legendHeight );
 }

 }

 };


private:

 // class CurveLegend
 CurveLegend^ legend1;
 CurveLegend^ legend2;

public:
 ChartControl()
 {
 
 // The ChartControl draws the chart in the OnPaint .
 SetStyle( ControlStyles::ResizeRedraw, true );
 SetStyle( ControlStyles::DoubleBuffer, true );
 SetStyle( ControlStyles::AllPaintingInWmPaint, true );
 this->BackColor = System::Drawing::Color::White;
 this->Name = "ChartControl";
 this->Click += gcnew System::EventHandler( this, &ChartControl::ChartControl_Click );
 this->QueryAccessibilityHelp += gcnew System::Windows::Forms::QueryAccessibilityHelpEventHandler( this, &ChartControl::ChartControl_QueryAccessibilityHelp );
 
 // The CurveLengend is not Control-based, it just
 // represents the parts of the legend.
 legend1 = gcnew CurveLegend( this,"A" );
 legend1->Location = Point(20,30);
 legend2 = gcnew CurveLegend( this,"B" );
 legend2->Location = Point(20,50);
 }



protected:
 // Overridden to return the custom AccessibleObject
 // for the entire chart.
 virtual AccessibleObject^ CreateAccessibilityInstance() override
 {
 return gcnew ChartControlAccessibleObject( this );
 }

 virtual void OnPaint( PaintEventArgs^ e ) override
 {
 
 // The ChartControl draws the chart in the OnPaint .
 System::Windows::Forms::UserControl::OnPaint( e );
 Rectangle bounds = this->ClientRectangle;
 int border = 5;
 
 // Draws the legends first.
 StringFormat^ format = gcnew StringFormat;
 format->Alignment = StringAlignment::Center;
 format->LineAlignment = StringAlignment::Center;
 if ( legend1 != nullptr )
 {
 if ( legend1->Selected )
 {
 e->Graphics->FillRectangle( gcnew SolidBrush( Color::Blue ), legend1->Bounds );
 }
 else
 {
 e->Graphics->DrawRectangle( Pens::Blue, legend1->Bounds );
 }

 e->Graphics->DrawString( legend1->Name, this->Font, Brushes::Black, legend1->Bounds, format );
 }

 if ( legend2 != nullptr )
 {
 if ( legend2->Selected )
 {
 e->Graphics->FillRectangle( gcnew SolidBrush( Color::Red ), legend2->Bounds );
 }
 else
 {
 e->Graphics->DrawRectangle( Pens::Red, legend2->Bounds );
 }

 e->Graphics->DrawString( legend2->Name, this->Font, Brushes::Black, legend2->Bounds, format );
 }

 
 // Charts out the actual curves that represent data in the Chart.
 bounds.Inflate( -border, -border );
 array<Point>^ temp1 = {Point(bounds.Left,bounds.Bottom),Point(bounds.Left + bounds.Width / 3,bounds.Top + bounds.Height / 5),Point(bounds.Right - bounds.Width / 3,(bounds.Top + bounds.Bottom) / 2),Point(bounds.Right,bounds.Top)};
 array<Point>^curve1 = temp1;
 array<Point>^ temp2 = {Point(bounds.Left,bounds.Bottom - bounds.Height / 3),Point(bounds.Left + bounds.Width / 3,bounds.Top + bounds.Height / 5),Point(bounds.Right - bounds.Width / 3,(bounds.Top + bounds.Bottom) / 2),Point(bounds.Right,bounds.Top + bounds.Height / 2)};
 array<Point>^curve2 = temp2;
 
 // Draws the actual curve only if it is selected.
 if ( legend1->Selected )
 e->Graphics->DrawCurve( Pens::Blue, curve1 );

 if ( legend2->Selected )
 e->Graphics->DrawCurve( Pens::Red, curve2 );

 e->Graphics->DrawRectangle( Pens::Blue, bounds );
 }

 // Handles the QueryAccessibilityHelp event.
 void ChartControl_QueryAccessibilityHelp( Object^ /*sender*/, System::Windows::Forms::QueryAccessibilityHelpEventArgs^ e )
 {
 e->HelpString = "Displays chart data";
 }

 // Handles the Click event for the chart.
 // Toggles the selection of whatever legend was clicked on
 void ChartControl_Click( Object^ /*sender*/, System::EventArgs^ /*e*/ )
 {
 Point pt = this->PointToClient( Control::MousePosition );
 if ( legend1->Bounds.Contains( pt ) )
 {
 legend1->Selected = !legend1->Selected;
 }
 else
 if ( legend2->Bounds.Contains( pt ) )
 {
 legend2->Selected = !legend2->Selected;
 }
 }


public:

 property array<CurveLegend^>^ Legends 
 {

 // Gets an array of CurveLengends used in the Chart.
 array<CurveLegend^>^ get()
 {
 array<CurveLegend^>^temp3 = {legend1,legend2};
 return temp3;
 }

 }

 // Inner class ChartControlAccessibleObject represents accessible information associated with the ChartControl.
 // The ChartControlAccessibleObject is returned in the ChartControl::CreateAccessibilityInstance .
 ref class ChartControlAccessibleObject: public ControlAccessibleObject
 {
 private:
 ChartControl^ chartControl;

 public:
 ChartControlAccessibleObject( ChartControl^ ctrl )
 : ControlAccessibleObject( ctrl )
 {
 chartControl = ctrl;
 }


 property System::Windows::Forms::AccessibleRole Role 
 {

 // Gets the role for the Chart. This is used by accessibility programs.
 virtual System::Windows::Forms::AccessibleRole get() override
 {
 return ::AccessibleRole::Chart;
 }

 }

 property AccessibleStates State 
 {

 // Gets the state for the Chart. This is used by accessibility programs.
 virtual AccessibleStates get() override
 {
 return AccessibleStates::ReadOnly;
 }

 }

 // The CurveLegend objects are "child" controls in terms of accessibility so
 // return the number of ChartLengend objects.
 virtual int GetChildCount() override
 {
 return chartControl->Legends->Length;
 }


 // Gets the Accessibility object of the child CurveLegend idetified by index.
 virtual AccessibleObject^ GetChild( int index ) override
 {
 if ( index >= 0 && index < chartControl->Legends->Length )
 {
 return chartControl->Legends[ index ]->AccessibilityObject;
 }

 return nullptr;
 }


 internal:

 // Helper function that is used by the CurveLegend's accessibility object
 // to navigate between sibiling controls. Specifically, this function is used in
 // the CurveLegend::CurveLegendAccessibleObject.Navigate function.
 AccessibleObject^ NavigateFromChild( CurveLegend::CurveLegendAccessibleObject^ child, AccessibleNavigation navdir )
 {
 switch ( navdir )
 {
 case AccessibleNavigation::Down:
 case AccessibleNavigation::Next:
 return GetChild( child->ID + 1 );

 case AccessibleNavigation::Up:
 case AccessibleNavigation::Previous:
 return GetChild( child->ID - 1 );
 }
 return nullptr;
 }


 // Helper function that is used by the CurveLegend's accessibility object
 // to select a specific CurveLegend control. Specifically, this function is used
 // in the CurveLegend::CurveLegendAccessibleObject.Select function.
 void SelectChild( CurveLegend::CurveLegendAccessibleObject^ child, AccessibleSelection selection )
 {
 int childID = child->ID;
 
 // Determine which selection action should occur, based on the
 // AccessibleSelection value.
 if ( (selection & AccessibleSelection::TakeSelection) != (AccessibleSelection)0 )
 {
 for ( int i = 0; i < chartControl->Legends->Length; i++ )
 {
 if ( i == childID )
 {
 chartControl->Legends[ i ]->Selected = true;
 }
 else
 {
 chartControl->Legends[ i ]->Selected = false;
 }

 }
 
 // AccessibleSelection->AddSelection means that the CurveLegend will be selected.
 if ( (selection & AccessibleSelection::AddSelection) != (AccessibleSelection)0 )
 {
 chartControl->Legends[ childID ]->Selected = true;
 }
 
 // AccessibleSelection->AddSelection means that the CurveLegend will be unselected.
 if ( (selection & AccessibleSelection::RemoveSelection) != (AccessibleSelection)0 )
 {
 chartControl->Legends[ childID ]->Selected = false;
 }
 }
 }

 };

 // class ChartControlAccessibleObject
};


// class ChartControl
public ref class Form1: public System::Windows::Forms::Form
{
private:

 // Test out the Chart Control.
 ChartControl^ chart1;

public:
 Form1()
 {
 
 // Create a chart control and add it to the form.
 this->chart1 = gcnew ChartControl;
 this->ClientSize = System::Drawing::Size( 920, 566 );
 this->chart1->Location = System::Drawing::Point( 47, 16 );
 this->chart1->Size = System::Drawing::Size( 600, 400 );
 this->Controls->Add( this->chart1 );
 }

};


// class Form1

[STAThread]
int main()
{
 Application::Run( gcnew Form1 );
}
using System;
using System.Drawing;
using System.Windows.Forms;

namespace ChartControl
{
 public class Form1 : System.Windows.Forms.Form
 {
 // Test out the Chart Control.
 private ChartControl chart1;

 [STAThread]
 static void Main() 
 {
 Application.Run(new Form1());
 }

 public Form1() {
 // Create a chart control and add it to the form.
 this.chart1 = new ChartControl();
 this.ClientSize = new System.Drawing.Size(920, 566);

 this.chart1.Location = new System.Drawing.Point(47, 16);
 this.chart1.Size = new System.Drawing.Size(600, 400);

 this.Controls.Add(this.chart1);
 }
 }

 // Declare a chart control that demonstrates accessibility in Windows Forms.
 public class ChartControl : System.Windows.Forms.UserControl
 {
 private CurveLegend legend1;
 private CurveLegend legend2; 

 public ChartControl()
 {
 // The ChartControl draws the chart in the OnPaint override.
 SetStyle(ControlStyles.ResizeRedraw, true);
 SetStyle(ControlStyles.DoubleBuffer, true);
 SetStyle(ControlStyles.AllPaintingInWmPaint, true);

 this.BackColor = System.Drawing.Color.White;
 this.Name = "ChartControl";

 this.Click += new System.EventHandler(this.ChartControl_Click);
 this.QueryAccessibilityHelp += 
 new System.Windows.Forms.QueryAccessibilityHelpEventHandler(
 this.ChartControl_QueryAccessibilityHelp);

 // The CurveLengend is not Control-based, it just
 // represents the parts of the legend.
 legend1 = new CurveLegend(this, "A");
 legend1.Location = new Point(20, 30);
 legend2 = new CurveLegend(this, "B"); 
 legend2.Location = new Point(20, 50);
 }

 // Overridden to return the custom AccessibleObject 
 // for the entire chart.
 protected override AccessibleObject CreateAccessibilityInstance() 
 { 
 return new ChartControlAccessibleObject(this);
 }

 protected override void OnPaint(PaintEventArgs e) 
 {
 // The ChartControl draws the chart in the OnPaint override.
 base.OnPaint(e);

 Rectangle bounds = this.ClientRectangle;
 int border = 5;

 // Draws the legends first.
 StringFormat format = new StringFormat();
 format.Alignment = StringAlignment.Center;
 format.LineAlignment = StringAlignment.Center;
 
 if (legend1 != null) {
 if (legend1.Selected) {
 e.Graphics.FillRectangle(new SolidBrush(Color.Blue), legend1.Bounds);
 } else {
 e.Graphics.DrawRectangle(Pens.Blue, legend1.Bounds);
 }

 e.Graphics.DrawString(legend1.Name, this.Font, Brushes.Black, legend1.Bounds, format); 
 }
 if (legend2 != null) {
 if (legend2.Selected) {
 e.Graphics.FillRectangle(new SolidBrush(Color.Red), legend2.Bounds);
 } else {
 e.Graphics.DrawRectangle(Pens.Red, legend2.Bounds);
 }
 e.Graphics.DrawString(legend2.Name, this.Font, Brushes.Black, legend2.Bounds, format);
 } 

 // Charts out the actual curves that represent data in the Chart.
 bounds.Inflate(-border, -border);
 Point[] curve1 = new Point[] {new Point(bounds.Left, bounds.Bottom),
 new Point(bounds.Left + bounds.Width / 3, bounds.Top + bounds.Height / 5),
 new Point(bounds.Right - bounds.Width / 3, (bounds.Top + bounds.Bottom) / 2),
 new Point(bounds.Right, bounds.Top)};

 Point[] curve2 = new Point[] {new Point(bounds.Left, bounds.Bottom - bounds.Height / 3),
 new Point(bounds.Left + bounds.Width / 3, bounds.Top + bounds.Height / 5),
 new Point(bounds.Right - bounds.Width / 3, (bounds.Top + bounds.Bottom) / 2),
 new Point(bounds.Right, bounds.Top + bounds.Height / 2)};

 // Draws the actual curve only if it is selected.
 if (legend1.Selected) e.Graphics.DrawCurve(Pens.Blue, curve1);
 if (legend2.Selected) e.Graphics.DrawCurve(Pens.Red, curve2);

 e.Graphics.DrawRectangle(Pens.Blue, bounds); 
 }

 // Handles the QueryAccessibilityHelp event.
 private void ChartControl_QueryAccessibilityHelp(object sender, 
 System.Windows.Forms.QueryAccessibilityHelpEventArgs e)
 { 
 e.HelpString = "Displays chart data";
 } 

 // Handles the Click event for the chart. 
 // Toggles the selection of whatever legend was clicked on
 private void ChartControl_Click(object sender, System.EventArgs e)
 {
 Point pt = this.PointToClient(Control.MousePosition);
 if (legend1.Bounds.Contains(pt)) {
 legend1.Selected = !legend1.Selected;
 } else if (legend2.Bounds.Contains(pt)) {
 legend2.Selected = !legend2.Selected;
 }
 }

 // Gets an array of CurveLengends used in the Chart.
 public CurveLegend[] Legends
 { 
 get { 
 return new CurveLegend[] { legend1, legend2 };
 } 
 } 

 // Inner class ChartControlAccessibleObject represents accessible information associated with the ChartControl.
 // The ChartControlAccessibleObject is returned in the ChartControl.CreateAccessibilityInstance override.
 public class ChartControlAccessibleObject : ControlAccessibleObject
 {
 ChartControl chartControl;

 public ChartControlAccessibleObject(ChartControl ctrl) : base(ctrl) 
 {
 chartControl = ctrl;
 }

 // Gets the role for the Chart. This is used by accessibility programs.
 public override AccessibleRole Role
 { 
 get {
 return AccessibleRole.Chart;
 }
 }

 // Gets the state for the Chart. This is used by accessibility programs.
 public override AccessibleStates State
 { 
 get { 
 return AccessibleStates.ReadOnly;
 }
 }

 // The CurveLegend objects are "child" controls in terms of accessibility so 
 // return the number of ChartLengend objects.
 public override int GetChildCount()
 { 
 return chartControl.Legends.Length;
 }

 // Gets the Accessibility object of the child CurveLegend idetified by index.
 public override AccessibleObject GetChild(int index)
 { 
 if (index >= 0 && index < chartControl.Legends.Length) {
 return chartControl.Legends[index].AccessibilityObject;
 } 
 return null;
 }

 // Helper function that is used by the CurveLegend's accessibility object
 // to navigate between sibiling controls. Specifically, this function is used in
 // the CurveLegend.CurveLegendAccessibleObject.Navigate function.
 internal AccessibleObject NavigateFromChild(CurveLegend.CurveLegendAccessibleObject child, 
 AccessibleNavigation navdir) 
 { 
 switch(navdir) {
 case AccessibleNavigation.Down:
 case AccessibleNavigation.Next:
 return GetChild(child.ID + 1);
 
 case AccessibleNavigation.Up:
 case AccessibleNavigation.Previous:
 return GetChild(child.ID - 1); 
 }
 return null;
 }

 // Helper function that is used by the CurveLegend's accessibility object
 // to select a specific CurveLegend control. Specifically, this function is used
 // in the CurveLegend.CurveLegendAccessibleObject.Select function.
 internal void SelectChild(CurveLegend.CurveLegendAccessibleObject child, AccessibleSelection selection) 
 { 
 int childID = child.ID;

 // Determine which selection action should occur, based on the
 // AccessibleSelection value.
 if ((selection & AccessibleSelection.TakeSelection) != 0) {
 for(int i = 0; i < chartControl.Legends.Length; i++) {
 if (i == childID) {
 chartControl.Legends[i].Selected = true; 
 } else {
 chartControl.Legends[i].Selected = false;
 }
 }

 // AccessibleSelection.AddSelection means that the CurveLegend will be selected.
 if ((selection & AccessibleSelection.AddSelection) != 0) {
 chartControl.Legends[childID].Selected = true; 
 }

 // AccessibleSelection.AddSelection means that the CurveLegend will be unselected.
 if ((selection & AccessibleSelection.RemoveSelection) != 0) {
 chartControl.Legends[childID].Selected = false; 
 }
 } 
 }
 }

 // Inner Class that represents a legend for a curve in the chart.
 public class CurveLegend 
 {
 private string name;
 private ChartControl chart;
 private CurveLegendAccessibleObject accObj;
 private bool selected = true;
 private Point location;

 public CurveLegend(ChartControl chart, string name) 
 {
 this.chart = chart;
 this.name = name;
 }

 // Gets the accessibility object for the curve legend.
 public AccessibleObject AccessibilityObject
 {
 get
 {
 accObj ??= new CurveLegendAccessibleObject(this);
 return accObj;
 }
 }
 
 // Gets the bounds for the curve legend.
 public Rectangle Bounds
 { 
 get
 {
 return new Rectangle(Location, Size);
 }
 }

 // Gets or sets the location for the curve legend.
 public Point Location
 { 
 get {
 return location;
 }
 set {
 location = value;
 chart.Invalidate();

 // Notifies the chart of the location change. This is used for
 // the accessibility information. AccessibleEvents.LocationChange
 // tells the chart the reason for the notification.

 chart.AccessibilityNotifyClients(AccessibleEvents.LocationChange, 
 ((CurveLegendAccessibleObject)AccessibilityObject).ID);
 }
 } 
 
 // Gets or sets the Name for the curve legend.
 public string Name
 { 
 get {
 return name;
 }
 set {
 if (name != value) 
 {
 name = value;
 chart.Invalidate();

 // Notifies the chart of the name change. This is used for
 // the accessibility information. AccessibleEvents.NameChange
 // tells the chart the reason for the notification.

 chart.AccessibilityNotifyClients(AccessibleEvents.NameChange, 
 ((CurveLegendAccessibleObject)AccessibilityObject).ID);
 }
 }
 }

 // Gets or sets the Selected state for the curve legend.
 public bool Selected
 { 
 get {
 return selected;
 }
 set {
 if (selected != value) 
 {
 selected = value;
 chart.Invalidate();

 // Notifies the chart of the selection value change. This is used for
 // the accessibility information. The AccessibleEvents value depends upon
 // if the selection is true (AccessibleEvents.SelectionAdd) or 
 // false (AccessibleEvents.SelectionRemove).
 chart.AccessibilityNotifyClients(
 selected ? AccessibleEvents.SelectionAdd : AccessibleEvents.SelectionRemove, 
 ((CurveLegendAccessibleObject)AccessibilityObject).ID);
 }
 }
 }

 // Gets the Size for the curve legend.
 public Size Size
 { 
 get { 
 int legendHeight = chart.Font.Height + 4;
 Graphics g = chart.CreateGraphics();
 int legendWidth = (int)g.MeasureString(Name, chart.Font).Width + 4; 

 return new Size(legendWidth, legendHeight);
 }
 }
 
 // Inner class CurveLegendAccessibleObject represents accessible information 
 // associated with the CurveLegend object.
 public class CurveLegendAccessibleObject : AccessibleObject
 {
 private CurveLegend curveLegend;

 public CurveLegendAccessibleObject(CurveLegend curveLegend) : base() 
 {
 this.curveLegend = curveLegend; 
 } 

 // Private property that helps get the reference to the parent ChartControl.
 private ChartControlAccessibleObject ChartControl
 { 
 get {
 return Parent as ChartControlAccessibleObject;
 }
 }

 // Internal helper function that returns the ID for this CurveLegend.
 internal int ID
 {
 get {
 for(int i = 0; i < ChartControl.GetChildCount(); i++) {
 if (ChartControl.GetChild(i) == this) {
 return i;
 }
 }
 return -1;
 }
 }

 // Gets the Bounds for the CurveLegend. This is used by accessibility programs.
 public override Rectangle Bounds
 {
 get { 
 // The bounds is in screen coordinates.
 Point loc = curveLegend.Location;
 return new Rectangle(curveLegend.chart.PointToScreen(loc), curveLegend.Size);
 }
 }

 // Gets or sets the Name for the CurveLegend. This is used by accessibility programs.
 public override string Name
 {
 get {
 return curveLegend.Name;
 }
 set {
 curveLegend.Name = value; 
 }
 }

 // Gets the Curve Legend Parent's Accessible object.
 // This is used by accessibility programs.
 public override AccessibleObject Parent
 {
 get {
 return curveLegend.chart.AccessibilityObject;
 }
 }

 // Gets the role for the CurveLegend. This is used by accessibility programs.
 public override AccessibleRole Role 
 {
 get {
 return AccessibleRole.StaticText;
 }
 }

 // Gets the state based on the selection for the CurveLegend. 
 // This is used by accessibility programs.
 public override AccessibleStates State 
 {
 get {
 AccessibleStates state = AccessibleStates.Selectable;
 if (curveLegend.Selected) 
 {
 state |= AccessibleStates.Selected;
 }
 return state;
 }
 }

 // Navigates through siblings of this CurveLegend. This is used by accessibility programs.
 public override AccessibleObject Navigate(AccessibleNavigation navdir) 
 {
 // Uses the internal NavigateFromChild helper function that exists
 // on ChartControlAccessibleObject.
 return ChartControl.NavigateFromChild(this, navdir);
 }

 // Selects or unselects this CurveLegend. This is used by accessibility programs.
 public override void Select(AccessibleSelection selection) 
 {
 // Uses the internal SelectChild helper function that exists
 // on ChartControlAccessibleObject.
 ChartControl.SelectChild(this, selection);
 }
 }
 }
 }
}
Option Explicit

Imports System.Drawing
Imports System.Windows.Forms

Namespace ChartControlNameSpace
 
 Public Class Form1 
 Inherits System.Windows.Forms.Form

 ' Test out the Chart Control.
 Private chart1 As ChartControl

 <System.STAThread()> _
 Public Shared Sub Main()
 System.Windows.Forms.Application.Run(New Form1())
 End Sub

 Public Sub New() 
 ' Create a chart control and add it to the form.
 Me.chart1 = New ChartControl()
 Me.ClientSize = New System.Drawing.Size(920, 566)

 Me.chart1.Location = New System.Drawing.Point(47, 16)
 Me.chart1.Size = New System.Drawing.Size(600, 400)

 Me.Controls.Add(Me.chart1)
 End Sub
 End Class

 ' Declares a chart control that demonstrates Accessibility in Windows Forms.
 Public Class ChartControl
 Inherits System.Windows.Forms.UserControl

 Private legend1 As CurveLegend
 Private legend2 As CurveLegend
 
 Public Sub New()
 ' The ChartControl draws the chart in the OnPaint override.
 SetStyle(ControlStyles.ResizeRedraw, True)
 SetStyle(ControlStyles.DoubleBuffer, True)
 SetStyle(ControlStyles.AllPaintingInWmPaint, True)
 
 Me.BackColor = System.Drawing.Color.White
 Me.Name = "ChartControl"

 ' The CurveLengend is not Control-based, it just
 ' represent the parts of the legend.
 legend1 = New CurveLegend(Me, "A")
 legend1.Location = New Point(20, 30)
 legend2 = New CurveLegend(Me, "B")
 legend2.Location = New Point(20, 50)
 End Sub
 
 ' Overridden to return the custom AccessibleObject 
 ' for the entire chart.
 Protected Overrides Function CreateAccessibilityInstance() As AccessibleObject
 Return New ChartControlAccessibleObject(Me)
 End Function 

 Protected Overrides Sub OnPaint(e As PaintEventArgs)
 ' The ChartControl draws the chart in the OnPaint override.
 MyBase.OnPaint(e)
 
 Dim bounds As Rectangle = Me.ClientRectangle
 Dim border As Integer = 5
 
 ' Draw the legends first.
 Dim format As New StringFormat()
 format.Alignment = StringAlignment.Center
 format.LineAlignment = StringAlignment.Center
 
 If (legend1 IsNot Nothing) Then
 If legend1.Selected Then
 e.Graphics.FillRectangle(New SolidBrush(Color.Blue), legend1.Bounds)
 Else
 e.Graphics.DrawRectangle(Pens.Blue, legend1.Bounds)
 End If
 e.Graphics.DrawString(legend1.Name, Me.Font, Brushes.Black, RectangleF.op_Implicit(legend1.Bounds), format)
 End If
 If (legend2 IsNot Nothing) Then
 If legend2.Selected Then
 e.Graphics.FillRectangle(New SolidBrush(Color.Red), legend2.Bounds)
 Else
 e.Graphics.DrawRectangle(Pens.Red, legend2.Bounds)
 End If
 e.Graphics.DrawString(legend2.Name, Me.Font, Brushes.Black, RectangleF.op_Implicit(legend2.Bounds), format)
 End If
 
 ' Chart out the actual curves that represent data in the Chart.
 bounds.Inflate(-border, -border)
 Dim curve1() As Point = {New Point(bounds.Left, bounds.Bottom), _
 New Point(bounds.Left + bounds.Width / 3, bounds.Top + bounds.Height / 5), _
 New Point(bounds.Right - bounds.Width / 3,(bounds.Top + bounds.Bottom) / 2), _
 New Point(bounds.Right, bounds.Top)}

 Dim curve2() As Point = {New Point(bounds.Left, bounds.Bottom - bounds.Height / 3), _
 New Point(bounds.Left + bounds.Width / 3, bounds.Top + bounds.Height / 5), _
 New Point(bounds.Right - bounds.Width / 3,(bounds.Top + bounds.Bottom) / 2), _
 New Point(bounds.Right, bounds.Top + bounds.Height / 2)}
 
 ' Draw the actual curve only if it is selected.
 If legend1.Selected Then
 e.Graphics.DrawCurve(Pens.Blue, curve1)
 End If
 If legend2.Selected Then
 e.Graphics.DrawCurve(Pens.Red, curve2)
 End If 
 e.Graphics.DrawRectangle(Pens.Blue, bounds)
 End Sub
 
 ' Handle the QueryAccessibilityHelp event.
 Private Sub ChartControl_QueryAccessibilityHelp(sender As Object, _
 e As System.Windows.Forms.QueryAccessibilityHelpEventArgs) Handles MyBase.QueryAccessibilityHelp
 e.HelpString = "Displays chart data"
 End Sub 

 ' Handle the Click event for the chart. 
 ' Toggle the selection of whatever legend was clicked. 
 Private Sub ChartControl_Click(sender As Object, e As System.EventArgs) Handles MyBase.Click

 Dim pt As Point = Me.PointToClient(Control.MousePosition)
 If legend1.Bounds.Contains(pt) Then
 legend1.Selected = Not legend1.Selected
 Else
 If legend2.Bounds.Contains(pt) Then
 legend2.Selected = Not legend2.Selected
 End If
 End If
 End Sub

 ' Get an array of the CurveLengends used in the Chart.
 Public ReadOnly Property Legends() As CurveLegend()
 Get
 Return New CurveLegend() {legend1, legend2}
 End Get
 End Property
 
 Protected Sub ExposeAccessibilityNotifyClients(ByVal accEvent As AccessibleEvents, ByVal childID As Integer)
 AccessibilityNotifyClients(accEvent, childID) 
 End Sub

 ' Inner Class ChartControlAccessibleObject represents accessible information 
 ' associated with the ChartControl.
 ' The ChartControlAccessibleObject is returned in the ' ChartControl.CreateAccessibilityInstance override.
 Public Class ChartControlAccessibleObject
 Inherits Control.ControlAccessibleObject

 Private chartControl As ChartControl
 
 Public Sub New(ctrl As ChartControl)
 MyBase.New(ctrl)
 chartControl = ctrl
 End Sub
 
 ' Get the role for the Chart. This is used by accessibility programs. 
 Public Overrides ReadOnly Property Role() As AccessibleRole
 Get
 Return System.Windows.Forms.AccessibleRole.Chart
 End Get
 End Property
 
 ' Get the state for the Chart. This is used by accessibility programs. 
 Public Overrides ReadOnly Property State() As AccessibleStates
 Get
 Return AccessibleStates.ReadOnly
 End Get
 End Property 
 
 ' The CurveLegend objects are "child" controls in terms of accessibility so 
 ' return the number of ChartLengend objects. 
 Public Overrides Function GetChildCount() As Integer
 Return chartControl.Legends.Length
 End Function 
 
 ' Get the Accessibility object of the child CurveLegend idetified by index.
 Public Overrides Function GetChild(index As Integer) As AccessibleObject
 If index >= 0 And index < chartControl.Legends.Length Then
 Return chartControl.Legends(index).AccessibilityObject
 End If
 Return Nothing
 End Function 
 
 ' Helper function that is used by the CurveLegend's accessibility object
 ' to navigate between sibiling controls. Specifically, this function is used in
 ' the CurveLegend.CurveLegendAccessibleObject.Navigate function.
 Friend Function NavigateFromChild(child As CurveLegend.CurveLegendAccessibleObject, _
 navdir As AccessibleNavigation) As AccessibleObject
 Select Case navdir
 Case AccessibleNavigation.Down, AccessibleNavigation.Next
 Return GetChild(child.ID + 1)
 
 Case AccessibleNavigation.Up, AccessibleNavigation.Previous
 Return GetChild(child.ID - 1)
 End Select
 Return Nothing
 End Function 

 ' Helper function that is used by the CurveLegend's accessibility object
 ' to select a specific CurveLegend control. Specifically, this function is used 
 ' in the CurveLegend.CurveLegendAccessibleObject.Select function. 
 Friend Sub SelectChild(child As CurveLegend.CurveLegendAccessibleObject, selection As AccessibleSelection)
 Dim childID As Integer = child.ID
 
 ' Determine which selection action should occur, based on the
 ' AccessibleSelection value.
 If (selection And AccessibleSelection.TakeSelection) <> 0 Then
 Dim i As Integer
 For i = 0 To chartControl.Legends.Length - 1
 If i = childID Then
 chartControl.Legends(i).Selected = True
 Else
 chartControl.Legends(i).Selected = False
 End If
 Next i
 
 ' AccessibleSelection.AddSelection means that the CurveLegend will be selected.
 If (selection And AccessibleSelection.AddSelection) <> 0 Then
 chartControl.Legends(childID).Selected = True
 End If

 ' AccessibleSelection.AddSelection means that the CurveLegend will be unselected. 
 If (selection And AccessibleSelection.RemoveSelection) <> 0 Then
 chartControl.Legends(childID).Selected = False
 End If
 End If
 End Sub
 End Class

 ' Inner Class that represents a legend for a curve in the chart.
 Public Class CurveLegend
 Private m_name As String
 Private chart As ChartControl
 Private accObj As CurveLegendAccessibleObject
 Private m_selected As Boolean = True
 Private m_location As Point
 
 Public Sub New(chart As ChartControl, name As String)
 Me.chart = chart
 Me.m_name = name
 End Sub

 ' Gets the accessibility object for the curve legend. 
 Public ReadOnly Property AccessibilityObject() As AccessibleObject
 Get
 If accObj Is Nothing Then
 accObj = New CurveLegendAccessibleObject(Me)
 End If
 Return accObj
 End Get
 End Property
 
 ' Gets the bounds for the curve legend. 
 Public ReadOnly Property Bounds() As Rectangle
 Get
 Return New Rectangle(Location, Size)
 End Get
 End Property

 ' Gets or sets the location for the curve legend. 
 Public Property Location() As Point
 Get
 Return m_location
 End Get
 Set
 m_location = value
 chart.Invalidate()

 ' Notifies the chart of the location change. This is used for
 ' the accessibility information. AccessibleEvents.LocationChange
 ' tells the chart the reason for the notification.
 chart.ExposeAccessibilityNotifyClients(AccessibleEvents.LocationChange, _
 CType(AccessibilityObject, CurveLegendAccessibleObject).ID)
 End Set
 End Property
 
 ' Gets or sets the Name for the curve legend. 
 Public Property Name() As String
 Get
 Return m_name
 End Get
 Set
 If m_name <> value Then
 m_name = value
 chart.Invalidate()

 ' Notifies the chart of the name change. This is used for
 ' the accessibility information. AccessibleEvents.NameChange
 ' tells the chart the reason for the notification. 
 chart.ExposeAccessibilityNotifyClients(AccessibleEvents.NameChange, _
 CType(AccessibilityObject, CurveLegendAccessibleObject).ID)
 End If
 End Set
 End Property
 
 ' Gets or sets the Selected state for the curve legend. 
 Public Property Selected() As Boolean
 Get
 Return m_selected
 End Get
 Set
 If m_selected <> value Then
 m_selected = value
 chart.Invalidate()

 ' Notifies the chart of the selection value change. This is used for
 ' the accessibility information. The AccessibleEvents value varies
 ' on whether the selection is true (AccessibleEvents.SelectionAdd) or 
 ' false (AccessibleEvents.SelectionRemove). 
 If m_selected Then
 chart.ExposeAccessibilityNotifyClients(AccessibleEvents.SelectionAdd, _
 CType(AccessibilityObject, CurveLegendAccessibleObject).ID) 
 Else
 chart.ExposeAccessibilityNotifyClients(AccessibleEvents.SelectionRemove, _
 CType(AccessibilityObject, CurveLegendAccessibleObject).ID) 
 End If
 End If
 End Set
 End Property
 
 ' Gets the Size for the curve legend. 
 Public ReadOnly Property Size() As Size
 Get
 Dim legendHeight As Integer = chart.Font.Height + 4
 Dim g As Graphics = chart.CreateGraphics()
 Dim legendWidth As Integer = CInt(g.MeasureString(Name, chart.Font).Width) + 4
 
 Return New Size(legendWidth, legendHeight)
 End Get
 End Property
 
 
 ' Inner class CurveLegendAccessibleObject represents accessible information 
 ' associated with the CurveLegend object.
 Public Class CurveLegendAccessibleObject
 Inherits AccessibleObject

 Private curveLegend As CurveLegend
 
 Public Sub New(curveLegend As CurveLegend)
 Me.curveLegend = curveLegend
 End Sub
 
 ' Private property that helps get the reference to the parent ChartControl. 
 Private ReadOnly Property ChartControl() As ChartControlAccessibleObject
 Get
 Return CType(Parent, ChartControlAccessibleObject)
 End Get
 End Property

 ' Friend helper function that returns the ID for this CurveLegend. 
 Friend ReadOnly Property ID() As Integer
 Get
 Dim i As Integer
 For i = 0 To (ChartControl.GetChildCount()) - 1
 If ChartControl.GetChild(i) Is Me Then
 Return i
 End If
 Next i
 Return - 1
 End Get
 End Property
 
 ' Gets the Bounds for the CurveLegend. This is used by accessibility programs.
 Public Overrides ReadOnly Property Bounds() As Rectangle
 Get
 ' The bounds is in screen coordinates.
 Dim loc As Point = curveLegend.Location
 Return New Rectangle(curveLegend.chart.PointToScreen(loc), curveLegend.Size)
 End Get
 End Property

 ' Gets or sets the Name for the CurveLegend. This is used by accessibility programs. 
 Public Overrides Property Name() As String
 Get
 Return curveLegend.Name
 End Get
 Set
 curveLegend.Name = value
 End Set
 End Property
 
 ' Gets the Curve Legend Parent's Accessible object.
 ' This is used by accessibility programs. 
 Public Overrides ReadOnly Property Parent() As AccessibleObject
 Get
 Return curveLegend.chart.AccessibilityObject
 End Get
 End Property
 
 ' Gets the role for the CurveLegend. This is used by accessibility programs. 
 Public Overrides ReadOnly Property Role() As AccessibleRole
 Get
 Return System.Windows.Forms.AccessibleRole.StaticText
 End Get
 End Property

 ' Gets the state based on the selection for the CurveLegend. 
 ' This is used by accessibility programs. 
 Public Overrides ReadOnly Property State() As AccessibleStates
 Get
 Dim stateTemp As AccessibleStates = AccessibleStates.Selectable
 If curveLegend.Selected Then
 stateTemp = stateTemp Or AccessibleStates.Selected
 End If
 Return stateTemp
 End Get
 End Property
 
 ' Navigates through siblings of this CurveLegend. This is used by accessibility programs. 
 Public Overrides Function Navigate(navdir As AccessibleNavigation) As AccessibleObject
 ' Use the Friend NavigateFromChild helper function that exists
 ' on ChartControlAccessibleObject.
 Return ChartControl.NavigateFromChild(Me, navdir)
 End Function
 
 ' Selects or unselects this CurveLegend. This is used by accessibility programs.
 Public Overrides Sub [Select](selection As AccessibleSelection)

 ' Use the internal SelectChild helper function that exists
 ' on ChartControlAccessibleObject.
 ChartControl.SelectChild(Me, selection)
 End Sub

 End Class

 End Class

 End Class

End Namespace 'ChartControlNameSpace

Remarks

Accessibility applications can adjust features of the application to improve usability for users with disabilities.

For users who are visually impaired, you can adjust software and operating system features to comply with their needs. For example, you can enlarge text and images and render them with a contrast. In addition, you can accommodate color-blindness with the appropriate use of colors. For users who are severely visually impaired, computers are accessible with screen review aids that translate on-screen text to speech or to a dynamic, refreshable, Braille display.

For users who are hard of hearing, you can design programs that use visual cues, such as a flashing toolbar; or you can display spoken messages as text. For example, when turned on, the SoundSentry feature, an accessibility option in Control Panel, provides a visual warning whenever the system makes an alarm sound.

For users with motion disabilities, you can design controls that refine or eliminate keyboard and mouse use, thereby improving computer accessibility. Control Panel offers assistance. For example, one alternative is to use the numeric keypad instead of the mouse for navigation. Another option, called StickyKeys, enables users who cannot hold down two or more keys at a time (such as CTRL+P) to get the same result by typing one key at a time.

For users with cognitive and language disabilities, you can design software programs to better accommodate their needs. For example, using conspicuous or cued sequencing, uncomplicated displays, fewer words, and a reading level targeted to elementary school standards can benefit these users.

For users with seizure disorders, you can design software programs to eliminate seizure provoking patterns.

For more information about accessibility, including information about accessibility applications, see Windows Accessibility features.

Note

To use the AccessibleObject, you must add a reference to the Accessibility assembly installed with the .NET Framework. Windows Forms only supports Active Accessibility 2.0.

Notes to Inheritors

When you inherit from this class, you can override all the members.

Constructors

Name Description
AccessibleObject()

Initializes a new instance of the AccessibleObject class.

Properties

Name Description
Bounds

Gets the location and size of the accessible object.

DefaultAction

Gets a string that describes the default action of the object. Not all objects have a default action.

Description

Gets a string that describes the visual appearance of the specified object. Not all objects have a description.

Help

Gets a description of what the object does or how the object is used.

KeyboardShortcut

Gets the shortcut key or access key for the accessible object.

Name

Gets or sets the object name.

Parent

Gets the parent of an accessible object.

Role

Gets the role of this accessible object.

State

Gets the state of this accessible object.

Value

Gets or sets the value of an accessible object.

Methods

Name Description
CreateObjRef(Type)

Creates an object that contains all the relevant information required to generate a proxy used to communicate with a remote object.

(Inherited from MarshalByRefObject)
DoDefaultAction()

Performs the default action associated with this accessible object.

Equals(Object)

Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetChild(Int32)

Retrieves the accessible child corresponding to the specified index.

GetChildCount()

Retrieves the number of children belonging to an accessible object.

GetFocused()

Retrieves the object that has the keyboard focus.

GetHashCode()

Serves as the default hash function.

(Inherited from Object)
GetHelpTopic(String)

Gets an identifier for a Help topic identifier and the path to the Help file associated with this accessible object.

GetLifetimeService()
Obsolete.

Retrieves the current lifetime service object that controls the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
GetSelected()

Retrieves the currently selected child.

GetType()

Gets the Type of the current instance.

(Inherited from Object)
HitTest(Int32, Int32)

Retrieves the child object at the specified screen coordinates.

InitializeLifetimeService()
Obsolete.

Obtains a lifetime service object to control the lifetime policy for this instance.

(Inherited from MarshalByRefObject)
MemberwiseClone()

Creates a shallow copy of the current Object.

(Inherited from Object)
MemberwiseClone(Boolean)

Creates a shallow copy of the current MarshalByRefObject object.

(Inherited from MarshalByRefObject)
Navigate(AccessibleNavigation)

Navigates to another accessible object.

RaiseAutomationNotification(AutomationNotificationKind, AutomationNotificationProcessing, String)

Raises the UI automation notification event.

RaiseLiveRegionChanged()

Raises the LiveRegionChanged UI automation event.

Select(AccessibleSelection)

Modifies the selection or moves the keyboard focus of the accessible object.

ToString()

Returns a string that represents the current object.

(Inherited from Object)
UseStdAccessibleObjects(IntPtr, Int32)

Associates an object with an instance of an AccessibleObject based on the handle and the object id of the object.

UseStdAccessibleObjects(IntPtr)

Associates an object with an instance of an AccessibleObject based on the handle of the object.

Explicit Interface Implementations

Name Description
IAccessible.accChildCount

Gets the number of child interfaces that belong to this object. For a description of this member, see accChildCount.

IAccessible.accDoDefaultAction(Object)

Performs the specified object's default action. Not all objects have a default action. For a description of this member, see accDoDefaultAction(Object).

IAccessible.accFocus

Gets the object that has the keyboard focus. For a description of this member, see accFocus.

IAccessible.accHitTest(Int32, Int32)

Gets the child object at the specified screen coordinates. For a description of this member, see accHitTest(Int32, Int32).

IAccessible.accLocation(Int32, Int32, Int32, Int32, Object)

Gets the object's current screen location. For a description of this member, see accLocation(Int32, Int32, Int32, Int32, Object).

IAccessible.accNavigate(Int32, Object)

Navigates to an accessible object relative to the current object. For a description of this member, see accNavigate(Int32, Object).

IAccessible.accParent

Gets the parent accessible object of this object. For a description of this member, see accParent.

IAccessible.accSelect(Int32, Object)

Modifies the selection or moves the keyboard focus of the accessible object. For a description of this member, see accSelect(Int32, Object).

IAccessible.accSelection

Gets the selected child objects of an accessible object. For a description of this member, see accSelection.

IReflect.GetField(String, BindingFlags)

Gets the FieldInfo object corresponding to the specified field and binding flag. For a description of this member, see GetField(String, BindingFlags).

IReflect.GetFields(BindingFlags)

Gets an array of FieldInfo objects corresponding to all fields of the current class. For a description of this member, see GetFields(BindingFlags).

IReflect.GetMember(String, BindingFlags)

Gets an array of MemberInfo objects corresponding to all public members or to all members that match a specified name. For a description of this member, see GetMember(String, BindingFlags).

IReflect.GetMembers(BindingFlags)

Gets an array of MemberInfo objects corresponding either to all public members or to all members of the current class. For a description of this member, see GetMembers(BindingFlags).

IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])

Gets a MethodInfo object corresponding to a specified method, using a Type array to choose from among overloaded methods. For a description of this member, see GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[]).

IReflect.GetMethod(String, BindingFlags)

Gets a MethodInfo object corresponding to a specified method under specified search constraints. For a description of this member, see GetMethod(String, BindingFlags).

IReflect.GetMethods(BindingFlags)

Gets an array of MethodInfo objects with all public methods or all methods of the current class. For a description of this member, see GetMethods(BindingFlags).

IReflect.GetProperties(BindingFlags)

Gets an array of PropertyInfo objects corresponding to all public properties or to all properties of the current class. For a description of this member, see GetProperties(BindingFlags).

IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])

Gets a PropertyInfo object corresponding to a specified property with specified search constraints. For a description of this member, see GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[]).

IReflect.GetProperty(String, BindingFlags)

Gets a PropertyInfo object corresponding to a specified property under specified search constraints. For a description of this member, see GetProperty(String, BindingFlags).

IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])

Invokes a specified member. For a description of this member, see InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]).

IReflect.UnderlyingSystemType

Gets the underlying type that represents the IReflect object. For a description of this member, see UnderlyingSystemType.

Applies to


Feedback

Was this page helpful?