/// <include file='doc\ErrorProvider.uex' path='docs/doc[@for="ErrorProvider.DisposeRegion"]/*' /> /// <devdoc> /// Helper to dispose the cached icon region. /// </devdoc> /// <internalonly/> void DisposeRegion() { if (region != null) { region.Dispose(); region = null; } }
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); }
private void DisposeRegion() { if (this.region != null) { this.region.Dispose(); this.region = null; } }