public void Add(ControlItem item) { _items.Add(item); if (!EnsureCreated()) { return; } var toolInfo = new ComCtl32.ToolInfoWrapper <ErrorWindow>(this, item.Id, ComCtl32.TTF.SUBCLASS, item.Error); toolInfo.SendMessage(_tipWindow, (User32.WM)ComCtl32.TTM.ADDTOOLW); Update(timerCaused: false); }
public void AddToolTip(string toolTipString, IntPtr toolTipId, Rectangle iconBounds) { Debug.Assert(tipWindow != null && tipWindow.Handle != IntPtr.Zero, "the tipWindow was not initialized, bailing out"); if (iconBounds.IsEmpty) { throw new ArgumentNullException(nameof(iconBounds), SR.DataGridToolTipEmptyIcon); } if (toolTipString == null) { throw new ArgumentNullException(nameof(toolTipString)); } var info = new ComCtl32.ToolInfoWrapper(dataGrid, toolTipId, ComCtl32.TTF.SUBCLASS, toolTipString, iconBounds); info.SendMessage(tipWindow, User32.WindowMessage.TTM_ADDTOOLW); }
public void Reset() { // This resets the tooltip state, which can get broken when we leave the window // then reenter. So we set the tooltip to null, update the text, then it back to // what it was, so the tooltip thinks it's back in the regular state again string oldText = ToolTip; toolTipText = string.Empty; for (int i = 0; i < controls.Length; i++) { ComCtl32.ToolInfoWrapper <Control> info = GetTOOLINFO(controls[i]); info.SendMessage(this, User32.WindowMessage.TTM_UPDATETIPTEXTW); } toolTipText = oldText; User32.SendMessageW(this, User32.WindowMessage.TTM_UPDATE); }
private void SetupToolTip(Control control) { if (IsHandleCreated) { User32.SetWindowPos( new HandleRef(this, Handle), User32.HWND_TOPMOST, flags: User32.SWP.NOMOVE | User32.SWP.NOSIZE | User32.SWP.NOACTIVATE); ComCtl32.ToolInfoWrapper <Control> info = GetTOOLINFO(control); if (info.SendMessage(this, User32.WindowMessage.TTM_ADDTOOLW) == IntPtr.Zero) { Debug.Fail($"TTM_ADDTOOL failed for {control.GetType().Name}"); } // Setting the max width has the added benefit of enabling multiline tool tips User32.SendMessageW(this, User32.WindowMessage.TTM_SETMAXTIPWIDTH, IntPtr.Zero, (IntPtr)SystemInformation.MaxWindowTrackSize.Width); } }
public void Remove(ControlItem item) { _items.Remove(item); if (_tipWindow is not null) { var info = new ComCtl32.ToolInfoWrapper <ErrorWindow>(this, item.Id); info.SendMessage(_tipWindow, (User32.WM)ComCtl32.TTM.DELTOOLW); } if (_items.Count == 0) { EnsureDestroyed(); } else { Update(timerCaused: false); } }
public void RemoveToolTip(IntPtr toolTipId) { var info = new ComCtl32.ToolInfoWrapper(dataGrid, toolTipId); info.SendMessage(tipWindow, User32.WindowMessage.TTM_DELTOOLW); }
public unsafe void Update(bool timerCaused) { IconRegion iconRegion = _provider.Region; Size size = iconRegion.Size; _windowBounds = Rectangle.Empty; for (int i = 0; i < _items.Count; i++) { ControlItem item = _items[i]; Rectangle iconBounds = item.GetIconBounds(size); if (_windowBounds.IsEmpty) { _windowBounds = iconBounds; } else { _windowBounds = Rectangle.Union(_windowBounds, iconBounds); } } using var windowRegion = new Region(new Rectangle(0, 0, 0, 0)); for (int i = 0; i < _items.Count; i++) { ControlItem item = _items[i]; Rectangle iconBounds = item.GetIconBounds(size); iconBounds.X -= _windowBounds.X; iconBounds.Y -= _windowBounds.Y; bool showIcon = true; if (!item.ToolTipShown) { switch (_provider.BlinkStyle) { case ErrorBlinkStyle.NeverBlink: // always show icon break; case ErrorBlinkStyle.BlinkIfDifferentError: showIcon = (item.BlinkPhase == 0) || (item.BlinkPhase > 0 && (item.BlinkPhase & 1) == (i & 1)); break; case ErrorBlinkStyle.AlwaysBlink: showIcon = ((i & 1) == 0) == _provider._showIcon; break; } } if (showIcon) { iconRegion.Region.Translate(iconBounds.X, iconBounds.Y); windowRegion.Union(iconRegion.Region); iconRegion.Region.Translate(-iconBounds.X, -iconBounds.Y); } if (_tipWindow is not null) { ComCtl32.TTF flags = ComCtl32.TTF.SUBCLASS; if (_provider.RightToLeft) { flags |= ComCtl32.TTF.RTLREADING; } var toolInfo = new ComCtl32.ToolInfoWrapper <ErrorWindow>(this, item.Id, flags, item.Error, iconBounds); toolInfo.SendMessage(_tipWindow, (User32.WM)ComCtl32.TTM.SETTOOLINFOW); } if (timerCaused && item.BlinkPhase > 0) { item.BlinkPhase--; } } if (timerCaused) { _provider._showIcon = !_provider._showIcon; } using var hdc = new User32.GetDcScope(Handle); using var save = new Gdi32.SaveDcScope(hdc); MirrorDcIfNeeded(hdc); using Graphics g = hdc.CreateGraphics(); using var windowRegionHandle = new Gdi32.RegionScope(windowRegion, g); if (User32.SetWindowRgn(this, windowRegionHandle, BOOL.TRUE) != 0) { // The HWnd owns the region. windowRegionHandle.RelinquishOwnership(); } User32.SetWindowPos( new HandleRef(this, Handle), User32.HWND_TOP, _windowBounds.X, _windowBounds.Y, _windowBounds.Width, _windowBounds.Height, User32.SWP.NOACTIVATE); User32.InvalidateRect(new HandleRef(this, Handle), null, BOOL.FALSE); }