Я знаю, что мне нужно использовать WndProc, чтобы получить внутреннее текстовое поле, но я не уверен, как его получить, а затем отредактировать. ее длина не должна закрывать кнопку при выборе.
прямо сейчас, когда я навожу указатель мыши на поле со списком или ввожу его для проверки редактирования, кнопка закрывается элементом управления редактированием внутреннего текстового поля.< /p>
так выглядит поле со списком, когда я ввожу
[img]https://i.sstatic. net/tCvpH9uy.png[/img]
вот как я хочу, чтобы поле со списком выглядело

мой код - полный беспорядок от попыток разобраться в этом, я ни к чему не добился действительно.
Я скажу, что добавил элемент управления «Кнопка» в поле со списком, поскольку хочу получить доступ к встроенным функциям.
public ComboBoxButton() : base()
{
_button1.Size = buttonSize;
this.DrawMode = DrawMode.OwnerDrawVariable;
_button1.BackColor = SystemColors.Control;
_button1.Text = "?";
_button1.Location = buttonLocation;
this.Controls.Add(_button1);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
}
Я попробовал несколько разных способов получить контроль над редактированием через
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern bool GetComboBoxInfo(IntPtr hWnd, ref COMBOBOXINFO pcbi);
Я также нашел этот код и надеялся, что смогу отредактировать его, чтобы изменить размер текстового поля, но не смог
private class TextWindow : NativeWindow
{
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
private struct COMBOBOXINFO
{
public Int32 cbSize;
public RECT rcItem;
public RECT rcButton;
public int buttonState;
public IntPtr hwndCombo;
public IntPtr hwndEdit;
public IntPtr hwndList;
}
[DllImport("user32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Unicode)]
private static extern IntPtr SendMessageCb(IntPtr hWnd, int msg, IntPtr wp, out COMBOBOXINFO lp);
public TextWindow(ComboBox cb)
{
COMBOBOXINFO info = new COMBOBOXINFO();
info.cbSize = Marshal.SizeOf(info);
SendMessageCb(cb.Handle, 0x164, IntPtr.Zero, out info);
this.AssignHandle(info.hwndEdit);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == (0x0302))
{
MessageBox.Show("No pasting allowed!");
return;
}
base.WndProc(ref m);
}
}
private TextWindow textWindow;
protected override void OnHandleCreated(EventArgs e)
{
textWindow = new TextWindow(this);
base.OnHandleCreated(e);
listBoxHandle = GetComboBoxListInternal(this.Handle, out COMBOBOXINFO info);
}
protected override void OnHandleDestroyed(EventArgs e)
{
textWindow.ReleaseHandle();
base.OnHandleDestroyed(e);
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... ng-control