【问题标题】:How to draw my own basic ListView如何绘制我自己的基本 ListView
【发布时间】:2014-08-25 22:51:40
【问题描述】:

好的,我正在尝试了解如何在 Windows 中构建“控件”的基础知识。我不知道 ListView 控件(例如)中的各个点和部分是如何绘制的。

让我们使用一个 ListView,并在其中添加 3 个项目。

这些项目是如何到达那里的?

  • 他们是否在列表视图的 OnPaint 事件中在列表视图控件内的指定位置绘制列表项文本? (例如:listView1_Paint(...) { graphics.DrawString(...); }

当用户选择一个项目时,他们如何选择一个项目? - 他们是否: 在 on mouse down 事件中获取鼠标的 x & y 坐标,然后在内部列表中查找在该位置绘制的任何项目,然后在该位置用不同颜色的背景重新绘制该特定项目以传达给用户该项目已被选中?

当用户已经选择了一个项目然后按下向上或向下箭头键时,他们如何知道要选择哪个项目(以及如何选择)? - 他们是否获得了最后一个选定项目的绳索,然后调整这些坐标以使其与下一个要选择的项目保持一致?

最后,如果以我所说的方式“绘制”文本,那么基本上它只是像素,对吧?那么,当用户单击同一位置时,我应该如何“知道”文本所说的内容。我是否应该将所有以字符串形式绘制的文本连同坐标一起存储在 List 中?

【问题讨论】:

  • 您可以对控件进行子类化并查看发送给它的消息。请记住,在某些情况下(滚动条),您无法拦截内部发送的消息。

标签: c# .net winforms drawing gdi+


【解决方案1】:

你的问题似乎更多的是它是如何工作的,而不是如何去做,所以希望这会给你一个想法。

让我们使用一个 ListView,并在其中添加 3 个项目。 这些项目是如何到达那里的?

他们是否在列表中的指定位置绘制列表项文本? listview的OnPaint事件中的listview控件? (例如: listView1_Paint(...) { graphics.DrawString(...); }

列表视图中的所有项目都存储在一个集合中 (ListView.Items)。每行都是一个ListViewItem,其中包含用于呈现该行并与之交互的必要信息。

他们要么在 ListView 的 OnPaint 中绘制它,要么在 ListViewItem 上的一些其他方法中绘制它。通常绘画被分解到最合乎逻辑的地方。我不能专门针对 ListView 说话,但是当我构建 Grid 时,我让每个 Cell 自己绘制。

当用户选择一个项目时,他们如何选择一个项目? - 他们是否: 在 on mouse down 事件中获取鼠标的 x & y 坐标...

是的,是的。这被称为“命中测试”。注意ListView 上的HitTest(...) 方法。根据控件的具体实现,测量每个项目以正确计算滚动条值,当鼠标事件发生时,针对鼠标信息与滚动条一起发生命中测试,以确定控件的确切部分正在与之交互。

他们如何知道当用户选择哪个项目(以及如何选择) 已经选择了一个项目,然后按了向上或向下箭头键? - 他们得到最后一个选定项目的绳索,然后调整那些 坐标,以便它们与下一个要选择的项目保持一致?

这只是一个项目数组。他们知道当前被选中。有很多不同的方法可以做到这一点,但一种方法是在一个项目上保留一个 IsSelected 布尔值,然后在 OnPaint() 调用中,如果它被选中,则以不同的方式呈现它。上下移动就像增加或减少所选项目的索引一样简单。真正的乐趣是当您需要开始上下移动子项目并使用键盘处理多选时。

最后,如果文本是以我所说的方式“绘制”的,那么 基本上它只是像素,对吧?那么,我应该如何“知道” 当用户在同一位置单击时,文本会说什么。我是不是 应该将所有绘制为字符串的文本块存储在 连同坐标一起列出吗?

这只是像素。该文本是专门绘制的。您可以简单地通过问自己来回答这个问题,“好吧,我怎么知道一开始要画什么文字?”。

请记住,将有一个项目集合,其中包含绘图所需的所有信息。当HitTest 发生时,您应该取回包含绘图信息的对象或获取它的其他信息。


要记住的主要一点是,您应该拥有存储您需要的所有信息的对象。看看ListViewItem 类来了解一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    • 2012-06-03
    • 2013-01-24
    相关资源
    最近更新 更多