本文介绍了ComboBox文字垂直居中对齐的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我在.net framework 1.1上创建了自定义组合框,我可以自定义绘制下拉项,但是我不能在中左设置或绘制组合框文本,组合框文本始终在左上方渲染,但是我需要渲染文本在左中。I created the custom combobox on .net framework 1.1, i can custom draw dropdown items, but i can't set or draw the combobox text on Middle Left , combobox text always render top left , but i need text should be render on middle left.[ToolboxBitmap(typeof(ComboBox))]public class MenComboBox :ComboBox{ private Image _image = Image.FromFile("Expand.png"); public MenComboBox() { this.DrawMode = DrawMode.OwnerDrawFixed; this.BackColor = Color.White; this.ItemHeight = 18; this.Font = new Font("Arial",12f,FontStyle.Regular); } protected override void OnDrawItem(DrawItemEventArgs e) { if (!DesignMode) { if (e.Index > -1) { int textHeight = (int)e.Graphics.MeasureString(this.Items[e.Index].ToString(), e.Font).Height; Point textPos = new Point(e.Bounds.X + 4, e.Bounds.Y + ((this.ItemHeight - textHeight) / 2)); if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) { e.Graphics.FillRectangle(Brushes.Blue, e.Bounds); e.Graphics.DrawString(this.Items[e.Index].ToString(),e.Font,Brushes.White,textPos); } else { e.Graphics.FillRectangle(Brushes.White, e.Bounds); e.Graphics.DrawString(this.Items[e.Index].ToString(),e.Font,Brushes.Black,textPos); } } } } protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x000F) { using (Graphics g = this.CreateGraphics()) { g.FillRectangle(new SolidBrush(BackColor), this.ClientRectangle); g.DrawRectangle(Pens.Blue, new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1)); Rectangle rect = new Rectangle(this.Width - 15, 3, 12, this.Height - 6); g.FillRectangle(new SolidBrush(BackColor), rect); g.DrawImage(this._image, this.Width - 16, (this.Height - 8) / 2); g.Dispose(); } } }}推荐答案在所有者中绘制 ComboBox 控件 Edit 部分的文本将始终显示在左上方,而不管 ItemHeight 。In an owner draw ComboBox the text of the Edit part of the control will always be shown at top left, regardless of the height of the ItemHeight.要将编辑部分垂直放置在中间,您可以找到使用 GetComboBoxInfo 编辑元素,然后使用 SetWindowPos 为其设置新位置垂直站立在 ComboBox 的中间。To position the Edit part vertically in middle, you can find the Edit element using GetComboBoxInfo and then using SetWindowPos set a new position for it to stand vertically in middle of the ComboBox.当控件大小更改时,需要重新放置它。另外,您还需要用颜色填充 ComboBox 的背景。You need to reposition it when the control size changes. Also you need to fill the background of ComboBox with a Color.这是我使用的代码:using System;using System.Drawing;using System.Runtime.InteropServices;using System.Windows.Forms;public class MyComboBox : ComboBox{ public MyComboBox() { SetStyle(ControlStyles.ResizeRedraw, true); DrawMode = DrawMode.OwnerDrawFixed; ItemHeight = 40; } [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; } } } private const int SWP_NOSIZE = 0x0001; private const int SWP_NOZORDER = 0x0004; private const int SWP_SHOWWINDOW = 0x0040; [DllImport("user32.dll", SetLastError = true)] static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags); [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 OnResize(EventArgs e) { base.OnResize(e); SetupEdit(); Invalidate(); } private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth; protected override void WndProc(ref Message m) { if (m.Msg == 0xF) { using (var g = this.CreateGraphics()) { var r = new Rectangle(2, 2, ClientRectangle.Width - buttonWidth - 2, ClientRectangle.Height - 4); g.FillRectangle(Brushes.White, r); } } base.WndProc(ref m); } protected override void OnVisibleChanged(EventArgs e) { base.OnVisibleChanged(e); SetupEdit(); } private void SetupEdit() { var info = new COMBOBOXINFO(); info.cbSize = Marshal.SizeOf(info); GetComboBoxInfo(this.Handle, ref info); SetWindowPos(info.hwndEdit, IntPtr.Zero, 3, (this.Height - Font.Height) / 2, ClientRectangle.Width - buttonWidth - 3, ClientRectangle.Height - Font.Height - 4, SWP_NOZORDER); } 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.VerticalCenter); }} 这篇关于ComboBox文字垂直居中对齐的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-23 22:51