⒋绘图
遵循面向对象的普遍编程方法,处理图形包括两个步骤:
⑴ 创建 Graphics 对象。
⑵ 使用 Graphics 对象绘制线条、形状、文本或显示与操作图像。
本讲主要是绘制K线图和条形图,而这两种图形是由线条、矩形和文本组成的。下面着重讲解线条、空心矩形、实心矩形和文本的绘制方法。
(1)绘制线条
绘制线条调用Graphics 对象的DrawLine方法,顺序传入5 个参数:画笔(Pen)、线条左上角横坐标、纵坐标、右下角横坐标和纵坐标。
例如要从点(0,0)到(50,100)画一条线段,代码如下:
System::Drawing::Pen^ myPen =
gcnew System::Drawing::Pen(System::Drawing::Color::Red);
System::Drawing::Graphics^ formGraphics;
formGraphics = this->CreateGraphics();
formGraphics->DrawLine(myPen, 0, 0, 50, 100);
delete myPen;
delete formGraphics;
(2)绘制空心矩形
绘制空心矩形调用Graphics 对象的DrawRectangle方法,顺序传入两个参数:画笔和Rectangle结构。
Rectangle结构是GDI+ 提供的用于组织矩形数据的一种数据结构。它存储一组整数,共四个,表示一个矩形的位置和大小。Rectangle结构要求4个int类型数据,依次表示:矩形左上角横坐标、纵坐标、矩形的宽度和高度。
例如要画一个左上角顶点为(10,20),宽度为200,高度300的空心矩形,代码如下:
private:
void DrawRectangle()
{
System::Drawing::Pen^ myPen =
gcnew System::Drawing::Pen(System::Drawing::Color::Red);
System::Drawing::Graphics^ formGraphics;
formGraphics = this->CreateGraphics();
formGraphics->DrawRectangle(myPen, Rectangle(10, 20, 200, 300));
delete myPen;
delete formGraphics;
}
(3)绘制实心矩形
绘制实心矩形调用Graphics 对象的FillRectangle方法,顺序传入两个参数:实心画笔(SolidBrush)和Rectangle结构。
例如要画一个左上角顶点为(10,20),宽度为200,高度300的实心矩形,代码如下:
System::Drawing::SolidBrush^ myBrush =
gcnew System::Drawing::SolidBrush(System::Drawing::Color::Red);
System::Drawing::Graphics^ formGraphics;
formGraphics = this->CreateGraphics();
formGraphics->FillRectangle(myBrush, Rectangle(10, 20, 200, 300));
delete myBrush;
delete formGraphics;
(4)绘制文本
可以调用Graphics 对象的DrawString方法在窗体上绘制文本。
DrawString方法提供了一组重载,选用其中一种Graphics.DrawString (String, Font, Brush, Single, Single)。它在指定位置并且用指定的 Brush 和 Font 对象绘制指定的文本字符串,参数说明如下:
第一个参数是要绘制的文本字符串。
第二参数定义字符串的文本字体。
第三参数确定所绘制文本的画笔(颜色和纹理)。
第四参数确定所绘制文本的左上角的 x 坐标。
第五参数确定所绘制文本的左上角的 y 坐标。
例如绘制文本“样板文本”、字体Arial(16pt)、使用实心黑色画笔、文本左上角的 x 坐标为150、y 坐标为 50的代码如下:
public:
void DrawString()
{
System::Drawing::Graphics^ formGraphics = this->CreateGraphics();
String^ drawString = "样板文本";
System::Drawing::Font^ drawFont =
gcnew System::Drawing::Font("Arial", 16);
System::Drawing::SolidBrush^ drawBrush = gcnew
System::Drawing::SolidBrush(System::Drawing::Color::Black);
float x = 150.0F;
float y = 50.0F;
System::Drawing::StringFormat^ drawFormat =
gcnew System::Drawing::StringFormat();
formGraphics->DrawString(drawString, drawFont, drawBrush, x, y);
delete drawFont;
delete drawBrush;
delete formGraphics;
}
要注意:不能在 Load 事件处理程序中调用以上绘制图形或文本的方法。同时,如果已调整该窗体的大小或者其他窗体遮蔽了该窗体,也不会重绘所绘制的内容。这是因为当窗体加载或者窗体(控件)重绘时,Graphics对象就被清空了。若要自动重绘内容,应该重写 Paint 事件处理程序。
三、绘图
本节结合实例详细讲解图形编程方法。绘图数据取自数据库数据表StockList,其中开盘价、收盘价、最高价和最低价用于绘K线图,成交量用于绘条形图,日期用于确定两者的横坐标。
⒈ 准备
在绘图之前,需要作两方面准备工作:一是准备界面——在实例程序中添加用来承载图形的窗体或控件;二是准备数据——在窗体中添加一个方法用于从数据库取出绘图所需的数据。
⑴ 准备界面
前面提到过,不能在 Load 事件处理程序中调用画线条或实心矩形的方法。但是,我们希望在承载图形的窗体加载时就将图形显示出来。
可以在实例程序中添加一个窗体,再在窗体上添加一个PictureBox控件。在PictureBox控件的Paint事件处理程序中,用 PaintEventArgse创建一个Graphics对象并用这个对象画图。然后,将PictureBox控件的Paint事件连接到事件的处理器方法,并将PictureBox控件附加到窗体。这样,在窗体加载时图形也显示出来,实现了自动重绘。
为窗体或PictureBox控件设置以下属性:
1)窗体的名称为“DrawingForm”。
2)窗体的Text属性为“绘图”。
3)保持PictureBox控件的Name属性的默认值“pictureBox1”不变。
4)设置PictureBox 控件的Dock属性为“Fill”、BackColor属性为“White”。
5)适当调整窗体的大小。
|