你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 跟高手学编程
VC++.NET图形编程--绘K线图和条形图(四)
 
⒌ 绘坐标刻度及其标记

K线图、条形图纵坐标、横坐标刻度及标记如图4所示。

 


4  坐标刻度及其标记

K线图纵坐标刻度及其标记

K线图纵坐标表示个股价格(指数值)。K线图外框上边缘表示最高价的最大值,下边缘表示最低价的最小值。

K线图纵坐标刻度线时,应该先计算刻度之间高度:

刻度之间高度=K线图外框的高度/刻度数

K线图纵坐标刻度线标记时,应该先计算刻度之间价格(指数值)的差值:

刻度之间价格(指数值)的差值=(最高价的最大值-最低价的最小值)/刻度数

代码如下:

// 从记录中找到最高价的最大值。

DataView^ viewTemp = table->DefaultView;

viewTemp->Sort = "最高价 DESC";    // 对最高价从最高值到最低值排序。

float maxPrice=0.0F;

if (viewTemp->Count > 0)    

{ 

    maxPrice = Convert::ToSingle(viewTemp[0]["最高价"]); // 最高价的最大值。

}

// 从记录中找到最低价的最小值。

viewTemp->Sort = "最低价 ASC";    // 对最低价从最低值到最高值排序。

float minPrice=0.0F;

if (viewTemp->Count > 0)

{ 

    minPrice = Convert::ToSingle(viewTemp[0]["最低价"]); //最低价的最小值。

}

 

// K线图纵坐标刻度线及其标记。

float fp_m=0.85F;    // 标记字号与标题字号的比例。

System::Drawing::Pen^ sclPen =

gcnew System::Drawing::Pen(System::

    Drawing::Color::LightGray);    // 设置画笔。

array<Single>^temp = {4.0F,2.0F};  /*在实数数组中指定虚线中

                            交替出现的短划线和空白区域的长度。 */

sclPen->DashPattern=temp;    // 设置画笔的虚线模式。

System::Drawing::Font^ sclFont =

    gcnew System::Drawing::Font("Arial",fn*fp_m,GraphicsUnit::Pixel);  // 设置字体。

int yNum=4;  // 设置纵坐标刻度数。

int j=1;      // 纵坐标刻度记数。

float yh =rgnk_h/yNum;    // 刻度之间的高度。

float yd =(maxPrice- minPrice)/yNum;    // 刻度之间个股价格(指数值)的差值。

while (j<=yNum-1)

{

    formGraphics->DrawLine(sclPen,rgnk_x, rgnk_y+yh*j,

    rgnk_x+rgnk_w, rgnk_y+yh*j);    // 画纵坐标刻度线。

    Decimal yscl= Decimal(maxPrice-yd*j);    /* 转换刻度线标记值为Decimal类型,

                             以便使用Round方法将标记值舍入到2位小数。*/

    formGraphics->DrawString(Decimal::Round(yscl,2).ToString(),

    sclFont, ttlBrush ,rgnk_x+rgnk_w, rgnk_y+yh*j);    // 画纵坐标标记。

    j++;

}

formGraphics->DrawString( maxPrice.ToString(),

sclFont, ttlBrush ,rgnk_x+rgnk_w, rgnk_y);    /* 在矩形框上边沿右端标

                                       记最高价的最大值。*/

formGraphics->DrawString( minPrice.ToString(),

sclFont, ttlBrush ,rgnk_x+rgnk_w, rgnk_y+rgnk_h);  /* 在矩形框下边沿右端标

                                           记最低价的最小值。*/

绘条形图纵坐标刻度及其标记

条形图纵坐标表示个股(指数)的成交量。条形图外框上边缘表示成交量的最大值,下边缘表示0

画条形图纵坐标刻度线时,应该先计算刻度之间高度:

刻度之间高度=条形图外框的高度/刻度数

画条形图纵坐标刻度线标记时,应该先计算刻度之间成交量的差值:

刻度之间成交量的差值=成交量的最大值/刻度数

代码如下:

// 从记录中找到成交量的最大值。

viewTemp->Sort = "成交量 ASC";    // 对成交量从最低值到最高值排序。

int maxQuantity=0;

if (viewTemp->Count > 0)

{ 

    maxQuantity = Convert::ToInt32(viewTemp[viewTemp->

        Count-1]["成交量"]); //成交量的最大值。

}

 

// 画条形图纵坐标刻度线及其标记。

yNum=4;  // 设置纵坐标刻度数。

j=1;      // 纵坐标刻度记数。

yh =rgnb_h/yNum;        // 刻度之间的高度。

yd =maxQuantity/yNum;    // 刻度之间成交量的差值。

while (j<=yNum-1)

{

    formGraphics->DrawLine(sclPen,rgnk_x, rgnb_y+yh*j,

        rgnk_x+rgnk_w, rgnb_y+yh*j);    // 画纵坐标刻度线。

    Decimal yscl= Decimal(maxQuantity-yd*j);    /* 转换刻度线标记值为Decimal类型,以便使用Round方法将标记值舍入到个位。*/

    formGraphics->DrawString(Decimal::Round(yscl,0).ToString(),

    sclFont, ttlBrush ,rgnk_x+rgnk_w, rgnb_y+yh*j);    // 画纵坐标标记。

    j++;

}

 formGraphics->DrawString( maxQuantity.ToString(),

    sclFont, ttlBrush ,rgnk_x+rgnk_w, rgnb_y);    /* 在矩形框上边沿右端标

                                                       记成交量的最大值。*/

绘横坐标刻度及其标记

因为股价(指数)、成交量都是按时间统计的,表示股价(指数)的K线图、表示成交量的条形图的横坐都表示时间,又由于K线图、条形图外框左上角的横坐标相同,宽度也相同,所以K线图、条形图的横坐标刻度及其标记只画一次,统一画在条形图外框的下方。

代码如下:

// 画横坐标刻度线及其标记。

float ksp=0.6F;    // 设置K线间空白宽度占K线实体宽度的比例。

float k_w=rgnk_w/(dayCount+ksp*(dayCount-1));    // 计算K线实体宽度。

float ksw=k_w*ksp;    // 计算K线间空白宽度。

float xNum=10;    // 设置横坐标刻度(日期)间隔。

float kx_x;    // 横坐标刻度线的横坐标。       

int i=0;        // 数据表记录号。

SizeF sxSize = formGraphics->MeasureString(

    "yy-mm-dd", sclFont);     // 横坐标刻度(日期)标记将采用“y y-mm-dd”格式。

float sxWidth= sxSize.Width;       // 获取横坐标标记(像素个数)   

while (i<dayCount)

{

    kx_x=int(rgnk_x+(k_w+ksw)*i)+int(k_w/2);

    if (i!=0 && i!=dayCount-1)

    {

        if ( float(i/xNum)==float(int(i/xNum)) )

        {

            formGraphics->DrawLine(sclPen,kx_x,

                rgnk_y,kx_x,rgnk_y+rgnk_h);     // K线图横坐标刻度线。

            formGraphics->DrawLine(sclPen,kx_x,

                rgnb_y,kx_x,rgnb_y+rgnb_h);     // 画条形图横坐标刻度线。

                             formGraphics->DrawString(table->Rows[i][0]->ToString()->Substring(2, 8),

                sclFont,ttlBrush ,kx_x-sxWidth/2,

                rgnb_y+rgnb_h);    // 画横坐标标记。

        }

    }

    else

    {

        formGraphics->DrawString(table->Rows[0][0]->ToString()->Substring(2, 8),

            sclFont,ttlBrush ,kx_x-sxWidth/2,

            rgnb_y+rgnb_h);    // 画起始横坐标标记。

    }

    i++;

}

  推荐精品文章

·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