我的程序中有一个自定义用户控件。这是一个面板,需要从左侧调整大小。这是我的代码:
private void ResizePanel_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && e.X == ClientRectangle.Left)
{
resizeMode = true;
}
}
private void ResizePanel_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
resizeMode = false;
}
}
private void ResizePanel_MouseMove(object sender, MouseEventArgs e)
{
if (resizeMode == true)
{
Size newSize = new Size();
newSize.Height = Height;
newSize.Width = Math.Abs(e.X - ClientRectangle.Left); // Distance between the mouse position and
// left side of the panel
if (e.X < this.ClientRectangle.Left)
{
Width = newSize.Width;
Left -= newSize.Width;
}
}
}
从理论上讲,解决方案是随着宽度的增加将面板向左移动新的宽度。这就是这段代码应该做的。目前的问题是,随着面板向左移动,宽度保持不变并且不会增加。有没有办法做到这一点,这样我就可以抓住左侧的控件并向左拖动,从而使尺寸增加并且看起来保持在原处?
答案 0 :(得分:1)
这是一个快速且肮脏的面板,只能从左侧拖动:
class LeftSideResizePanel : Panel
{
private const int HTLEFT = 10;
private const int HTCLIENT = 1;
private const int WM_NCHITTEST = 0x0084;
private const int WS_THICKFRAME = 0x40000;
protected override CreateParams CreateParams
{
get
{
var cp = base.CreateParams;
cp.Style |= WS_THICKFRAME;
return cp;
}
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
Point pt = this.PointToClient(new Point(m.LParam.ToInt32()));
Rectangle hit = new Rectangle(new Point(-3, 0), new Size(6, this.Height));
m.Result = hit.Contains(pt) ? (IntPtr)HTLEFT : (IntPtr)HTCLIENT;
return;
}
base.WndProc(ref m);
}
}
如果您不喜欢WS_THICKFRAME的外观,则必须使用Jimi注释中所述的方法进行更好的控制。