Delphi 相对于滚动条的绘制

Delphi 相对于滚动条的绘制,delphi,scrollbar,gdi+,pascal,Delphi,Scrollbar,Gdi+,Pascal,我正在制作一些组件供自己使用,我正在尝试制作一个“riff生成器”,用于制作midi格式的曲调。因此,我正在写一个pianoroll编辑器(如在fl工作室等) 我遇到的问题是相对于滚动条位置绘制。我已经试了两天了,但我似乎不知道怎么做。我已经添加了设置滚动位置的变量和程序,但我不明白在滚动时如何向上/向下和侧向绘制 我添加了到目前为止的代码,我使用Erik Bilsen()中的GDI+单元进行绘图 如果有人能看看我的代码,并帮助我得到正确的绘图,这将是了不起的!当我完成后,我将把这个和其他组件

我正在制作一些组件供自己使用,我正在尝试制作一个“riff生成器”,用于制作midi格式的曲调。因此,我正在写一个pianoroll编辑器(如在fl工作室等)

我遇到的问题是相对于滚动条位置绘制。我已经试了两天了,但我似乎不知道怎么做。我已经添加了设置滚动位置的变量和程序,但我不明白在滚动时如何向上/向下和侧向绘制

我添加了到目前为止的代码,我使用Erik Bilsen()中的GDI+单元进行绘图

如果有人能看看我的代码,并帮助我得到正确的绘图,这将是了不起的!当我完成后,我将把这个和其他组件作为开源发布,这样其他人也可以使用这些组件

组件代码:


一些典型计算

滚动条范围

具有给定滚动位置的视口中的对象位置

对象可见性过滤器

如果(OPos>=ScrPos)和(OPos
一些典型计算

滚动条范围

具有给定滚动位置的视口中的对象位置

对象可见性过滤器

如果(OPos>=ScrPos)和(OPos
您只需减去。通常,我有一个变量
FScrollPos:TPoint
,它包含内容坐标系中屏幕左上角像素的坐标。因此,如果
FScrollPos=Point(10,20)
,则用户已向右滚动
10
px,向下滚动
20
px。要在内容和屏幕坐标之间转换,只需减法。是的,我已经有了一个FScrollPosX和一个FScrollPosY,但如果我减法,我会得到各种奇怪的图形,也许你可以看看我的代码,看看我做错了什么-我现在尝试了两天。。我看不出哪里出了问题。为什么不尝试创建一个非常简单的GUI控件(比如画一个1000×2000像素的固定大小三角形)来学习如何使滚动条和滚动工作,然后尝试将相同的技术应用于钢琴滚动控件?如果你很难做到这一点,至少你有一个可管理的代码量适合一个SO问题。是的,我已经使用了滚动条,我制作了一些列表框和其他一些东西,在哪里我可以让它工作没有任何问题-但当我在这个组件中尝试它时,它没有画出它应该画的样子/我想要的样子-所以我知道我在哪里做错了。。但我似乎不知道exactlySo在哪里不提供这项服务。它不是用来调试代码的。我们可以帮助您解答有关本主题中发布的代码的具体问题。您只需减去。通常,我有一个变量
FScrollPos:TPoint
,它包含内容坐标系中屏幕左上角像素的坐标。因此,如果
FScrollPos=Point(10,20)
,则用户已向右滚动
10
px,向下滚动
20
px。要在内容和屏幕坐标之间转换,只需减法。是的,我已经有了一个FScrollPosX和一个FScrollPosY,但如果我减法,我会得到各种奇怪的图形,也许你可以看看我的代码,看看我做错了什么-我现在尝试了两天。。我看不出哪里出了问题。为什么不尝试创建一个非常简单的GUI控件(比如画一个1000×2000像素的固定大小三角形)来学习如何使滚动条和滚动工作,然后尝试将相同的技术应用于钢琴滚动控件?如果你很难做到这一点,至少你有一个可管理的代码量适合一个SO问题。是的,我已经使用了滚动条,我制作了一些列表框和其他一些东西,在哪里我可以让它工作没有任何问题-但当我在这个组件中尝试它时,它没有画出它应该画的样子/我想要的样子-所以我知道我在哪里做错了。。但我似乎不知道exactlySo在哪里不提供这项服务。它不是用来调试代码的。我们可以帮助回答有关本主题中发布的代码的特定问题。
FScrollPosX : Integer;
FScrollPosY : Integer;
FScrollMaxX : Integer;
FScrollMaxY : Integer;
FOldScrollX : Integer;
FOldScrollY : Integer;
Given Virtual extent (VirtExt) in pixels
Given Viewport extent (VPExt) in pixels

Scrollbar range = VirtExt - VPExt (to leave the last part visible in the viewport)
Given Object.pos (ObjPos) (in virtual space)
Given Sroll position (ScrPos)

Position in viewport: ObjPos - ScrPos
Visible if (OPos >= ScrPos) and (OPos < ScrPos+VPExt)