我用API将Delphi默认的坐标系,转成自己的坐标系,并画图,完全符合自己的要求。但是在紧跟着用到的MoveTo, LineTo时,还是按照其默认的坐标系作图,很是奇怪,请问是何道理?

解决方案 »

  1.   

    int SetMapMode(    HDC hdc, // handle of device context 
        int fnMapMode  // new mapping mode 
       );
    HDC指定为Image1.canvas.handle
    fnMapMode根据你的要求指定一个模式然后你用Image1。.canvas...来画图就是你新设的映射模式的坐标啦,
      

  2.   

    这个我都做了。
    事实上是先画的坐标系,而且是完全按照我自己定义的坐标系实现的。
    但是我想一个一个点在坐标系中画一条曲线,用lineto时,他又还原成在默认的坐标系下作图,就是原点又回到了左上角(我将原点定义为image中间的一点)。
      

  3.   

    你在坐标转换里也要把LineTo的坐标值转换一下,当然是在自己屏幕下画图了
    Canvas画图不是以你自己画的坐标系为坐标,你要转换
      

  4.   

    没这个道理吧,楼上所说的在lineTo中也要转换,怎么操作?
      

  5.   

    好像和API的调用有关。 我在不同的位置试验这个lineto的用法,发现在这两个之间有另外的API调用,将lineto移到这个函数之前,就可以了。
    不知道是不是这个原因,这又是什么道理呢?
    乖乖,还在疑惑中...
      

  6.   

    LineTo不是直接就将当前点设置为终点了吗?
      

  7.   

    你的坐标系和他的不同,所以你必须使用MoveTo移动到你的坐标系对应的点去。
    GDI默认情况下一定使用屏幕坐标的,因此你必须转换。
      

  8.   

    我试过了,还是不行。就像我上面提到的,我在两次作图中间,使用了一个GetTickCount函数来实现一定时间的延迟。在这个API之前我使用MoveTo(0,0),然后使用LineTo(100,100),可以达到预期的效果,但是在API之后,同样的语句,同样的顺序,就变成了从屏幕左上角向右下画出的一条线段。没有办法解释,所以我怀疑是不是在调用别的API之后,我做的坐标转换不起作用了。但是我在GetTickCount之后,再次实现左边转换,还是不行。PS。 除了调用GetTickCount之外,Delphi中还有没有实现计时功能的?我的调用如下:
    timeNow: DWord;timeNow:= GetTickCount;
    repeat
        Application.messageprocess;
    until GetTickCount > timeNow + 120000;
      

  9.   

    ...DrawCoor(imgTime, myCoor, '秒', 'A');    imgTime.Canvas.Ellipse(1,1,280,210);    imgTime.Canvas.MoveTo(0, 0);
        imgTime.Canvas.LineTo(1000, 1000);
        //以上的都可以实现    LongDelay(nDelayTime);
        //问题就出在此,此处的API函数调用造成后面作图的坐标系的错误
        //开始测试
        //imgTime.Canvas.MoveTo(0, 0);
        //imgTime.Canvas.LineTo(6000, 1000);