Некоторые коды, чтобы вы начали. Ключ должен отвечать на сообщение WM_SIZING, он позволяет изменять прямоугольник окна. Этот образец является грубым, вы действительно хотите обратить внимание на то, какой угол или край перетаскивается пользователем, доступный от m.WParam. Пользовательский интерфейс никогда не будет большим, вы не можете сделать ничего разумного, когда пользователь перетаскивает угол. Создание гибкости вашей формы настолько, что вам не важно, что аспектный рацион является реальным решением. Отображение полосы прокрутки, когда содержимое не подходит в значительной степени, позволяет пользователю делать правильную вещь автоматически.
using System.Runtime.InteropServices;
// etc..
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void WndProc(ref Message m) {
if (m.Msg == 0x216 || m.Msg == 0x214) { // WM_MOVING || WM_SIZING
// Keep the window square
RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
int w = rc.Right - rc.Left;
int h = rc.Bottom - rc.Top;
int z = w > h ? w : h;
rc.Bottom = rc.Top + z;
rc.Right = rc.Left + z;
Marshal.StructureToPtr(rc, m.LParam, false);
m.Result = (IntPtr)1;
return;
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public int Left;
public int Top;
public int Right;
public int Bottom;
}
}
К сожалению, Я не хотел включать WM_MOVING. –
спасибо, это трюк. Хотелось бы, чтобы был лучший способ справиться с угловыми перетаскиваниями. – yoyoyoyosef
Просто примечание: этот код поддерживает соотношение сторон = 1 (квадрат) –