【发布时间】:2014-09-16 09:41:11
【问题描述】:
我采用了一个 Flow 布局面板并在其中放置了多个图片框。现在我想什么时候将鼠标放在流布局面板的最右边或最左边,然后图片的其余部分将滚动出来。想想 Windows 8 的开始屏幕,屏幕上出现了许多图块,当我们将鼠标放在屏幕的最右边时,其余的图块会滚动出来。我想用 Flow 布局面板在 windows 窗体中模拟相同的东西。
我希望我的 Flow 布局面板不会显示滚动条,但当我将鼠标放在面板的最右侧或左侧时,图像会滚动出来。这是我的屏幕截图
有人告诉我这样做...这是位代码 在 Panel 的 MouseMove 事件中设置 AutoScrollPosition 属性。
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
panel1.AutoScrollPosition = new Point(e.X, e.Y);
}
但是这个技巧并不好。 AutoScrollPosition 在滚动条可见时工作,但在我的情况下,我不想在 Flow 布局面板中显示滚动条。我想要从左到右或从右到左平滑滚动图像。任何人都可以帮助我实现我想要做的事情......如果可能的话,指导我进行编码。谢谢
编辑
在这里,我按照@Taw 的建议修改后给出了我的完整代码,但它不能正常工作....当图片移动时发现闪烁。无论如何,这里是完整的代码。
namespace ScrollTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
flowLayoutPanel1.MouseMove += MouseScroll;
foreach (Control x in this.Controls)
{
if (x is PictureBox)
{
((PictureBox)x).MouseMove += MouseScroll;
}
}
}
int near = 33;
private void MouseScroll(object sender, MouseEventArgs e)
{
Point mouse = flowLayoutPanel1.PointToClient(MousePosition);
Rectangle C = flowLayoutPanel1.ClientRectangle;
int dLeft = mouse.X - C.Left;
int dTop = mouse.Y - C.Top;
int dRight = C.Right - mouse.X;
int dBottom = C.Bottom - mouse.Y;
int dX = dLeft < near ? dLeft : dRight < near ? -dRight : 0;
int dY = dTop < near ? dTop : dBottom < near ? -dBottom : 0;
if (dX != 0 | dY != 0) scrollFLP(dX, dY);
}
void scrollFLP(int deltaX, int deltaY)
{
flowLayoutPanel1.Left += getSpeedFromDistance(deltaX);
flowLayoutPanel1.Top += getSpeedFromDistance(deltaY);
System.Threading.Thread.Sleep(11);
}
int getSpeedFromDistance(int delta)
{
int sig = Math.Sign(delta);
int d = Math.Abs(delta);
if (d > near / 2) return sig;
else if (d > near / 3) return near / 10 * sig;
else if (d > near / 4) return near / 8 * sig;
else if (d > near / 5) return near / 5 * sig;
else return near * sig;
}
}
}
基本上我正在尝试实现类似假设我有flow layout panel 并且其中有很多图片框,其中有很多图像作为屏幕截图,但滚动条不应该显示,而是当我将鼠标放在流布局面板的顶部或底部,例如 carousel。
查看您的应用程序的这张图片
当我将鼠标放在右端时,它会滚动并形成我不想要的背景。我希望图片框将滚动并滚动到最后一个不超过那个。
知道怎么做。谢谢
第二次编辑
我根据您的建议添加了此代码
public Form1()
{
InitializeComponent();
for (int i = 0; i < 666; i++)
{
PictureBox pan = new PictureBox();
//pan.MouseMove += MouseScroll;
//pan.MouseLeave += outSideCheck;
pan.Size = new Size(75, 75);
pan.BackColor = Color.FromArgb(255, (i * 2) & 255, (i * 7) & 255, (i * 4) & 255);
flowLayoutPanel1.Controls.Add(pan);
}
//flowLayoutPanel1.MouseMove += MouseScroll;
//this.flowLayoutPanel1.MouseLeave += outSideCheck;
mouseScroller MSC = new mouseScroller();
MSC.registerControl(flowLayoutPanel1); // FLP = your FlowLayouPanel
MSC.timerSpeed = 5; // optional
MSC.nearness = 100; // optional
flowLayoutPanel1.AutoScroll = false;
}
现在应用程序在添加新代码后执行有线行为。如果我犯了任何错误,请指导我。谢谢
【问题讨论】:
-
你的意思是你有不可见的图片框并想要滚动它们?
-
我的流程布局面板有很多图片框,如附加图片,全部不可见。所以当我将鼠标放在流程布局面板的底部边缘或流程布局面板的顶部边缘时,我想自动滚动流程布局面板。我清楚吗...如果不是,请问我。