Преодолейте наложенное ограничение размера минимума Windows Form ОС

просто попробуйте это:

@objc(MyType)
public class MyType: NSManagedObject {
    // your class
}

вместо этого:

class MyType: NSManagedObject {
    // your class
}
9
задан Zach Johnson 15 June 2009 в 00:20
поделиться

2 ответа

После долгих экспериментов и проб и ошибок я нашел решение. Я переопределил OnResize и согласовал размер формы с ListBox в нем (см. Мой комментарий к ответу Джона Сондерса).

Как я уже упоминал в своем вопросе, я заметил, что размер формы уменьшается после отправки WM_WINDOWPOSCHANGED. Дальнейшее расследование показало, что регрессия размера фактически начинается при отправке WM_WINDOWPOSCHANGING.

WM_WINDOWPOSCHANGING - это родственное сообщение WM_WINDOWPOSCHANGED, которое происходит до фактического изменения размера окна. Я не знаю почему, но по какой-то причине WM_WINDOWPOSCHANGING слепо соответствует размеру формы указанным ограничениям ОС (по-видимому, он не запрашивает окно с WM_GETMINMAXINFO). Таким образом, Мне нужно было перехватить WM_WINDOWPOSCHANGING и переопределить его размером, который я действительно хотел.

Это означает, что я больше не согласовываю размер формы с помощью OnResize, но вместо этого я согласовываю размер формы, когда я получаю WM_WINDOWPOSCHANGING. Это даже лучше, чем OnResize, потому что нет связанного мерцания, которое возникает, когда размер изменяется, а затем снова изменяется, когда размер согласовывается во время OnResize.

Кроме того, необходимо перехватить и переопределить WM_GETMINMAXINFO, иначе даже перехватить WM_WINDOWPOSCHANGING не принесет вам пользы.

using System.Runtime.InteropServices;

private const int WM_WINDOWPOSCHANGING = 0x0046;
private const int WM_GETMINMAXINFO = 0x0024;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_WINDOWPOSCHANGING)
    {
        WindowPos windowPos = (WindowPos)m.GetLParam(typeof(WindowPos));

        // Make changes to windowPos

        // Then marshal the changes back to the message
        Marshal.StructureToPtr(windowPos, m.LParam, true);
    }

    base.WndProc(ref m);

    // Make changes to WM_GETMINMAXINFO after it has been handled by the underlying
    // WndProc, so we only need to repopulate the minimum size constraints
    if (m.Msg == WM_GETMINMAXINFO)
    {
        MinMaxInfo minMaxInfo = (MinMaxInfo)m.GetLParam(typeof(MinMaxInfo));
        minMaxInfo.ptMinTrackSize.x = this.MinimumSize.Width;
        minMaxInfo.ptMinTrackSize.y = this.MinimumSize.Height;
        Marshal.StructureToPtr(minMaxInfo, m.LParam, true);
   }
}

struct WindowPos
{
     public IntPtr hwnd;
     public IntPtr hwndInsertAfter;
     public int x;
     public int y;
     public int width;
     public int height;
     public uint flags;
}

struct POINT
{
    public int x;
    public int y;
}

struct MinMaxInfo
{
    public POINT ptReserved;
    public POINT ptMaxSize;
    public POINT ptMaxPosition;
    public POINT ptMinTrackSize;
    public POINT ptMaxTrackSize;
}
15
ответ дан 4 December 2019 в 10:05
поделиться

Вы имеете в виду, помимо использования другой ОС?

Как насчет «Не использовать форму»? Насколько велика эта вещь, которую вам нужно показать? Пиксель? Нужна ли полная функциональность Windows Forms?

Я точно не знаю, как это сделать, но для вас это может быть началом - думайте за пределами (ограничивающей) рамки.

0
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: