前言
目标处理在容器中添加大量用户控件后下拉闪缩问题
一、重写容器
在容器中添加鼠标按下,移动,释放,重绘等操作,并且在移动或者重绘中添加滚动范围界限。
cs
public class PanelMouse : Panel
{
public PanelMouse()
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
}
private Point lastMousePosition;
private bool isDragging = false;
public int scrollOffset = 0;
public int contentWidth = 0; // 内容的实际宽度
public Image imagePanel;
protected override void OnMouseDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDragging = true;
lastMousePosition = e.Location;
//Console.WriteLine("mousedown:" + lastMousePosition.X + ";" + lastMousePosition.Y);
}
base.OnMouseDown(e);
}
protected override void OnMouseMove(MouseEventArgs e)
{
if (isDragging)
{
int offsetX = 0;
offsetX = e.X - lastMousePosition.X;
// 更新滚动偏移
scrollOffset += offsetX;
// 限制滚动范围
scrollOffset = Math.Max(Math.Min(scrollOffset, 0), -Math.Max(0, contentWidth - this.Width));
lastMousePosition = e.Location;
//Console.WriteLine("mouseMove:" + lastMousePosition.X + ";" + lastMousePosition.Y+";"+ scrollOffset);
this.Refresh();
}
base.OnMouseMove(e);
}
protected override void OnMouseUp(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
isDragging = false;
}
base.OnMouseUp(e);
}
protected override void OnPaint(PaintEventArgs e)
{
if (imagePanel != null)
{
scrollOffset = Math.Max(Math.Min(scrollOffset, 0), -Math.Max(0, contentWidth - this.Width));
e.Graphics.DrawImage(imagePanel, scrollOffset, 0, imagePanel.Width, imagePanel.Height);
}
base.OnPaint(e);
}
}
二、添加用户控件并且生成图片
添加用户控件
cs
public partial class MsgUC : UserControl
{
public MsgUC(int num)
{
InitializeComponent();
this.lblsubject.Text = "测试"+num;
}
}
2.把用户控件生成图片
cs
for (int i = 0; i < 20; i++)
{
MsgUC msgUC = new MsgUC(i);
msgUCs.Add(msgUC);
}
bimg = new Bitmap(msgUCs.Count * msgUCs[0].Width + msgUCs.Count * 8, msgUCs[0].Height);
Graphics g = Graphics.FromImage(bimg);
for (int i = 0; i < msgUCs.Count; i++)
{
Bitmap bmp = new Bitmap(msgUCs[i].Width, msgUCs[i].Height);
msgUCs[i].DrawToBitmap(bmp, new Rectangle(Point.Empty, bmp.Size));
//然后,将这个Bitmap绘制到Panel上
g.DrawImage(bmp, i * msgUCs[i].Width + i * 8, 0, bmp.Width, bmp.Height);
}
g.Dispose();
panelMouse1.imagePanel = bimg;
panelMouse1.contentWidth = bimg.Width;
后续需要锚定位置可以设置scrollOffset参数。
总结
此文章主要处理在容器中有大量的用户控件导致下拉闪缩问题。而且可以延伸出用GDI绘画出页面并生成图片展示然后利用用户的点击位置坐标来触发用户控件的点击事件。
代码相关链接:https://download.csdn.net/download/qq_35319925/92366446