Top / .NET備忘録 / 12.コンテナコントロール / 01.プラシを管理する

というわけで!

コンテナコントロールに手を入れていきます。

VB6.0 では、PictureBox がコンテナ機能を持っていましたが、.NET では廃止されました。
なので、Panel を継承して VBPictureBox を作成します。

WM_CTLCOLOR を処理する際は、戻り値としてブラシハンドルを返さなければなりませんので、これを管理するクラスを作ります。

作成したブラシをストックしておき、使い回します。
放置しておいてもよさそうですが、念のため IDisposable なクラスにしておきます。

using System;
using System.Collections;
using System.Collections.Generic;

namespace VB6Control
{
    /// <summary>
    /// Win32 Brush オブジェクトを管理するクラス
    /// </summary>
    internal class Win32BrushCache : IDisposable
    {
        [ThreadStatic]
        static Win32BrushCache _DefaultInstance = null;
        public static Win32BrushCache GetDefaultInstance() {
            if (_DefaultInstance == null) {
                _DefaultInstance = new Win32BrushCache();
            }
            return _DefaultInstance;
        }

        private List<int> m_List = new List<int>();
        private Hashtable m_Win32Brushes = new Hashtable();
        private int m_Capacity = 256;

        private Win32BrushCache() { }

        public int Capacity {
            get { return m_Capacity; }
            set {
                if (value > 0) {
                    m_Capacity = value;
                }
            }
        }

        public IntPtr GetWin32Brush(int rgbColor) {
            if (!m_List.Contains(rgbColor)) {
                IntPtr b = NativeMethods.CreateSolidBrush(rgbColor);
                m_Win32Brushes.Add(rgbColor, b);
                m_List.Add(rgbColor);

                // 容量を超える場合は先頭から削除
                while (m_List.Count > Capacity) {
                    int deleteKey = m_List[0];
                    m_List.Remove(deleteKey);
                    m_Win32Brushes.Remove(deleteKey);
                }
                return b;
            } else {
                // 使用したものをリストの後ろに持っていく
                if (!(m_List.Count < Capacity)) {
                    m_List.Remove(rgbColor);
                    m_List.Add(rgbColor);
                }
                return (IntPtr)m_Win32Brushes[rgbColor];
            }
        }


        bool _disposedValue = false;

        protected virtual void Dispose(bool disposing) {
            if (!(this._disposedValue)) {
                this._disposedValue = true;
                if (disposing) {
                    // マネージオブジェクトを解放する
                }

                // 共有オブジェクトを解放する
                if (m_Win32Brushes != null) {
                    foreach (DictionaryEntry item in m_Win32Brushes) {
                        bool ret = NativeMethods.DeleteObject((IntPtr)item.Value);
                    }
                    m_Win32Brushes = null;
                }
            }
        }

        // Dispose メソッド
        public void Dispose() {
            Dispose(true);
            GC.SuppressFinalize(this); // Finalize 抑止
        }

        // デストラクタ
        ~Win32BrushCache() {
            Dispose(false);
        }
    }
}



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-12-11 (水) 00:36:49 (1466d)