我需要在TabPage中显示持久网格。如果我可以绘制TabPage的整个不可见部分并防止图形在滚动时被删除,我的问题将立即得到解决。
我能想到的唯一其他解决方案是跟踪选项卡中的滚动位置并基于从中绘制的网格。
为了让它首先绘制,我必须为TabPage.Paint创建一个EventHandler。
//Code removed
此方法绘制垂直和水平线以在可见选项卡中创建网格,但每当Paint事件发生(即滚动)时它都会继续绘制,因此它会创建重叠的线条,并且不会对齐除了大小以外的任何内容标签的当前可见区域。
答案 0 :(得分:0)
也许这样的事情对你有用:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
const int gridSpacing = 20;
const int lineThickness = 1;
Bitmap bmp = new Bitmap(gridSpacing, gridSpacing);
using (System.Drawing.Pen pen = new System.Drawing.Pen(Color.Blue, lineThickness))
{
using (Graphics G = Graphics.FromImage(bmp))
{
G.Clear(this.BackColor);
G.DrawLine(pen, 0, bmp.Height - pen.Width, bmp.Width, bmp.Height - pen.Width); // horizontal
G.DrawLine(pen, bmp.Width - pen.Width, 0, bmp.Width - pen.Width, bmp.Height); // vertical
}
}
foreach (TabPage TP in tabControl1.TabPages)
{
TP.BackgroundImage = bmp;
TP.BackgroundImageLayout = ImageLayout.Tile;
}
}
}
答案 1 :(得分:0)
请记住,此解决方案只是伪造的。你还必须回应滚动。
void form_draw()
{
spacingX = offsetX % scale * -1;
spacingY = offsetY % scale * -1;
if (form.HorizontalPosition != lastXPosition && form.VerticalPosition == lastYPosition)
lastStartX += spacingX;
else if (tab.HorizontalScroll.Value == lastXPosition && form.VerticalPosition != lastYPosition)
lastStartY += spacingY;
lastYPosition = form.VerticalPosition;
lastXPosition = form.HorizontalPosition;
for (int i = lastStartY; i < formHeight; i += scale)
form.draw(0, i, formWidth, i);
for (int i = lastStartX; i < formWidth; i += scale)
form.draw(i, 0, i, formWidth);
}