File: System\Windows\Forms\Controls\ToolStrips\CachedItemHdcInfo.cs
Web Access
Project: src\src\System.Windows.Forms\src\System.Windows.Forms.csproj (System.Windows.Forms)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Drawing;
 
namespace System.Windows.Forms;
 
internal class CachedItemHdcInfo : IDisposable, IHandle<HDC>
{
    internal CachedItemHdcInfo()
    {
    }
 
    private HDC _cachedItemHDC;
    private Size _cachedHDCSize = Size.Empty;
    private HBITMAP _cachedItemBitmap;
 
    public HDC Handle => _cachedItemHDC;
 
    // this DC is cached and should only be deleted on Dispose or when the size changes.
 
    public HDC GetCachedItemDC(HDC toolStripHDC, Size bitmapSize)
    {
        if (_cachedHDCSize.Width < bitmapSize.Width
             || _cachedHDCSize.Height < bitmapSize.Height)
        {
            if (_cachedItemHDC.IsNull)
            {
                // Create a new DC - we don't have one yet.
                _cachedItemHDC = PInvokeCore.CreateCompatibleDC(toolStripHDC);
            }
 
            // Create compatible bitmap with the correct size.
            _cachedItemBitmap = PInvokeCore.CreateCompatibleBitmap(toolStripHDC, bitmapSize.Width, bitmapSize.Height);
            HGDIOBJ oldBitmap = PInvokeCore.SelectObject(_cachedItemHDC, _cachedItemBitmap);
 
            // Delete the old bitmap
            if (!oldBitmap.IsNull)
            {
                PInvokeCore.DeleteObject(oldBitmap);
            }
 
            // remember what size we created.
            _cachedHDCSize = bitmapSize;
        }
 
        return _cachedItemHDC;
    }
 
    public void Dispose()
    {
        if (!_cachedItemHDC.IsNull)
        {
            if (!_cachedItemBitmap.IsNull)
            {
                PInvokeCore.DeleteObject(_cachedItemBitmap);
            }
 
            PInvokeCore.DeleteDC(_cachedItemHDC);
        }
 
        _cachedItemHDC = default;
        _cachedItemBitmap = default;
        _cachedHDCSize = Size.Empty;
 
        GC.SuppressFinalize(this);
    }
 
    ~CachedItemHdcInfo()
    {
        Dispose();
    }
}