1、C#的界面编程中,很多情况都会使用到动态的界面,也就是需要不断的在界面上绘制图形,动态显示系统数据的变化。这里将会用到的知识点包括C#的GDI编程,C#的后台监控程序,或者使用多线程也可以实现。
2、在这个实例中,我们主要是通过界面显示测试结果,红色代表测试NG,绿色代表测试OK,系统测试到那一个位置,不同的颜色代表不同的结果,这样就可以概略的显示整个系统的测试结果 了。不多说,先上图。
左下角的图片即为测试结果显示页面。这里我主要是说明功能,界面实在是做的太难看,没有好好去调试,颜色对比也很次。以后会慢慢改进。这里先吐槽吐槽自己了
3、这里我们显示的是100个20*20的小方格。首先要对这个进行排序,总计100个测试点位,10行*10列的排布。
//排序方法
private void RowColRange()
{
Row = Row + 1;
if (Row > 10)
{
Row = 1;
Col = Col + 1;
}
}
4、以后每一次拍照取一次图片都会对图片进行处理,每次取一次图片就执行上面 方法RowColRange,这样小方格的位置就会有相应的坐标(Row,Col)这样就方便我们后面画图的功能实现了。图像处理的算法这里不赘述,根据面积判断OK还是NG,并给出相应的提醒显示。
5、下面就需要添加多线程了,进行绘图了。
private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
bool bGreen = false, bRed = false;
int tempOK, tempNG;
Graphics g = this.panel2.CreateGraphics();
Pen redPen = new Pen(Color.Red);
Pen blackPen = new Pen(Color.Black);
Brush redBrush = new SolidBrush(Color.Red);
Brush greenBrush = new SolidBrush(Color.Green);
for (int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
g.DrawRectangle(blackPen, 10 + 20 * i, 10 + 20 * j, 20, 20);
}
} //以上部分为初始化部分, 不用写入while循环之中
while (true)
{
tempOK = NumOK;
tempNG = NumNG;
if (bGreen == true && bRed == false)
{
g.FillRectangle(greenBrush, 11 + 20 * (Row - 1), 11 + 20 * Col, 19, 19);
}
if (bRed==true && bGreen==false)
{
g.FillRectangle(redBrush, 11 + 20 * (Row-1), 11 + 20 * Col, 19, 19);
}
Thread.Sleep(200);
if(tempNG!=NumNG)
{
bRed = true;
bGreen = false;
}
if(tempOK!=NumOK)
{
bGreen = true;
bRed = false;
}
}
}
}
在这里,我们使用的是矩形区域的填充,这里我特意将填充的面积设置为19个像素,因为这样可以刚好把黑色的边线显示出来。这里我使用的是不断的判断NG或者OK的数据有没有变化,来决定绘制什么颜色。个人觉得这个算法写的太low了,还需进一步改进。
6、另外需要注意的是,background后台程序如果在系统一加载的时候就运行,可能会出现调试问题,这个时候,的解决办法可以将background的启动设置为当相机已经连接OK的时候,再启动这个后天程序,这样系统就不会崩溃。
具体原因还在摸索之中。
7、另外系统还会出现一些系统加载故障,界面显示问题,如图:
以上问题后续将会持续解决并更新blog,