使用键盘滚动面板(PageDown / PageUp)

时间:2014-12-06 01:15:31

标签: c# winforms scroll panel

使用滚动条和键盘滚动支持在Winforms应用中显示大图像的正确方法是什么? Currenty我使用Panel(AutoScroll = True)和嵌套的PitureBox(SizeMod = AutoSize)。

我有两个问题:

1)绘制图像的控制选择是什么? Panel和PitureBox无法使用Tab键选择(聚焦)。使用带AutoSize = true的Button和FlatStyle = Flat是正确的解决方案吗?

2)如何使用键盘在面板中滚动图像。需要处理哪些键盘事件 - Form,Panel或PictureBox。可能我应该为Panel AutoScroll = false设置并添加HScroll和VScroll,我应该处理哪些事件?

实施这个基本应用程序的正确方法是什么?

(仅供参考,主表单有其他Panel(Dock = Top),其中包含一些控件。)

1 个答案:

答案 0 :(得分:1)

  • 关于第一个问题:没有控件哪个非常适合画画,仍然可以获得Focus。在下面的链接中,您可以看到如何制作可选面板

  • 现在出现真正的问题:如何通过键盘滚动AutoScroll Panel

这非常难以做到。这是一个开始的例子:

private void Form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
  if (panel1.Bounds.Contains( this.PointToClient( Cursor.Position )  ))
  {
    if (e.KeyValue == 33) panel1.AutoScrollPosition = 
      new Point(panel1.AutoScrollPosition.X, Math.Abs(panel1.AutoScrollPosition.Y) - 10);

    if (e.KeyValue == 34) panel1.AutoScrollPosition = 
      new Point(panel1.AutoScrollPosition.X, Math.Abs(panel1.AutoScrollPosition.Y) + 10);
  }
}

我测试Panel是否包含鼠标。您可能想要使用滚动量。还要将KeyValues替换为正确的Keys ;-)为表单设置KeyPreview = true;

注意:仅当表单上没有可以获得焦点的控件时才有效。

因为很可能你有一些Controls,如ButtonsListBoxes等等。这是另一个解决方案,无论如何都适用,我相信..:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (panel1.Bounds.Contains(this.PointToClient(Cursor.Position)))
    switch (keyData)
    {
        case Keys.PageDown: { scroll(10);  return true; }
        case Keys.PageUp:   { scroll(-10); return true; }
       // maybe code for some more keys..?
    }

    return base.ProcessCmdKey(ref msg, keyData);
}

void scroll(int delta)
{
    panel1.AutoScrollPosition =  new Point(
           panel1.AutoScrollPosition.X, Math.Abs(panel1.AutoScrollPosition.Y) + delta);
}

这并不需要表单KeyPreview = true;

AutoScrollPosition

Here is the MSDN解释。

Here是一篇建议使用Panel和/或PictureBox的子类的帖子,它应该允许它们获取Focus。我虽然无法工作......(最后它似乎也没有任何简单......)