PaintBox的显示图片问题 参考这个http://pan.baidu.com/s/1sjo83Dj 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因為 PaintBox1 的 Canvas 並不能夠永遠安全的顯示...因為只要被覆蓋就會消失...通常窗口只要有更新事件便需要重繪才能顯示出來...但...這個問題並不會發生在 Image1 上......Step 1: 改變作法...先將 PaintBox1 除去...再把 Image1 放在 ScrollBox1 裡.Step 2: procedure TForm1.FormCreate(Sender: TObject);begin Image1.AutoSize := True; Image1.Left := 0; Image1.Top := 0; ScrollBox1.HorzScrollBar.Tracking := True; ScrollBox1.VertScrollBar.Tracking := True;end;Step 3:procedure TForm1.Button4Click(Sender: TObject);begin if OpenPictureDialog1.Execute then if FileExists(OpenPictureDialog1.FileName) then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName) else raise Exception.Create('圖檔不存在.');end; LZ只是搞不清楚paintbox要绘制的rect,搞清楚就可以了,paintbox一样的。用image有image的好处,paintbox有paintbox的好处,一般需要做大量绘图操作的用paintbox效率更高。btw~~ LS夜猫子跟俺堪有一比啊 實務上...TImage 內部的重繪機制已處理...所以可以完全取代 TPaintBox 而更方便! timage 侧重于显示一个图像,内部维护一个TPicturetpaintbox 侧重于绘图,故提供了OnPaint消息,对于绘图操作更灵活高效当然,各自的优劣取决于需求的定位,如果仅仅是显示一个图像而没有其他更多的工作,那image更适合。如果还要对一个图形进行各种处理,那么piantbox是更好的选择这两天冷空气南下,受不了了,都感觉钻被窝去吧 同意樓上 sololie 大牛所說的! 組件與控件的使用得依目的情況選定......sololie 住哪呢? 我這邊也感受到了! 從前天晚上開始...白天氣候涼爽宜人...這個時候我穿了大衣加厚毛襪哩~ 晚安! 谢谢,可以完整的显示了,但是为什么还是操作不了,超出了可视范围外的点?是不是因为当OnPaint时是复制原图的,并没有对刚操作的点进行复制?比如,这个Scrollbox1的长高是:500*300,但图是600*400然后,当加载这个图后,出现了滚动条,之后用上面的代码是可以正常的滚动并查看了.但是,当我进行操作:pb1.Canvas.Pixels[590,50]:=RGB(0,0,0);之后滚动条滚动过去查看时,却没看到那个操作的点?这个有没解决方法的? 以樓主的例子...關鍵是使用 TImage.Canvas 當畫布...而不是使用 TPaintBox.Canvas 當畫布...因為 TImage 裡有一個內存位圖與重繪更新機制...... 因为要进行大量的绘图计算,而且images有的功能实现不了,还有办法吗 原因还是你根本没看懂这个代码的原理假如有一个原图BMP,width=500,height=300,将pb1的高宽指定为这个BMP的高宽pb1.width:=500, pb1.height:=300ScrollBox1.width:=300, ScrollBox1.height:=200pb1放在上面这个滚动盒里滚动条移动时,并不是移动pb1的位置,pb1实际上始终没有动过滚动条移动时,根据这个移动的量来计算要显示的区域,然后从BMP中把要显示的区域拷贝到pb1中pb1只有在ScrollBox1区域中的部分才有(bitblt上去的)像素,不被显示的其他区域的像素不存在于pb1中所以你应该对这个原图BMP.canvas 进行操作 俺这样说有点不太准确,不过大致意思就是这样了。反正就是没有显示在PAINTOBOX中的内容就在原图中处理好后再bitblt显拷到PAINTBOX中 另外推荐一个组件 Graphics32,非常不错 哇~ 又當夜貓子啦~ 樓主的問題...我昨天實際模擬過很容易實現呀~ 實在不明白 TImage 有何不能進行大量繪圖的? 只要把 TImage.Canvas 當幕後繪製再複製顯示不行嗎? 如果仅仅是显示图片,就使用 TImage 就可以了,比较省事,如果还有其它的计算,或要同时绘制其它图形,就使用 TPaintBox。TPaintBox 的执行速度快,节省内存,但编程麻烦,需要把绘图代码写到 OnPaint 事件中,因为在窗口滚动时,无效区会自动清除。如果是更复杂的绘图,则干脆写个VCL控件,从 WinControl 继承,这样就更灵活了。 后缀名为DB为SYBASE数据库文件,能用DELPHI打开吗? 想通过指针偏移获取静态数组内容,请问哪里错了? 关于获取html表单提交按钮的问题 DBGRIDEH的列问题 10001,原来这才是两星 messagebox()的使用 给我电子书,就给你分。。。 IPersist应该包含那个单元? 66分 征 sql server 数据库 程序打包技术 客户端是不是一定要用TclientDataset,直接用TadoDataset修改服务器地址不行吗?这两者有什么区别,请高手帮忙。 Delphi调用C++的DLL出现乱码 如何把oracle中一张表的数据写入Access中的表
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1.AutoSize := True;
Image1.Left := 0;
Image1.Top := 0;
ScrollBox1.HorzScrollBar.Tracking := True;
ScrollBox1.VertScrollBar.Tracking := True;
end;Step 3:
procedure TForm1.Button4Click(Sender: TObject);
begin
if OpenPictureDialog1.Execute then
if FileExists(OpenPictureDialog1.FileName) then
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName)
else
raise Exception.Create('圖檔不存在.');
end;
用image有image的好处,paintbox有paintbox的好处,一般需要做大量绘图操作的用paintbox效率更高。btw~~ LS夜猫子跟俺堪有一比啊
tpaintbox 侧重于绘图,故提供了OnPaint消息,对于绘图操作更灵活高效
当然,各自的优劣取决于需求的定位,如果仅仅是显示一个图像而没有其他更多的工作,那image更适合。
如果还要对一个图形进行各种处理,那么piantbox是更好的选择这两天冷空气南下,受不了了,都感觉钻被窝去吧
谢谢,
可以完整的显示了,但是为什么还是操作不了,超出了可视范围外的点?
是不是因为当OnPaint时是复制原图的,并没有对刚操作的点进行复制?比如,这个Scrollbox1的长高是:500*300,但图是600*400
然后,当加载这个图后,出现了滚动条,之后用上面的代码是可以正常的滚动并查看了.但是,当我进行操作:
pb1.Canvas.Pixels[590,50]:=RGB(0,0,0);之后滚动条滚动过去查看时,却没看到那个操作的点?这个有没解决方法的?
pb1.width:=500, pb1.height:=300ScrollBox1.width:=300, ScrollBox1.height:=200
pb1放在上面这个滚动盒里
滚动条移动时,并不是移动pb1的位置,pb1实际上始终没有动过
滚动条移动时,根据这个移动的量来计算要显示的区域,然后从BMP中把要显示的区域拷贝到pb1中
pb1只有在ScrollBox1区域中的部分才有(bitblt上去的)像素,不被显示的其他区域的像素不存在于pb1中
所以你应该对这个原图BMP.canvas 进行操作
如果还有其它的计算,或要同时绘制其它图形,就使用 TPaintBox。
TPaintBox 的执行速度快,节省内存,但编程麻烦,需要把绘图代码写到 OnPaint 事件中,因为在窗口滚动时,无效区会自动清除。
如果是更复杂的绘图,则干脆写个VCL控件,从 WinControl 继承,这样就更灵活了。