使用滚动条和键盘滚动支持在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),其中包含一些控件。)
答案 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
,如Buttons
,ListBoxes
等等。这是另一个解决方案,无论如何都适用,我相信..:
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是一篇建议使用Panel
和/或PictureBox
的子类的帖子,它应该允许它们获取Focus
。我虽然无法工作......(最后它似乎也没有任何简单......)