我正在构建带有可滚动缩略图的图像查看器。我有一个带有面板的表单,并且在面板上将自动滚动设置为true。我在面板上加载了图片框,每个图片框对应一个文件夹。这些是缩略图,并且一旦面板中有多个图片框,便可以在面板中滚动。
我可以单击一个或多个图片框(缩略图),并在每个被单击的图片框周围添加边框。我最初使用BorderStyle = BorderStyle.Fixed3D,但那细边框是不够的。因此,现在我通过在图片框上绘制矩形来在图片框上设置边框:
private void SetBorder(PictureBox pb)
{
var color = ColorTranslator.FromHtml("#ff9900");
var rc = pb.ClientRectangle;
rc.Inflate(-1, -1);
ControlPaint.DrawBorder(pb.CreateGraphics(), rc, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid);
}
这看起来比固定的3D边框样式好很多,但是仅在使用滚动条的轨道部分(滚动条外部的区域,左或右)时才滚动图像时出现问题。单击并拖动滚动条本身,或使用箭头都可以正常工作(我从面板滚动事件重新绘制,请参见下文)。但是,当单击轨道时,如果将图片框从视图外滚动回去,则边框不会重新绘制。例如,我单击几个缩略图并设置边框:
边框看起来不错,但是如果我向右滚动(单击轨道),然后再向左滚动,则不会重绘所覆盖的内容。例如:
如上所述,当单击滚动条箭头或拖动滚动条时,我正在重新绘制面板滚动事件中的边框:
private void panel1_Scroll(object sender, ScrollEventArgs e)
{
SetBorders(panel1);
}
但是,单击曲目时,这似乎不会引发面板的Scroll事件。
我忘了提及,SetBorders(复数)是另一种方法(我没有在问题中包括此方法),它循环通过面板中的图片框,对于每个应该重新绘制的图片框,它都调用SetBorder(方法)包括在上面)并通过给定的图片框...
仅发现使用鼠标滚轮滚动时也存在此问题。
有什么想法吗?
答案 0 :(得分:1)
将所有图片框paint event
设置为同一子框:
pictureBox1.Paint += pictureBox_Paint;
pictureBox2.Paint += pictureBox_Paint;
....
....
或之后将picboxes
添加到panel
:
var children = panel1.Controls.OfType<Control>();
foreach( Control child in children ) {
( (PictureBox)child ).Paint += pictureBox_Paint;
}
并在情况下:
private void pictureBox_Paint( object sender, PaintEventArgs e ) {
PictureBox picbox = (PictureBox)sender;
var color = ColorTranslator.FromHtml( "#ff9900" );
var rc = picbox.ClientRectangle;
rc.Inflate( -1, -1 );
ControlPaint.DrawBorder( e.Graphics, rc, color, 3, ButtonBorderStyle.Solid, color, 3,
ButtonBorderStyle.Solid, color, 3, ButtonBorderStyle.Solid,
color, 3, ButtonBorderStyle.Solid );
}
无需再使用panel1_Scroll
事件!