Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何允许用户通过鼠标与图形对象交互?_.net_User Interface_Graphics_Charts_Gdi+ - Fatal编程技术网

.net 如何允许用户通过鼠标与图形对象交互?

.net 如何允许用户通过鼠标与图形对象交互?,.net,user-interface,graphics,charts,gdi+,.net,User Interface,Graphics,Charts,Gdi+,我正在开发的应用程序将用于创建数据库中包含的数据图表。现在,图表上的对象是使用“控制面板”来操作的——本质上是一个对象列表和一个用于编辑值的PropertyGrid。用户还希望能够使用鼠标交互与对象交互——比如抓住图表的一角并拖动以展开/收缩图表,单击数字并获得文本框以编辑图表,或者右键单击某个对象以获得可能交互的菜单。 使用GDI+在图元文件(需求)上绘制图表,然后在用户绘制的表单上绘制图元文件 我真的不知道如何实现这一点。我有几个想法: 创建一些覆盖在图表图形上的自定义控件。每个控件都可以

我正在开发的应用程序将用于创建数据库中包含的数据图表。现在,图表上的对象是使用“控制面板”来操作的——本质上是一个对象列表和一个用于编辑值的PropertyGrid。用户还希望能够使用鼠标交互与对象交互——比如抓住图表的一角并拖动以展开/收缩图表,单击数字并获得文本框以编辑图表,或者右键单击某个对象以获得可能交互的菜单。 使用GDI+在图元文件(需求)上绘制图表,然后在用户绘制的表单上绘制图元文件

我真的不知道如何实现这一点。我有几个想法:

  • 创建一些覆盖在图表图形上的自定义控件。每个控件都可以与图表上的特定对象或对象属性相关联,并根据用户与控件的交互方式更新这些值
  • 只需跟踪对象的位置,当用户使用鼠标执行操作时,浏览列表,找出应该位于鼠标位置的对象,然后从那里开始

我对你们如何实现这一点很感兴趣,非常感谢你们的建议。谢谢

后者-例如,如果它是一个饼图,您将不得不做大部分命中测试工作来处理不规则形状的控件。

最简单的方法是:列出对象及其边界框。当鼠标事件发生时,检查单击对象的列表。

一个很好的命中检测方法:使用另一个屏幕外图像。使用唯一的颜色在此图像上绘制每个可单击的对象。您必须禁用抗锯齿。当用户单击时,从屏幕外图像获取该点的颜色并确定对象。如果有对象列表,可以使用对象索引作为颜色。此方法将处理不规则形状对象的命中检测,但速度稍慢


注:使用控件的速度比这慢。

前者-如果您将其覆盖在表单上,那么所有命中测试都将由表单框架为您完成。您只需要创建一些控件,然后为它们实现事件处理程序

上面还描述了任何windows窗体(或者可能是MPF)程序:)


创建自己的对象列表等等同于重新实现windows窗体框架,或者至少是其中的一个重要部分。你不想重新发明轮子,尤其是因为你的应用程序中已经有轮子了。

+1对于你自己进行命中测试来说,这绝对是一条路要走。但是cemkalyoncu是正确的,如果你在对象的实际坐标之外保留一个边界框,那么你可以快速拒绝对象并缩小搜索范围。如果你只有几个大的形状,这将比重新计算形状更占用内存,但是如果你有许多形状不规则的小对象,这可能是一个胜利。考虑到内存,你肯定可以使用托盘图像将内存使用量减少到4倍,除非工作区中的对象超过256个。+1我对此也感兴趣。我希望看到更多信息或良好的示例应用程序的链接。