コード例 #1
0
ファイル: ComboBoxEx.cs プロジェクト: huamanhtuyen/VNACCS
        protected override void WndProc(ref Message m)
        {
            const int WM_PAINT = 0xF;
            const int WM_PRINTCLIENT = 0x0318;
            const int WM_CTLCOLORLISTBOX = 0x0134;
            const int CB_ADDSTRING = 0x143;
            const int CB_INSERTSTRING = 0x14A;
            const int CB_DELETESTRING = 0x0144;

            WinApi.RECT rect = new WinApi.RECT();

            switch (m.Msg)
            {
                case WM_CTLCOLORLISTBOX:
                    if (IsMultiColumnDropDown && base.DroppedDown)
                    {
                        BarUtilities.InvokeDelayed(new MethodInvoker(delegate { base.DroppedDown = false; }), 10);
                        break;
                    }

                    if (BarFunctions.IsWindows7 && !IsMultiColumnDropDown)
                    {
                        if (m_DropDownHandle != m.LParam)
                            ReleasePopupHandler();

                        if (_PopupMsgHandler == null)
                            CreatePopupHandler(m.LParam);
                    }

                    m_DropDownHandle = m.LParam;

                    if (!IsMultiColumnDropDown && (m_DropDownHeight > 0 || this.Items.Count == 0))
                    {
                        WinApi.GetWindowRect(m.LParam, ref rect);
                        int height = m_DropDownHeight;
                        if (this.Items.Count == 0)
                            height = Math.Max(18, this.ItemHeight);
                        Point thisLocation = this.PointToScreen(Point.Empty);
                        if (rect.Top < thisLocation.Y)
                            rect.Top = thisLocation.Y + this.Height;
                        NativeFunctions.SetWindowPos(m.LParam, IntPtr.Zero, rect.Left, rect.Top, rect.Width,
                                                     height, NativeFunctions.SWP_NOACTIVATE);
                    }
                    break;

                case (int)WinApi.WindowsMessages.CB_GETDROPPEDSTATE:

                    base.WndProc(ref m);

                    if (m.Result == IntPtr.Zero && DroppedDownInternal && !IsMultiColumnDropDown)
                        DroppedDownInternal = false;
                    return;

                case NativeFunctions.WM_SETFOCUS:
                    if (m.WParam != this.Handle)
                        m_LastFocusWindow = m.WParam;

                    break;

                case CB_ADDSTRING:
                    if (this.Items.Count > 0)
                    {
                        ComboItem cb = this.Items[this.Items.Count - 1] as ComboItem;

                        if (cb != null)
                            cb.m_ComboBox = this;
                    }
                    break;

                case CB_INSERTSTRING:
                    int index = WinApi.ToInt(m.WParam);

                    if (index >= 0 && index < this.Items.Count)
                    {
                        ComboItem cb = this.Items[index] as ComboItem;

                        if (cb != null)
                            cb.m_ComboBox = this;
                    }

                    m_SelectedIndexInternal = -1;
                    break;

                case CB_DELETESTRING:
                    m_SelectedIndexInternal = -1;
                    break;

                case NativeFunctions.WM_USER + 7:
                    if (this.DropDownStyle == ComboBoxStyle.DropDown && !m_Focused)
                        this.SelectionLength = 0;

                    this.Invalidate(true);
                    return;
                case (int)WinApi.WindowsMessages.WM_LBUTTONDOWN:
                    {
                        if (IsMultiColumnDropDown)
                        {
                            if (IsPopupOpen)
                                CloseMultiColumnDropDown();
                            else if (DateTime.Now.Subtract(_MultiDropDownClosedAtTime).TotalMilliseconds > 500 && (this.Focused || this.Focus()))
                            {
                                OpenMultiColumnDropDown();
                            }
                            return; // Don't call base
                        }
                        break;
                    }
                case (int)WinApi.WindowsMessages.WM_REFLECTCOMMAND:
                    {
                        if (IsMultiColumnDropDown)
                        {
                            int wp = WinApi.HIWORD(m.WParam);
                            if (wp == CBN_DROPDOWN)
                            {
                                OpenMultiColumnDropDown();
                                return; // Don't call base
                            }
                            else if (wp == CBN_CLOSEUP)
                            {
                                if (DateTime.Now.Subtract(_MultiDropDownOpenedAtTime).TotalMilliseconds > 900)
                                {
                                    CloseMultiColumnDropDown();
                                    return; // Don't call base
                                }
                            }
                        }
                        break;
                    }
            }

            if (m_DefaultStyle)
            {
                base.WndProc(ref m);
                return;
            }

            if ((m.Msg == WM_PAINT || m.Msg == WM_PRINTCLIENT) && DrawMode != DrawMode.Normal)
            {
                WinApi.GetWindowRect(m.HWnd, ref rect);
                Rectangle r = new Rectangle(0, 0, rect.Width, rect.Height);

                if (m.Msg == WM_PAINT)
                {
                    WinApi.PAINTSTRUCT ps = new WinApi.PAINTSTRUCT();

                    IntPtr hdc = WinApi.BeginPaint(m.HWnd, ref ps);

                    using (Graphics gHdc = Graphics.FromHdc(hdc))
                    {
                        using (BufferedBitmap bmp = new BufferedBitmap(gHdc, r))
                        {
                            PaintComboBox(bmp.Graphics, r);

                            bmp.Render(gHdc);
                        }
                    }

                    WinApi.EndPaint(m.HWnd, ref ps);
                }
                else
                {
                    using (Graphics g = Graphics.FromHdc(m.WParam))
                        PaintComboBox(g, r);
                }

                if (this.Parent is ItemControl)
                    ((ItemControl)this.Parent).UpdateKeyTipsCanvas();
            }
            else
            {
                base.WndProc(ref m);
            }
        }
コード例 #2
0
        //private void PaintUnBuffered()
        //{
        //    IntPtr dc = WinApi.GetWindowDC(m_Control.Handle);
        //    try
        //    {
        //        using (Graphics g = Graphics.FromHdc(dc))
        //        {
        //            g.SetClip(GetClientRectangle(), CombineMode.Exclude);
        //            if (!ShouldSkinScrollbars)
        //            {
        //                WinApi.SCROLLBARINFO psbi = new WinApi.SCROLLBARINFO();
        //                psbi.cbSize = Marshal.SizeOf(psbi);
        //                WinApi.GetScrollBarInfo(m_Control.Handle, (uint)WinApi.eObjectId.OBJID_VSCROLL, ref psbi);
        //                if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
        //                {
        //                    Rectangle rvs = ScreenToNonClientRectangle(psbi.rcScrollBar.ToRectangle());
        //                    g.SetClip(rvs, System.Drawing.Drawing2D.CombineMode.Exclude);
        //                }
        //                psbi = new WinApi.SCROLLBARINFO();
        //                psbi.cbSize = Marshal.SizeOf(psbi);
        //                WinApi.GetScrollBarInfo(m_Control.Handle, (uint)WinApi.eObjectId.OBJID_HSCROLL, ref psbi);
        //                if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
        //                {
        //                    Rectangle rvs = ScreenToNonClientRectangle(psbi.rcScrollBar.ToRectangle());
        //                    g.SetClip(rvs, System.Drawing.Drawing2D.CombineMode.Exclude);
        //                }
        //            }

        //            PaintNonClientArea(g);
                    
        //            g.ResetClip();
        //        }
        //    }
        //    finally
        //    {
        //        WinApi.ReleaseDC(m_Control.Handle, dc);
        //    }
        //}
        private void RenderNonClientAreaBitmap(BufferedBitmap bmp)
        {
            if (bmp == null) return;
            IntPtr dc = WinApi.GetWindowDC(m_Control.Handle);
            try
            {
                using (Graphics g = Graphics.FromHdc(dc))
                {
                    Rectangle[] clips = new Rectangle[3];
                    clips[0] = GetClientRectangle();
                    
                    if (!ShouldSkinScrollbars)
                    {
                        WinApi.SCROLLBARINFO psbi = new WinApi.SCROLLBARINFO();
                        psbi.cbSize = Marshal.SizeOf(psbi);
                        WinApi.GetScrollBarInfo(m_Control.Handle, (uint)WinApi.eObjectId.OBJID_VSCROLL, ref psbi);
                        if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
                        {
                            Rectangle rvs = ScreenToNonClientRectangle(psbi.rcScrollBar.ToRectangle());
                            clips[1] = rvs;
                        }
                        psbi = new WinApi.SCROLLBARINFO();
                        psbi.cbSize = Marshal.SizeOf(psbi);
                        WinApi.GetScrollBarInfo(m_Control.Handle, (uint)WinApi.eObjectId.OBJID_HSCROLL, ref psbi);
                        if (psbi.rgstate[0] != (int)WinApi.eStateFlags.STATE_SYSTEM_INVISIBLE)
                        {
                            Rectangle rvs = ScreenToNonClientRectangle(psbi.rcScrollBar.ToRectangle());
                            clips[2] = rvs;
                        }
                    }

                    bmp.Render(g, clips);
                }
            }
            finally
            {
                WinApi.ReleaseDC(m_Control.Handle, dc);
            }
        }
コード例 #3
0
 private void PaintInternal(Graphics g, IntPtr hdc)
 {
     UpdateScrollValues();
     using (BufferedBitmap bmp = new BufferedBitmap(g, new Rectangle(0, 0, m_ParentScrollBar.Width, m_ParentScrollBar.Height)))
     {
         m_ScrollBarCore.Paint(GetItemPaintArgs(bmp.Graphics));
         bmp.Render(g);
     }
 }
コード例 #4
0
ファイル: ListViewEx.cs プロジェクト: huamanhtuyen/VNACCS
            protected override void WndProc(ref Message m)
            {
                if (m.Msg == (int)WinApi.WindowsMessages.WM_PAINT)
                {
                    WinApi.PAINTSTRUCT ps = new WinApi.PAINTSTRUCT();
                    IntPtr hdc = WinApi.BeginPaint(m.HWnd, ref ps);
                    try
                    {
                        Graphics g = Graphics.FromHdc(hdc);
                        try
                        {
                            WinApi.RECT r = new WinApi.RECT();
                            WinApi.GetWindowRect(m.HWnd, ref r);
                            Rectangle rc = new Rectangle(0, 0, r.Width, r.Height);
                            using (BufferedBitmap bb = new BufferedBitmap(hdc, rc))
                            {
                                m_Parent.PaintHeaderBackground(bb.Graphics, rc);

                                IList columns = m_Parent.GetOrderedColumnList();

                                int x = 0;
                                foreach (ColumnHeader h in columns)
                                {

                                    Rectangle hr = new Rectangle(x, 0, h.Width, r.Height);
                                    ListViewItemStates state = ListViewItemStates.ShowKeyboardCues;
                                    if (m_MouseDown && hr.Contains(m_MouseDownPoint))
                                    {
                                        Rectangle rt = hr;
                                        rt.Inflate(-6, 0);
                                        if (rt.Contains(m_MouseDownPoint))
                                            state |= ListViewItemStates.Selected;
                                    }

                                    m_Parent.DrawColumnHeaderInternal(new DrawListViewColumnHeaderEventArgs(bb.Graphics, hr, h.DisplayIndex, h,
                                        state, SystemColors.ControlText, Color.Empty, m_Parent.ColumnHeaderFont ?? m_Parent.Font));
                                    x += h.Width;
                                }
                                bb.Render(g);
                            }
                        }
                        finally
                        {
                            g.Dispose();
                        }
                    }
                    finally
                    {
                        WinApi.EndPaint(m.HWnd, ref ps);
                    }
                    return;
                }
                else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONDOWN)
                {
                    if (m_Parent.HeaderStyle == ColumnHeaderStyle.Clickable)
                    {
                        m_MouseDown = true;
                        m_MouseDownPoint = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
                        WinApi.RedrawWindow(m.HWnd, IntPtr.Zero, IntPtr.Zero, WinApi.RedrawWindowFlags.RDW_INVALIDATE);
                    }
                }
                else if (m.Msg == (int)WinApi.WindowsMessages.WM_LBUTTONUP)
                {
                    m_MouseDown = false;
                    m_MouseDownPoint = Point.Empty;
                }
                else if (m.Msg == (int)WinApi.WindowsMessages.WM_MOUSEMOVE && m_MouseDown)
                {
                    m_MouseDownPoint = new Point(WinApi.LOWORD(m.LParam), WinApi.HIWORD(m.LParam));
                }

                base.WndProc(ref m);
            }