关于坐标转换的问题 我用API将Delphi默认的坐标系,转成自己的坐标系,并画图,完全符合自己的要求。但是在紧跟着用到的MoveTo, LineTo时,还是按照其默认的坐标系作图,很是奇怪,请问是何道理? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int SetMapMode( HDC hdc, // handle of device context int fnMapMode // new mapping mode );HDC指定为Image1.canvas.handlefnMapMode根据你的要求指定一个模式然后你用Image1。.canvas...来画图就是你新设的映射模式的坐标啦, 这个我都做了。事实上是先画的坐标系,而且是完全按照我自己定义的坐标系实现的。但是我想一个一个点在坐标系中画一条曲线,用lineto时,他又还原成在默认的坐标系下作图,就是原点又回到了左上角(我将原点定义为image中间的一点)。 你在坐标转换里也要把LineTo的坐标值转换一下,当然是在自己屏幕下画图了Canvas画图不是以你自己画的坐标系为坐标,你要转换 没这个道理吧,楼上所说的在lineTo中也要转换,怎么操作? 好像和API的调用有关。 我在不同的位置试验这个lineto的用法,发现在这两个之间有另外的API调用,将lineto移到这个函数之前,就可以了。不知道是不是这个原因,这又是什么道理呢?乖乖,还在疑惑中... LineTo不是直接就将当前点设置为终点了吗? 你的坐标系和他的不同,所以你必须使用MoveTo移动到你的坐标系对应的点去。GDI默认情况下一定使用屏幕坐标的,因此你必须转换。 我试过了,还是不行。就像我上面提到的,我在两次作图中间,使用了一个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; ...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); delphi activex dll如何调用打印机 关于ADO???? 【JAVA视频教学】 部分下载 ★★★ 请问如何获取IDTCPSERVER的端口? 嘿嘿!!征求男孩考验女孩的最多种方案!!嘿嘿!! 急!!!菜鸟问题!!! 高手请进,关于CELL控件! 谁有办法?在编辑框中隐藏多条选中的文本,再逐一恢复显示?! 高手关注! TDateTimePicker中,如何返回 '2000-02-02' 这样格式的字符串?如何得到值啊?另,能否同时输入时间? 小菜问题——如何在窗口最大化时让其中的控件也跟着最大化呢?如dbgrid,stringgrid等 在调用c++制作的dll时如何传入回调函数
int fnMapMode // new mapping mode
);
HDC指定为Image1.canvas.handle
fnMapMode根据你的要求指定一个模式然后你用Image1。.canvas...来画图就是你新设的映射模式的坐标啦,
事实上是先画的坐标系,而且是完全按照我自己定义的坐标系实现的。
但是我想一个一个点在坐标系中画一条曲线,用lineto时,他又还原成在默认的坐标系下作图,就是原点又回到了左上角(我将原点定义为image中间的一点)。
Canvas画图不是以你自己画的坐标系为坐标,你要转换
不知道是不是这个原因,这又是什么道理呢?
乖乖,还在疑惑中...
GDI默认情况下一定使用屏幕坐标的,因此你必须转换。
timeNow: DWord;timeNow:= GetTickCount;
repeat
Application.messageprocess;
until GetTickCount > timeNow + 120000;
imgTime.Canvas.LineTo(1000, 1000);
//以上的都可以实现 LongDelay(nDelayTime);
//问题就出在此,此处的API函数调用造成后面作图的坐标系的错误
//开始测试
//imgTime.Canvas.MoveTo(0, 0);
//imgTime.Canvas.LineTo(6000, 1000);