// ------------------------------------------------------ // // Constructors // // ------------------------------------------------------ #region Constructors internal ToolbarItem(IntPtr hwnd, ProxyFragment parent, int item, int idCommand) : base(hwnd, parent, item) { _idCommand = idCommand; NativeMethods.TBBUTTON tbb = new NativeMethods.TBBUTTON(); int buttonStyle = 0; if (XSendMessage.GetItem(_hwnd, _item, ref tbb)) { buttonStyle = tbb.fsStyle; } // Set the strings to return properly the properties. bool hasImageList = Misc.ProxySendMessageInt(_hwnd, NativeMethods.TB_GETIMAGELIST, IntPtr.Zero, IntPtr.Zero) != 0; int exStyle = Misc.ProxySendMessageInt(_hwnd, NativeMethods.TB_GETEXTENDEDSTYLE, IntPtr.Zero, IntPtr.Zero); _isToggleButton = false; _cControlType = ControlType.Button; // If a separator, say so if (Misc.IsBitSet(buttonStyle, NativeMethods.BTNS_SEP)) _cControlType = ControlType.Separator; else if (Misc.IsBitSet(buttonStyle, NativeMethods.BTNS_CHECK)) { // Special case for task list - they use the checked style, but only for visuals... IntPtr hwndParent = Misc.GetParent(_hwnd); if(Misc.GetClassName(hwndParent) != "MSTaskSwWClass") { _isToggleButton = true; } } else if (Misc.IsBitSet(buttonStyle, NativeMethods.BTNS_DROPDOWN) && Misc.IsBitSet(exStyle, NativeMethods.TBSTYLE_EX_DRAWDDARROWS)) { // if its a drop down and it has an arrow its a split button _cControlType = ControlType.SplitButton; } else if (!hasImageList || tbb.iBitmap == NativeMethods.I_IMAGENONE) { // Text-only, no bitmap, so it's effectively a menu item. // (eg. as used in MMC) _cControlType = ControlType.MenuItem; } _fIsContent = _cControlType != ControlType.Separator; // The Start Menu's "Shut Down" and "Log Off" buttons are toolbar items. They need to have the // KeyboardFocusable property be set to true. _fIsKeyboardFocusable = (bool)parent.GetElementProperty(AutomationElement.IsKeyboardFocusableProperty); GetItemId(ref _sAutomationId); }
private void GetItemId(ref string itemId) { NativeMethods.TBBUTTON tbb = new NativeMethods.TBBUTTON(); if (XSendMessage.GetItem(_hwnd, _item, ref tbb)) { if (tbb.idCommand > 0) { itemId = "Item " + tbb.idCommand.ToString(CultureInfo.CurrentCulture); } } }
// ------------------------------------------------------ // // Internal Methods // // ------------------------------------------------------ #region Internal Methods // Create a WindowsToolbar instance. Needs to be internal because // ApplicationWindow pattern needs to call this so needs to be internal internal ProxySimple CreateToolbarItem (int item) { NativeMethods.TBBUTTON tbb = new NativeMethods.TBBUTTON (); // During the FocusChanged WinEvent (EVENT_OBJECT_FOCUS), // some "ToolbarWindow32" children report an item ID (child id) // of 0x80000001, 0x80000002, etc. instead of 1, 2, etc. // However, when created as children of the parent toolbar, // these same items are assigned IDs of 1, 2, etc. // Therefore, map negative item IDs of the form 0x80000001, // 0x80000002, etc. to 1, 2, etc. item = (int)(~0x80000000 & (uint)item); if (!XSendMessage.GetItem(_hwnd, item, ref tbb)) { // If failed to get button infromation the button must not exist, so return null. return null; } if (Misc.ProxySendMessageInt(_hwnd, NativeMethods.TB_ISBUTTONHIDDEN, new IntPtr(tbb.idCommand), IntPtr.Zero) == 0) { Accessible acc = Accessible.CreateNativeFromEvent(_hwnd, NativeMethods.OBJID_CLIENT, item + 1); if (acc != null) { if (acc.Role == AccessibleRole.MenuItem) { return new ToolbarItemAsMenuItem(_hwnd, this, item, tbb.idCommand, acc); } } return new ToolbarItem(_hwnd, this, item, tbb.idCommand); } return null; }