在TImage控件上做画

原创 2002年09月24日 09:31:00

                                    在TImage控件上做画
                                    翻译:今天能看见山

    TImage类提供了一个Canvas属性以使你能在image的内容上绘图。image的改变将会成为这个image的一部分保存下来。如果你把改变过的image拷贝到剪切板上或者将这个image保存为文件,你的改变将会完全成为这个image的一部分。这里的一小段程序代码用来在一个image上画一个箭头。

  const TPoint Arrow1[] = { {80,105} , {106,66}, {80,87},{94,98}};
  Image1->Canvas->Pen->Color = clBlue;
  Image1->Canvas->Pen->Width = 3;
  Image1->Canvas->MoveTo(Arrow1[0].x,Arrow1[0].y);
  Image1->Canvas->LineTo(Arrow1[1].x,Arrow1[1].y);
  Image1->Canvas->MoveTo(Arrow1[0].x,Arrow1[0].y);
  Image1->Canvas->LineTo(Arrow1[2].x,Arrow1[2].y);
  Image1->Canvas->MoveTo(Arrow1[0].x,Arrow1[0].y);
  Image1->Canvas->LineTo(Arrow1[3].x,Arrow1[3].y);

注意:你只能在TImage控件的picture属性为空或者包含一个bitmap类型的图形的时候利用它的Canvas属性做画。如果它包含一个icon或者一个图元文件,则你不能利用它的Canvas做画。TIimage的只读方法GetCanvas证实了这样做的理由。

// 被转换成为C++代码的函数
TCanvas * TImage::GetCanvas()
{
    Graphics::TBitmap *Bitmap;

    if (Picture->Graphic == NULL)
    {
        Bitmap = new Graphics::TBitmap
        Bitmap->Width  = Width;
        Bitmap->Height = Height;

        // 为Graphic属性分配新的位图. 这个调用
        // TPicture的写方法SetGraphic. SetGraphic实现位图的分配,
        // 等同于调用 Picture->Graphic->Assign(Bitmap);
        Picture->Graphic = Bitmap;

        // 删除临时位图指针. 因为位图的分配已经结束了,
        // 位图的内容已经被保存在了Picture->Graphic里
        delete Bitmap;
    }

    if (/* Picture->Graphic 是一个TBitmap型的对象 */ )
        return Picture->Bitmap->Canvas;
    else
        throw EInvalidOperation( /* 抛出一个异常 */);
}

注意到,如果picture属性是空的,你在上面的绘画将建立一个新的Bitmap对象.如果一个位图已经被装载了,这时TImage::GetCanvas只是返回这个位图的Canvas属性.如果Picture里的是一个icon或者是一个图元文件,程序将抛出一个异常。

注意:TImage::GetCanvas工作的结果是,使用Image->Canvas和Image->Picture->Bitmap->Canvas并没有什么区别.
注意:Image控件在Canvas上画的图象的宽和高和这个位图的原始尺寸是一样的. 如果这个放到Image控件中的图象被拉伸了,则它的宽度和高度有可能同原始尺寸不一样.例如,在一个新窗体中放置一个Image控件.调整窗体尺寸为500x400象素.设置Image控件的对齐属性为alClient,并且装载上CHEMICAL.BMP这个BCB中自带的图片. 最后,将Stretch改为true以保证图片充满这个窗体.此时,Image1->Width将跟Form1->ClientWidth相等,但是Image1->Picture->Width 将是CHEMICAL.BMP的宽度(240).
注意:当你在一个image上做画的时候,尽量使用Windows标准颜色或者是已经存在于调色板中的颜色.
 

从0自学C#08--绘制曲线chart控件

chart控件的使用
  • tclxspy
  • tclxspy
  • 2016年03月07日 11:20
  • 4330

自定义控件之——心电图控件的绘制

自定义心电图绘制View
  • ITRoadofNoReturn
  • ITRoadofNoReturn
  • 2016年04月14日 23:15
  • 1709

基于.net平台的自定义绘制波形控件

VS自定义绘制波形控件,该控件具有拖拽坐标轴功能、放大缩小功能、鼠标移动坐标点功能...
  • wr18862121743
  • wr18862121743
  • 2017年03月19日 14:56
  • 145

一个C#三维绘图控件

一般的三维图形程序都使用C++开发,很少有使用C#的。并不是因为C++效率有多高,而是因为没有合适的C#图形控件使用。C#开发程序,只能用一个字来形容:爽!二个字:倍爽! 那能不能用C#开发三维程序...
  • u013068984
  • u013068984
  • 2014年04月07日 14:36
  • 4992

Android自定义控件View(一)自绘控件

虽然Android API给我们提供了众多控件View来使用,但是鉴于Android的开发性,自然少不了根据需求自定义控件View了。比如说QQ头像是圆形的,但是纵观整个Android控件也找不到一个...
  • feidu804677682
  • feidu804677682
  • 2015年05月28日 12:39
  • 8383

自画 CComboBox 控件注意事项

Office2000系列软件(Software)地工具栏顶都有1个字体选择组合框,它有三大特色,1就为具有扁平及鼠标热点地效果,二就为字体地样式在下拉列表框中直接可见,即用相应地字体来绘制字体名称,三...
  • objectively
  • objectively
  • 2013年07月21日 11:49
  • 945

自定义仪表盘控件(源码中已经改成了自己绘制表盘)

新的任务又来了,这次需要实现一个仪表盘的自定义控件,自定义控件一不常写就手生,这次又巩固下,并且学了一些新知识。https://developer.android.com/training/custo...
  • lqc1992
  • lqc1992
  • 2016年08月09日 13:34
  • 3136

ST_Curve --- 一个专业的曲线绘制控件

一:什么是ST_Curve?          ST_Curve是一个专业的曲线绘制控件,只要是xy坐标系的曲线,都可绘制,纵坐标只能显示为值,横坐标可以显示为值或者时间(如果...
  • Qsir
  • Qsir
  • 2018年01月09日 13:25
  • 42

Qt下利用QWT绘制波形图

最近做一个项目,需要在上位机上用波形显示下位机传来的
  • azhuty
  • azhuty
  • 2014年07月17日 22:04
  • 4353

大帅手把手教你做日历控件——WinForm窗体控件库和日历算法

WinForm窗体控件库和日历算法WinForm窗体控件库和日历算法 控件制作 算法先来看看效果图 图中展现的是一个日历自定义控件,其显示格里高利历、农历及节气。控件制作 创建一个窗体控件库项目...
  • enpterexpress
  • enpterexpress
  • 2015年11月23日 11:18
  • 6694
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在TImage控件上做画
举报原因:
原因补充:

(最多只允许输入30个字)