手柄控件

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

在StatusBar上有一个可以拖动窗体大小的手柄,鼠标在其上拖动时就可以调整当前窗体的大小,如何自己来仿制一个呢,我作了一个小控件就可以实现了,只是效果上相似,至于系统里到底是怎么来实现的,我是不知道的了,下面是控件的代码,没有写注释,因为怕有人笑我,呵呵,其实简单的不用写注释了:

using System;

using System.Drawing;

using System.Windows.Forms;

namespace Size_MoveCtr

{

/// <summary>

/// Mover 的摘要说明。

/// </summary>

public class SizeGrip: System.Windows.Forms.Control

{

private const int WM_NCHITTEST = 0x84;

private const int WM_NCLBUTTONDOWN = 0xa1;

private const int HTCLIENT = 1;

private const int HTBOTTOMRIGHT = 17;

private System.Drawing.Drawing2D.GraphicsPath m_Path;

[System.Runtime.InteropServices.DllImport("user32.dll")]

public static extern int SendMessage( IntPtr hWnd,

int Msg,

IntPtr wParam,

IntPtr lParam

);

public SizeGrip()

{

this.m_Path = new System.Drawing.Drawing2D.GraphicsPath();

this.m_Path.StartFigure();

this.m_Path.AddLines(new Point[]{new Point(this.Width, 0),new Point(this.Width-this.Height, this.Height), new Point(this.Width, this.Height)});

this.m_Path.CloseFigure();

}

protected override void OnPaint(PaintEventArgs e)

{

base.OnPaint (e);

ControlPaint.DrawSizeGrip(this.CreateGraphics(), System.Drawing.SystemColors.Control, this.Width-this.Height, 0, this.Height, this.Height);

}

protected override void OnSizeChanged(EventArgs e)

{

System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();

path.StartFigure();

path.AddLines(new Point[]{new Point(this.Width, 0),new Point(this.Width-this.Height, this.Height), new Point(this.Width, this.Height)});

path.CloseFigure();

Region reReg = new Region(path);

reReg.Complement(m_Path);

this.Invalidate(reReg);

base.OnSizeChanged(e);

this.m_Path = path;

ControlPaint.DrawSizeGrip(this.CreateGraphics(), System.Drawing.SystemColors.Control, this.Width-this.Height, 0, this.Height, this.Height);

}

protected override void WndProc(ref Message m)

{

if (this.DesignMode)

{

base.WndProc(ref m);

return;

}

switch (m.Msg)

{

case WM_NCHITTEST:

SendMessage(this.Parent.Handle, m.Msg, m.WParam, m.LParam);

base.WndProc(ref m);

if ((int)m.Result == HTCLIENT)

{

m.Result = (IntPtr)HTBOTTOMRIGHT;//右下

}

break;

case WM_NCLBUTTONDOWN:

SendMessage(this.Parent.Handle, m.Msg, m.WParam, m.LParam);

break;

default:

base.WndProc(ref m);

break;

}

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有