⒋ 绘报表
(1) 表头
表头如图3所示。
绘表头时,除了设置表头的坐标、字体、字号、画笔等参数外,还要测表头的高度,以便定位下一行的纵坐标。绘表头使用了带有RectangleF参数的DrawString方法的重载。
表头中的竖线暂时没有画出,待整个报表细节画完以后再一次画出来。

图3 报表细节——表头
为绘表头,在Table方法中添加以下代码:
// 画报表细节——表头。
p_h=p_h+rs;
float vy1=p_h; // 竖线起始点y 坐标。
g->DrawLine(penTab,x[0], p_h,
x[0]+p_width, p_h); // 画横线。
p_h=p_h+rs;
System::Drawing::StringFormat^ tabFormat =
gcnew System::Drawing::StringFormat(StringFormatFlags::NoClip);
fp_q=0.8F; // 字号放大比例。
Rectangle rect = Rectangle(Point(x[0],p_h),System::Drawing::Size( rect_w[0],rect_h ));
g->DrawString("日期", ttlFont, ttlBrush, rect, tabFormat); // 画第一列标头。
rect = Rectangle(Point(x[1],p_h),System::Drawing::Size( rect_w[1],rect_h ));
g->DrawString("开盘价", ttlFont, ttlBrush, rect, tabFormat); // 画第二列标头。
rect = Rectangle(Point(x[2],p_h),System::Drawing::Size( rect_w[2],rect_h ));
g->DrawString("收盘价", ttlFont, ttlBrush, rect, tabFormat); // 画第三列标头。
rect = Rectangle(Point(x[3],p_h),System::Drawing::Size( rect_w[3],rect_h ));
g->DrawString("成交量", ttlFont, ttlBrush, rect, tabFormat); // 画第四列标头。
rect = Rectangle(Point(x[4],p_h),System::Drawing::Size( rect_w[4],rect_h ));
g->DrawString("最高价", ttlFont, ttlBrush, rect, tabFormat); // 画第五列标头。
rect = Rectangle(Point(x[5],p_h),System::Drawing::Size( rect_w[5],rect_h ));
g->DrawString("最低价", ttlFont, ttlBrush, rect, tabFormat); // 画第六列标头。
float r_h=g->MeasureString("测试", ttlFont,System::Drawing::Size( rect_w[5],rect_h ),tabFormat).Height;
p_h=p_h+ r_h;
g->DrawLine(penTab,x[0], p_h,
x[0]+p_width, p_h); // 画横线。
(2)数据
绘数据使用带有RectangleF参数的DrawString方法的重载。
可能有的列字符数太多,显示输出时会被折断成多行输出。为了定位下一记录输出的纵坐标,需要比较得出各列的最大高度。尽管实例程序不会有折断成多行输出的情况,为不失一般性,编码时仍要考虑这一问题。
绘完报表细节以后,接着绘报表细节的竖线。
最后,根据整个报表的高度、宽度设置窗体滚动条的最小大小,以便在报表的高度、宽度超过窗口的实际大小时自动出现滚动条。
为绘数据,在Table方法中添加以下代码:
// 画报表细节——数据。
int i=0; // 数据表记录号。
while (i<dayCount)
{
p_h=p_h+rs;
r_h=0;
rect = Rectangle(Point(x[0],p_h),System::Drawing::Size( rect_w[0],rect_h ));
g->DrawString(table->Rows[i][0]->ToString()->Trim() , ttlFont, ttlBrush, rect, tabFormat); // 画日期。
if (g->MeasureString(table->Rows[i][0]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[0],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][0]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[0],rect_h ),tabFormat).Height;
}
rect = Rectangle(Point(x[1],p_h),System::Drawing::Size( rect_w[1],rect_h ));
g->DrawString(table->Rows[i][1]->ToString()->Trim(), ttlFont, ttlBrush, rect, tabFormat); // 画开盘价。
if (g->MeasureString(table->Rows[i][1]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[1],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][1]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[1],rect_h ),tabFormat).Height;
}
rect = Rectangle(Point(x[2],p_h),System::Drawing::Size( rect_w[2],rect_h ));
g->DrawString(table->Rows[i][2]->ToString()->Trim(), ttlFont, ttlBrush, rect, tabFormat); // 画收盘价。
if (g->MeasureString(table->Rows[i][2]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[2],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][2]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[2],rect_h ),tabFormat).Height;
}
rect = Rectangle(Point(x[3],p_h),System::Drawing::Size( rect_w[3],rect_h ));
g->DrawString(table->Rows[i][3]->ToString()->Trim(), ttlFont, ttlBrush, rect, tabFormat); // 画成交量。
if (g->MeasureString(table->Rows[i][3]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[3],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][3]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[3],rect_h ),tabFormat).Height;
}
rect = Rectangle(Point(x[4],p_h),System::Drawing::Size( rect_w[4],rect_h ));
g->DrawString(table->Rows[i][4]->ToString()->Trim(), ttlFont, ttlBrush, rect, tabFormat); // 画最高价。
if (g->MeasureString(table->Rows[i][4]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[4],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][4]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[4],rect_h ),tabFormat).Height;
}
rect = Rectangle(Point(x[5],p_h),System::Drawing::Size( rect_w[5],rect_h ));
g->DrawString(table->Rows[i][5]->ToString()->Trim(), ttlFont, ttlBrush, rect, tabFormat); // 画最低价。
if (g->MeasureString(table->Rows[i][5]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[5],rect_h ),tabFormat).Height>r_h)
{
r_h=g->MeasureString(table->Rows[i][50]->ToString()->Trim(), ttlFont,System::Drawing::Size( rect_w[5],rect_h ),tabFormat).Height;
}
p_h=p_h+ r_h;
g->DrawLine(penTab,x[0], p_h,
x[0]+p_width, p_h); // 画横线。
i++;
}
float vx1=x[0]+cs+width_Date; // 竖线起始点x 坐标。
g->DrawLine(penTab,vx1, vy1,
vx1, p_h); // 画报表细节左起第一条竖线。
vx1=vx1+cs+width_Price+cs;
g->DrawLine(penTab,vx1, vy1,
vx1, p_h); // 画报表细节左起第二条竖线。
vx1=vx1+cs+width_Price+cs;
g->DrawLine(penTab,vx1, vy1,
vx1, p_h); // 画报表细节左起第三条竖线。
vx1=vx1+cs+width_Quantity;
g->DrawLine(penTab,vx1, vy1,
vx1, p_h); // 画报表细节左起第四条竖线。
vx1=vx1+cs+width_Price+cs;
g->DrawLine(penTab,vx1, vy1,
vx1, p_h); // 画报表细节左起第五条竖线。
this->AutoScrollMinSize = System::Drawing::Size( p_left*2+p_width, p_h+p_top ); // 设置窗体滚动条的最小大小。
|