上一篇文章,我们搭建好了主界面的布局。本文将实现页面的交互逻辑,比如如何移动窗体、调整窗体大小、点击消息和联系人切换下方的panel面板、动态加载消息列表panel和好友列表panel等,并且左下角的按钮改成了添加好友的入口。
移动窗体
因为设置FormBorderStyle属性为None,所以目前无法移动窗体,要通过代码的方式移动。
鼠标按住窗体上部分移动窗体
要实现这个效果,需要使用上面面板splitContainer1_Panel1的三个事件:MouseDown、MouseMove、MouseUp。具体实现过程:
1.定义两个本地变量
private Point mousepoint;//鼠标的位置
private bool mouseflag = false;//鼠标是否按下的标志
2.实现三个事件
private void splitContainer1_Panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mousepoint.X = e.X;
mousepoint.Y = e.Y;
mouseflag = true;
}
}
private void splitContainer1_Panel1_MouseMove(object sender, MouseEventArgs e)
{
if (mouseflag)
{
this.Left = MousePosition.X - mousepoint.X;
this.Top = MousePosition.Y - mousepoint.Y;
}
}
private void splitContainer1_Panel1_MouseUp(object sender, MouseEventArgs e)
{
mouseflag = false;
}
这样就可以实现按住上部分移动窗体。
调整窗体大小
通过对窗体边缘进行判断,配合鼠标事件,可以完成调整窗体大小的操作。注意,此时窗体的padding值为6。此法也是参考网友的方法,并进行了优化。下面便是放大的窗体效果:
调整Major窗体大小
第一步,定义枚举,表示拖动方向
public enum MouseDirection
{
Herizontal,//水平方向拖动,只改变窗体的宽度
Vertical,//垂直方向拖动,只改变窗体的高度
Declining,//倾斜方向,同时改变窗体的宽度和高度
None//不做标志,即不拖动窗体改变大小
}
第二步,添加四个全局变量
bool isMouseDown = false; //表示鼠标当前是否处于按下状态,初始值为否
MouseDirection direction = MouseDirection.None;//表示拖动的方向,起始为None,表示不拖动
Point mouseOff;//鼠标移动位置变量
bool declinning = false;//宽高同时拖动时的标志
第三步,鼠标按下事件
private void Major_MouseDown(object sender, MouseEventArgs e)
{
mouseOff = new Point(-e.X, -e.Y); //记录鼠标位置
//当鼠标的位置处于边缘时,允许进行改变大小。
if (e.Location.X >= this.Width - 10 && e.Location.Y > this.Height - 10)
{
isMouseDown = true;
}
else if (e.Location.X >= this.Width - 10)
{
isMouseDown = true;
}
else if (e.Location.Y >= this.Height - 10)
{
isMouseDown = true;
}
else
{
this.Cursor = Cursors.Arrow;//改变鼠标样式为原样
isMouseDown = false;