PaintBox的显示图片问题

雄牛 2014-02-10 11:42:01
PaintBox1放在一个ScrollBox1里,
为什么PaintBox在显示一个图片的时候,如果太大了,当移动滚动条时,超出的部份就显示不了?
而且也操作不了超出部份的像素点?

有没什么办法?我的加载图片代码如下:

procedure TMainForm.open1Click(Sender: TObject);
var
bm: TBitmap;
begin
if OpenPictureDialog1.Execute then
begin
bm := TBitmap.Create;
bm.LoadFromFile(OpenPictureDialog1.FileName);
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
PaintBox1.Canvas.CopyRect(Rect(PaintBox1.Left, PaintBox1.Top,
PaintBox1.Width, PaintBox1.Height), bm.Canvas,
Rect(0, 0, bm.Width, bm.Height));

end;
end;
...全文
452 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mggsaca 2014-02-26
  • 打赏
  • 举报
回复
如果仅仅是显示图片,就使用 TImage 就可以了,比较省事, 如果还有其它的计算,或要同时绘制其它图形,就使用 TPaintBox。 TPaintBox 的执行速度快,节省内存,但编程麻烦,需要把绘图代码写到 OnPaint 事件中,因为在窗口滚动时,无效区会自动清除。 如果是更复杂的绘图,则干脆写个VCL控件,从 WinControl 继承,这样就更灵活了。
sololie 2014-02-17
  • 打赏
  • 举报
回复
另外推荐一个组件 Graphics32,非常不错
sololie 2014-02-17
  • 打赏
  • 举报
回复
俺这样说有点不太准确,不过大致意思就是这样了。反正就是没有显示在PAINTOBOX中的内容就在原图中处理好后再bitblt显拷到PAINTBOX中
星際訪客 2014-02-17
  • 打赏
  • 举报
回复
引用 17 楼 sololie 的回复:
今晚有球赛,足总杯和意甲
呵~ 原來如此...晚安! 先睡覺去了~
sololie 2014-02-17
  • 打赏
  • 举报
回复
今晚有球赛,足总杯和意甲
星際訪客 2014-02-17
  • 打赏
  • 举报
回复
引用 15 楼 sololie 的回复:
另外推荐一个组件 Graphics32,非常不错
哇~ 又當夜貓子啦~ 樓主的問題...我昨天實際模擬過很容易實現呀~ 實在不明白 TImage 有何不能進行大量繪圖的? 只要把 TImage.Canvas 當幕後繪製再複製顯示不行嗎?
sololie 2014-02-16
  • 打赏
  • 举报
回复
原因还是你根本没看懂这个代码的原理 假如有一个原图BMP,width=500,height=300,将pb1的高宽指定为这个BMP的高宽 pb1.width:=500, pb1.height:=300 ScrollBox1.width:=300, ScrollBox1.height:=200 pb1放在上面这个滚动盒里 滚动条移动时,并不是移动pb1的位置,pb1实际上始终没有动过 滚动条移动时,根据这个移动的量来计算要显示的区域,然后从BMP中把要显示的区域拷贝到pb1中 pb1只有在ScrollBox1区域中的部分才有(bitblt上去的)像素,不被显示的其他区域的像素不存在于pb1中 所以你应该对这个原图BMP.canvas 进行操作
雄牛 2014-02-16
  • 打赏
  • 举报
回复
引用 11 楼 start8588 的回复:
以樓主的例子...關鍵是使用 TImage.Canvas 當畫布...而不是使用 TPaintBox.Canvas 當畫布...因為 TImage 裡有一個內存位圖與重繪更新機制......
因为要进行大量的绘图计算,而且images有的功能实现不了,还有办法吗
雄牛 2014-02-13
  • 打赏
  • 举报
回复
算了,我还是限制图片长宽吧.. 谢谢各位.
雄牛 2014-02-13
  • 打赏
  • 举报
回复
引用 1 楼 sololie 的回复:
参考这个 http://pan.baidu.com/s/1sjo83Dj
谢谢, 可以完整的显示了,但是为什么还是操作不了,超出了可视范围外的点? 是不是因为当OnPaint时是复制原图的,并没有对刚操作的点进行复制? 比如,这个Scrollbox1的长高是:500*300,但图是600*400 然后,当加载这个图后,出现了滚动条,之后用上面的代码是可以正常的滚动并查看了. 但是,当我进行操作: pb1.Canvas.Pixels[590,50]:=RGB(0,0,0); 之后滚动条滚动过去查看时,却没看到那个操作的点? 这个有没解决方法的?
星際訪客 2014-02-13
  • 打赏
  • 举报
回复
以樓主的例子...關鍵是使用 TImage.Canvas 當畫布...而不是使用 TPaintBox.Canvas 當畫布...因為 TImage 裡有一個內存位圖與重繪更新機制......
星際訪客 2014-02-11
  • 打赏
  • 举报
回复
同意樓上 sololie 大牛所說的! 組件與控件的使用得依目的情況選定...... sololie 住哪呢? 我這邊也感受到了! 從前天晚上開始...白天氣候涼爽宜人...這個時候我穿了大衣加厚毛襪哩~ 晚安!
sololie 2014-02-11
  • 打赏
  • 举报
回复
赶紧~~
sololie 2014-02-11
  • 打赏
  • 举报
回复
timage 侧重于显示一个图像,内部维护一个TPicture tpaintbox 侧重于绘图,故提供了OnPaint消息,对于绘图操作更灵活高效 当然,各自的优劣取决于需求的定位,如果仅仅是显示一个图像而没有其他更多的工作,那image更适合。 如果还要对一个图形进行各种处理,那么piantbox是更好的选择 这两天冷空气南下,受不了了,都感觉钻被窝去吧
星際訪客 2014-02-11
  • 打赏
  • 举报
回复
引用 3 楼 sololie 的回复:
LZ只是搞不清楚paintbox要绘制的rect,搞清楚就可以了,paintbox一样的。 用image有image的好处,paintbox有paintbox的好处,一般需要做大量绘图操作的用paintbox效率更高。 btw~~ LS夜猫子跟俺堪有一比啊
當夜貓子也不是我願意呀~ 經常為了搞案子把生理時鐘給弄亂了呀!
星際訪客 2014-02-11
  • 打赏
  • 举报
回复
實務上...TImage 內部的重繪機制已處理...所以可以完全取代 TPaintBox 而更方便!
sololie 2014-02-11
  • 打赏
  • 举报
回复
LZ只是搞不清楚paintbox要绘制的rect,搞清楚就可以了,paintbox一样的。 用image有image的好处,paintbox有paintbox的好处,一般需要做大量绘图操作的用paintbox效率更高。 btw~~ LS夜猫子跟俺堪有一比啊
星際訪客 2014-02-11
  • 打赏
  • 举报
回复
因為 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;
sololie 2014-02-11
  • 打赏
  • 举报
回复
ToolBar工具栏控件的使用 动态建立主菜单选项 窗口界面的动态分隔条 动态设置选项卡页面 在标题栏中自定义按钮 窗体开合窗帘效果 Windows XP界面效果 实现OutLook滚动工具栏效果 在下拉列表框中显示树形视图 自定义系统的About项 修改系统级菜单 实现透明窗体效果 爆破特技窗体 只允许建立一次子窗体的MDI程序 从外部DLL中调用子窗口 新颖的资源管理器界面 如何生成半圆形窗口 制作字幕滚动窗体 详解Canvas生成渐变色窗口背景 WINAPM风格磁化窗口 软件封面的图片显示制作 实现图片的任意角度旋转 奇妙的拼图游戏 使用PaintBox控件制作画图程序 使用DrawGrid控件制作五子棋 多彩的数据报表 按压缩比将BMP转换为JPG 16位真彩转换到256色 调整图片的RGB对比度 实现图像的灰度级处理效果 3种像素历遍方法的比较和实现 实现屏幕拷贝 实现图像漫游 4种幕布式图像显示技巧 盘旋法实现9种滤镜效果 图形朦胧叠合显示技巧 给MDI主窗体增加背景 实现图像的淡入淡出显示 多媒体播放器 播放AVI文件 根据客户端IP地址获取计算机名 实现多线程IP和DomainName相互转换 Windows2000下的Popup发送功能 如何实现Ping操作 实现多线程共享探测 实现Windows95/98的I/O端口读写 收发电子邮件与监视网络服务器资源 使用WebBrower制作浏览器 可视化的Ping工具 使用IdMappedPortTCP进行端口映射 动态设置ODBC数据源 用ADO控件打开Access数据库 DBGrid中的记录到Html页面的转换 在DBGrid中实现任意方向查找 在DBGrid中通过动态下拉列表查找记录 用DBGrid组件制作下拉列表形式的提示框 利用书签处理DBGrid中的多个记录 将ComboBox中的内容直接拖放到DBGrid里 如何在DBGrid里放置图标 DBGrid控件精彩组合 DBChart图表控件的使用 在StringGrid组件中显示查询结果 使用流对象(Tstream)实现数据表中Tmemo字段的显示 如何动态建立SQLServer ODBC SQL浏览器 在SQL查询中使用动态参数 事务工作原理 标准/模糊查询 筛选数据 数据字典查看器 TDecisionGraph决策组件的使用 明细表(Master/Detail)结构 像处理文本资料一样处理数据表中的信息 远程数据库登录 远程数据库的离线处理 在远程数据库中实现主从表关系 动态设置远程数据库的查询参数 在远程数据库中计算统计值 多线程与数据库 使用远程存储过程 数据模块的同步显示 建立Web服务的数据提供端 建立Web服务的数据访问端 开发WebSnap数据库程序 建立ActiveForm数据浏览 建立数据查询WebServices服务器端 数据查询Web服务客户端开发 基于WAP的手机无线应用 建立基本Web数据库服务器应用 建立类型库编辑DataSnap服务端 建立查询条件Web数据库服务器应用 建立基本MTS服务端 建立MTS数据访问客户端 建立IntraWeb数据浏览 将程序图标设置到Windows系统托盘 取得和修改文件的创建和修改日期 通过流式数据实现文件分割与合并 实现指定扩展名文件和相应程序的关联 获取汉字拼音的首字母 监视剪贴板 在IE工具栏上增加一个按钮图标 软件注册机制的建立 复活节彩蛋的制作 SkinEngine控件——XP换肤 ActionList——应用程序通用功能列表 OleContainer——OLE容器 将程序项设置到控制面板 艺术化排列桌面图标 Delphi中的ini文件的读写 建立键盘鼠标动作记录与回放 实现指定目录下的文件查询 实现对系统的操作监视 系统级热键的实现 检测NumLock、Insert、CapsLock、ScrollLock键的状态
全部实例代码。目录如下: ToolBar工具栏控件的使用 动态建立主菜单选项 窗口界面的动态分隔条 动态设置选项卡页面 在标题栏中自定义按钮 窗体开合窗帘效果 Windows XP界面效果 实现OutLook滚动工具栏效果 在下拉列表框中显示树形视图 自定义系统的About项 修改系统级菜单 实现透明窗体效果 爆破特技窗体 只允许建立一次子窗体的MDI程序 从外部DLL中调用子窗口 新颖的资源管理器界面 如何生成半圆形窗口 制作字幕滚动窗体 详解Canvas生成渐变色窗口背景 WINAPM风格磁化窗口 软件封面的图片显示制作 实现图片的任意角度旋转 奇妙的拼图游戏 使用PaintBox控件制作画图程序 使用DrawGrid控件制作五子棋 多彩的数据报表 按压缩比将BMP转换为JPG 16位真彩转换到256色 调整图片的RGB对比度 实现图像的灰度级处理效果 3种像素历遍方法的比较和实现 实现屏幕拷贝 实现图像漫游 4种幕布式图像显示技巧 盘旋法实现9种滤镜效果 图形朦胧叠合显示技巧 给MDI主窗体增加背景 实现图像的淡入淡出显示 多媒体播放器 播放AVI文件 根据客户端IP地址获取计算机名 实现多线程IP和DomainName相互转换 Windows2000下的Popup发送功能 如何实现Ping操作 实现多线程共享探测 实现Windows95/98的I/O端口读写 收发电子邮件与监视网络服务器资源 使用WebBrower制作浏览器 可视化的Ping工具 使用IdMappedPortTCP进行端口映射 动态设置ODBC数据源 用ADO控件打开Access数据库 DBGrid中的记录到Html页面的转换 在DBGrid中实现任意方向查找 在DBGrid中通过动态下拉列表查找记录 用DBGrid组件制作下拉列表形式的提示框 利用书签处理DBGrid中的多个记录 将ComboBox中的内容直接拖放到DBGrid里 如何在DBGrid里放置图标 DBGrid控件精彩组合 DBChart图表控件的使用 在StringGrid组件中显示查询结果 使用流对象(Tstream)实现数据表中Tmemo字段的显示 如何动态建立SQLServer ODBC SQL浏览器 在SQL查询中使用动态参数 事务工作原理 标准/模糊查询 筛选数据 数据字典查看器 TDecisionGraph决策组件的使用 明细表(Master/Detail)结构 像处理文本资料一样处理数据表中的信息 远程数据库登录 远程数据库的离线处理 在远程数据库中实现主从表关系 动态设置远程数据库的查询参数 在远程数据库中计算统计值 多线程与数据库 使用远程存储过程 数据模块的同步显示 建立Web服务的数据提供端 建立Web服务的数据访问端 开发WebSnap数据库程序 建立ActiveForm数据浏览 建立数据查询WebServices服务器端 数据查询Web服务客户端开发 基于WAP的手机无线应用 建立基本Web数据库服务器应用 建立类型库编辑DataSnap服务端 建立查询条件Web数据库服务器应用 建立基本MTS服务端 建立MTS数据访问客户端 建立IntraWeb数据浏览 将程序图标设置到Windows系统托盘 取得和修改文件的创建和修改日期 通过流式数据实现文件分割与合并 实现指定扩展名文件和相应程序的关联 获取汉字拼音的首字母 监视剪贴板 在IE工具栏上增加一个按钮图标 软件注册机制的建立 复活节彩蛋的制作 SkinEngine控件——XP换肤 ActionList——应用程序通用功能列表 OleContainer——OLE容器 将程序项设置到控制面板 艺术化排列桌面图标 Delphi中的ini文件的读写 建立键盘鼠标动作记录与回放 实现指定目录下的文件查询 实现对系统的操作监视 系统级热键的实现 检测NumLock、Insert、CapsLock、ScrollLock键的状态
《Delphi7编程100例》代码目录:---------------------------------------------ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP界面效果实现OutLook滚动工具栏效果在下拉列表框中显示树形视图自定义系统的About项修改系统级菜单实现透明窗体效果爆破特技窗体只允许建立一次子窗体的MDI程序从外部DLL中调用子窗口新颖的资源管理器界面如何生成半圆形窗口制作字幕滚动窗体详解Canvas生成渐变色窗口背景WINAPM风格磁化窗口软件封面的图片显示制作实现图片的任意角度旋转奇妙的拼图游戏使用PaintBox控件制作画图程序使用DrawGrid控件制作五子棋多彩的数据报表按压缩比将BMP转换为JPG16位真彩转换到256色调整图片的RGB对比度实现图像的灰度级处理效果3种像素历遍方法的比较和实现实现屏幕拷贝实现图像漫游4种幕布式图像显示技巧盘旋法实现9种滤镜效果图形朦胧叠合显示技巧给MDI主窗体增加背景实现图像的淡入淡出显示多媒体播放器播放AVI文件根据客户端IP地址获取计算机名实现多线程IP和DomainName相互转换Windows2000下的Popup发送功能如何实现Ping操作实现多线程共享探测实现Windows95/98的I/O端口读写收发电子邮件与监视网络服务器资源使用WebBrower制作浏览器可视化的Ping工具使用IdMappedPortTCP进行端口映射动态设置ODBC数据源用ADO控件打开Access数据库DBGrid中的记录到Html页面的转换在DBGrid中实现任意方向查找在DBGrid中通过动态下拉列表查找记录用DBGrid组件制作下拉列表形式的提示框利用书签处理DBGrid中的多个记录将ComboBox中的内容直接拖放到DBGrid里如何在DBGrid里放置图标DBGrid控件精彩组合DBChart图表控件的使用在StringGrid组件中显示查询结果使用流对象(Tstream)实现数据表中Tmemo字段的显示如何动态建立SQLServer ODBCSQL浏览器在SQL查询中使用动态参数事务工作原理标准/模糊查询筛选数据数据字典查看器TDecisionGraph决策组件的使用明细表(Master/Detail)结构像处理文本资料一样处理数据表中的信息远程数据库登录远程数据库的离线处理在远程数据库中实现主从表关系动态设置远程数据库的查询参数在远程数据库中计算统计值多线程与数据库使用远程存储过程数据模块的同步显示建立Web服务的数据提供端建立Web服务的数据访问端开发WebSnap数据库程序建立ActiveForm数据浏览建立数据查询WebServices服务器端数据查询Web服务客户端开发基于WAP的手机无线应用建立基本Web数据库服务器应用建立类型库编辑DataSnap服务端建立查询条件Web数据库服务器应用建立基本MTS服务端建立MTS数据访问客户端建立IntraWeb数据浏览将程序图标设置到Windows系统托盘取得和修改文件的创建和修改日期通过流式数据实现文件分割与合并实现指定扩展名文件和相应程序的关联获取汉字拼音的首字母监视剪贴板在IE工具栏上增加一个按钮图标软件注册机制的建立复活节彩蛋的制作SkinEngine控件——XP换肤ActionList——应用程序通用功能列表OleContainer——OLE容器将程序项设置到控制面板艺术化排列桌面图标Delphi中的ini文件的读写建立键盘鼠标动作记录与回放实现指定目录下的文件查询实现对系统的操作监视系统级热键的实现检测NumLock、Insert、CapsLock、ScrollLock键的状态
ToolBar工具栏控件的使用动态建立主菜单选项窗口界面的动态分隔条动态设置选项卡页面在标题栏中自定义按钮窗体开合窗帘效果Windows XP界面效果实现OutLook滚动工具栏效果在下拉列表框中显示树形视图自定义系统的About项修改系统级菜单实现透明窗体效果爆破特技窗体只允许建立一次子窗体的MDI程序从外部DLL中调用子窗口新颖的资源管理器界面如何生成半圆形窗口制作字幕滚动窗体详解Canvas生成渐变色窗口背景WINAPM风格磁化窗口软件封面的图片显示制作实现图片的任意角度旋转奇妙的拼图游戏使用PaintBox控件制作画图程序使用DrawGrid控件制作五子棋多彩的数据报表按压缩比将BMP转换为JPG16位真彩转换到256色调整图片的RGB对比度实现图像的灰度级处理效果3种像素历遍方法的比较和实现实现屏幕拷贝实现图像漫游4种幕布式图像显示技巧盘旋法实现9种滤镜效果图形朦胧叠合显示技巧给MDI主窗体增加背景实现图像的淡入淡出显示多媒体播放器播放AVI文件根据客户端IP地址获取计算机名实现多线程IP和DomainName相互转换Windows2000下的Popup发送功能如何实现Ping操作实现多线程共享探测实现Windows95/98的I/O端口读写收发电子邮件与监视网络服务器资源使用WebBrower制作浏览器可视化的Ping工具使用IdMappedPortTCP进行端口映射动态设置ODBC数据源用ADO控件打开Access数据库DBGrid中的记录到Html页面的转换在DBGrid中实现任意方向查找在DBGrid中通过动态下拉列表查找记录用DBGrid组件制作下拉列表形式的提示框利用书签处理DBGrid中的多个记录将ComboBox中的内容直接拖放到DBGrid里如何在DBGrid里放置图标DBGrid控件精彩组合DBChart图表控件的使用在StringGrid组件中显示查询结果使用流对象(Tstream)实现数据表中Tmemo字段的显示如何动态建立SQLServer ODBCSQL浏览器在SQL查询中使用动态参数事务工作原理标准/模糊查询筛选数据数据字典查看器TDecisionGraph决策组件的使用明细表(Master/Detail)结构像处理文本资料一样处理数据表中的信息远程数据库登录远程数据库的离线处理在远程数据库中实现主从表关系动态设置远程数据库的查询参数在远程数据库中计算统计值多线程与数据库使用远程存储过程数据模块的同步显示建立Web服务的数据提供端建立Web服务的数据访问端开发WebSnap数据库程序建立ActiveForm数据浏览建立数据查询WebServices服务器端数据查询Web服务客户端开发基于WAP的手机无线应用建立基本Web数据库服务器应用建立类型库编辑DataSnap服务端建立查询条件Web数据库服务器应用建立基本MTS服务端建立MTS数据访问客户端建立IntraWeb数据浏览将程序图标设置到Windows系统托盘取得和修改文件的创建和修改日期通过流式数据实现文件分割与合并实现指定扩展名文件和相应程序的关联获取汉字拼音的首字母监视剪贴板在IE工具栏上增加一个按钮图标软件注册机制的建立复活节彩蛋的制作SkinEngine控件——XP换肤ActionList——应用程序通用功能列表OleContainer——OLE容器将程序项设置到控制面板艺术化排列桌面图标Delphi中的ini文件的读写建立键盘鼠标动作记录与回放实现指定目录下的文件查询实现对系统的操作监视系统级热键的实现检测NumLock、Insert、CapsLock、ScrollLock键的状态

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧