Top / .NET備忘録 / 04.最難関!ComboBox / 08.Locked(ReadOnly) プロパティ その(2)

EDIT をサブクラス化するために NativeWindow を継承したクラスを作成します。

    private class EditBoxWindow : NativeWindow
    {
        VBComboBox m_Owner;
 
        public EditBoxWindow(VBComboBox owner)
        {
            m_Owner = owner;
            this.AssignHandle(owner.EditBoxHandle);
        }
 
        protected override void WndProc(ref Message m)
        {
            const int CTRL_C = 0x03; // CTRL + C
            const int
            WM_CHAR = 0x0102,
            WM_CUT = 0x0300,
            //WM_COPY = 0x0301,   WM_COPY は許可
            WM_PASTE = 0x0302,
            WM_CLEAR = 0x0303,
            WM_UNDO = 0x0304,
            WM_SETTEXT = 0x000C;
 
            switch (m.Msg)
            {
                case WM_CHAR:
                    if ((!m_Owner.ReadOnly) || (m.WParam == (IntPtr)CTRL_C)) base.WndProc(ref m);
                    break;
 
                case WM_CUT:
                case WM_PASTE:
                case WM_CLEAR:
                case WM_UNDO:
                case WM_SETTEXT:
                    if (!m_Owner.ReadOnly) base.WndProc(ref m);
                    break;
 
                default:
                    base.WndProc(ref m);
                    break;
            }
        }
    }

あとは、OnScroll イベントの実装時に作成した AssignChildWindows/ReleaseChildWindows にコードを追加するだけです。

        private EditBoxWindow m_EditBoxWindow = null;
        private ListBoxWindow m_ListBoxWindow = null;
 
        private void AssignChildWindows()
        {
            if (EditBoxHandle != IntPtr.Zero)
            {
                m_EditBoxWindow = new EditBoxWindow(this);
            }
            if (ListBoxHandle != IntPtr.Zero)
            {
                m_ListBoxWindow = new ListBoxWindow(this);
            }
        }
 
        private void ReleaseChildWindows()
        {
            if (m_EditBoxWindow != null)
            {
                m_EditBoxWindow.ReleaseHandle();
                m_EditBoxWindow = null;
            }
            if (m_ListBoxWindow != null)
            {
                m_ListBoxWindow.ReleaseHandle();
                m_ListBoxWindow = null;
            }
        }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-10 (日) 22:52:13 (1688d)