大三的这前半个学期了,又遇上了这个精通(滑稽) Delphi的老师,人还挺好的其实。
关于他对分辨率的吐槽呀,对Delphi的赞美啊,都是非常幽默的。另外我倒是很欣赏他对他的笔记本的保养【dell i7 920xm的工作站吧估计】。
好了,接下来他上课,基本上就是敲代码(实践)。为了迎合我们专业没学过Pascal的条件,他决定用c++ builder 4【后来才知道的,
实在是有点老了】。之前的我确实是费了很多劲,花了很多时间才找到的相关的参考资料。
首先,一切的绘画都基于画布【Canvas】之上,我们操作的是Canvas->Pixels[x][y],其中x,y,就是坐标,单位是px。
另外,由于直接操作显示中的画布会导致重复刷新,效率很低,我们可以建立TBitmap【内存里】,在TBitmap上绘图,然后用
CopyRect复制到要显示的画布上即可【新建时,注意指定TBitmap尺寸】。
比如,在窗口上描一个蓝色的正方形:
for(int x = 0;x < 100;x++) for(int y = 0;y < 100;y++) Form1->Canvas->Pixels[x][y] = clBlue;
下面给出一个比较简单的直线绘制函数。
void DrawLine(TCanvas *c, int x1, int y1 , int x2 , int y2); void __fastcall TForm1::Button1Click(TObject *Sender) { bmp = new Graphics::TBitmap(); bmp->Width = 202; bmp->Height = 202; randomize(); SetTime(); for(int i = 0; i < 20 ; i++) { DrawLine(bmp,1,1,201,10.6 * i - random(2)); DrawLine(bmp,1,1,10.6 * i - random(2),201); } Form1->Canvas->CopyRect(Rect(0,0,201,201),bmp->Canvas,Rect(1,1,201,201)); } void DrawLine( TCanvas *c,int x1, int y1 , int x2 , int y2) { float k = 0; if(x2 != x1) k = ( y2 - y1 ) * 1.0 / ( x2 - x1); //draw if(k > 1) for(int i = 1; i <= y2 ; i++ ) c->Pixels[(int)((i - y1) / k) - x1][i] = clBlack; else for(int i = 1; i <= x2 ; i++ ) c->Pixels[i][(int)((i - x1) * k) + y1] = clBlue; }