⒌ 绘坐标刻度及其标记
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++;
}
|