Если список в поле со списком шире, чем со списком, как я могу нарисовать его справа от поля со списком? Он всегда выравнивается по левому краю. Например, если поле со списком находится рядом с правой стороной формы, а список в поле со списком шире, чем ширина поля со списком, часть списка не видна пользователю.
Я не хочу выравнивать текст в списке влево или вправо, но весь список должен отображаться справа от элемента управления combobox.
Так вы действительно пытались сделать это самостоятельно?
Да, я что-то пробовал в событии DrawItem, но не знаю, как получить ссылку на список combobox.





После некоторых поисков мне удалось найти решение на другом форуме. Я адаптировал его для C# и немного изменил.
using System.Runtime.InteropServices;
using System.Windows.Forms;
// Fix Combo dropdown list if (left or right) off screen.
public class ComboExtended : ComboBox
{
[DllImport("user32.dll")]
private extern static bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, [MarshalAs(UnmanagedType.Bool)] bool bRepaint);
[DllImport("user32.dll")]
private extern static bool GetWindowRect(IntPtr hWnd, ref tagRECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct tagRECT
{
public int left, top, right, bottom;
}
private const int WM_CTLCOLORLISTBOX = 308;
private bool ListMoved = false;
protected override void OnDropDownClosed(EventArgs e)
{
base.OnDropDownClosed(e);
ListMoved = false;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (!ListMoved && m.Msg == WM_CTLCOLORLISTBOX)
{
tagRECT rc = new tagRECT();
GetWindowRect(m.LParam, ref rc);
Form parentForm = this.FindForm();
int posLeft = rc.right - rc.left > this.Width ? rc.left - ((rc.right - rc.left) - this.Width) : rc.left;
int posTop = rc.bottom - rc.top > parentForm.Height - rc.top ? (rc.top - (rc.bottom - rc.top)) - this.Height : rc.top;
MoveWindow(m.LParam, posLeft, posTop, rc.right - rc.left, rc.bottom - rc.top, true);
ListMoved = true;
}
}
}
Возможный дубликат Выровнять текст в поле со списком