我有一个从 CScrollView 继承的窗口,它处理 WM_PAINT 并显示一个图形。该图具有不同类型的元素,元素的类型由元素的形状标记。
我想显示一些图例,以便用户知道每个形状的含义。由于用户不会经常查看此图例,因此想法是在视图控件的右上角会有一个小图标。当用户将鼠标移到此图标上时,它将扩展为小矩形,显示图形中使用的形状的图例。当鼠标移到此矩形之外时,它将折叠回小图标。
这是我到目前为止所尝试的:
- 在视图类的 WM_PAINT 处理程序中使用 GDI 绘制热点图标和图例矩形。
- 将热点实现为一个单独的窗口,该窗口被创建为滚动视图的子级。
- 将热点实现为单独的窗口,但将其创建为没有父窗口的弹出窗口。
如果用户滚动图形视图,版本 1 和 2 的行为会很奇怪。
在版本 1 中,我可以在执行滚动时看到伪影(按钮在视图中被涂抹)我猜在滚动期间现有图像不会失效,而只会移动。
在版本 2 中没有拖尾,但每当我收到 VM_HSCROLL 和 WM_VSCROLL 消息时,我都需要移动子窗口,而这些消息不够精确,无法以这种方式使用。在滚动过程中,我可以看到我的按钮移动了几个像素,然后跳到正确的位置。
版本 3 是最令人不安的,因为图例不是图形视图的子视图,我得到一些奇怪的行为,即使未显示图形视图,也会显示图例按钮,我认为这个问题太多,无法成为可行的开发路径投入时间。
我认为版本 2 是最有前途的,但我需要找到一种方法让子窗口在滚动期间停留在一个地方。
有没有人成功实施这样的事情?还有其他一些我可以调查的实现吗?