你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 跟高手学编程
VC++.NET报表编程——绘制股价表(三)
 
绘报表

(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 );  // 设置窗体滚动条的最小大小。
  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089