Align Text in Combobox

后端 未结 6 461
后悔当初
后悔当初 2020-12-09 05:42

I want to align my text in combo box so that it will show in the center of combobox tell me how to do this also you can see there is a default border around a combo box when

6条回答
  •  囚心锁ツ
    2020-12-09 06:39

    The post is a bit old but it may be still worth to say:

    both requirements are possible for Windows Forms ComboBox:

    • Text align center (text area and the dropdown)
      • For the text area, find the Edit control and set the ES_CENTER style for the control.
      • For the dropdown items or the selected item in drop-down mode, to align text to center, just make the control owner-drawn and draw the text at center.
    • Get rid of focus rectangle
      • Make the control owner-drawn and just don't draw focus rectangle.

    Example

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    public class MyComboBox : ComboBox
    {
        public MyComboBox()
        {
            DrawMode = DrawMode.OwnerDrawFixed;
        }
    
        [DllImport("user32.dll")]
        static extern int GetWindowLong(IntPtr hWnd, int nIndex);
        [DllImport("user32.dll")]
        static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
        const int GWL_STYLE = -16;
        const int ES_LEFT = 0x0000;
        const int ES_CENTER = 0x0001;
        const int ES_RIGHT = 0x0002;
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
            public int Width { get { return Right - Left; } }
            public int Height { get { return Bottom - Top; } }
        }
        [DllImport("user32.dll")]
        public static extern bool GetComboBoxInfo(IntPtr hWnd, ref COMBOBOXINFO pcbi);
    
        [StructLayout(LayoutKind.Sequential)]
        public struct COMBOBOXINFO
        {
            public int cbSize;
            public RECT rcItem;
            public RECT rcButton;
            public int stateButton;
            public IntPtr hwndCombo;
            public IntPtr hwndEdit;
            public IntPtr hwndList;
        }
        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);
            SetupEdit();
        }
        private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
        private void SetupEdit()
        {
            var info = new COMBOBOXINFO();
            info.cbSize = Marshal.SizeOf(info);
            GetComboBoxInfo(this.Handle, ref info);
            var style = GetWindowLong(info.hwndEdit, GWL_STYLE);
            style |= 1;
            SetWindowLong(info.hwndEdit, GWL_STYLE, style);
        }
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            e.DrawBackground();
            var txt = "";
            if (e.Index >= 0)
                txt = GetItemText(Items[e.Index]);
            TextRenderer.DrawText(e.Graphics, txt, Font, e.Bounds,
                ForeColor, TextFormatFlags.Left | TextFormatFlags.HorizontalCenter);
        }
    }
    

提交回复
热议问题