1

我有一个从 CScrollView 继承的窗口,它处理 WM_PAINT 并显示一个图形。该图具有不同类型的元素,元素的类型由元素的形状标记。

我想显示一些图例,以便用户知道每个形状的含义。由于用户不会经常查看此图例,因此想法是在视图控件的右上角会有一个小图标。当用户将鼠标移到此图标上时,它将扩展为小矩形,显示图形中使用的形状的图例。当鼠标移到此矩形之外时,它将折叠回小图标。

这是我到目前为止所尝试的:

  1. 在视图类的 WM_PAINT 处理程序中使用 GDI 绘制热点图标和图例矩形。
  2. 将热点实现为一个单独的窗口,该窗口被创建为滚动视图的子级。
  3. 将热点实现为单独的窗口,但将其创建为没有父窗口的弹出窗口。

如果用户滚动图形视图,版本 1 和 2 的行为会很奇怪。

在版本 1 中,我可以在执行滚动时看到伪影(按钮在视图中被涂抹)我猜在滚动期间现有图像不会失效,而只会移动。

在版本 2 中没有拖尾,但每当我收到 VM_HSCROLL 和 WM_VSCROLL 消息时,我都需要移动子窗口,而这些消息不够精确,无法以这种方式使用。在滚动过程中,我可以看到我的按钮移动了几个像素,然后跳到正确的位置。

版本 3 是最令人不安的,因为图例不是图形视图的子视图,我得到一些奇怪的行为,即使未显示图形视图,也会显示图例按钮,我认为这个问题太多,无法成为可行的开发路径投入时间。

我认为版本 2 是最有前途的,但我需要找到一种方法让子窗口在滚动期间停留在一个地方。

有没有人成功实施这样的事情?还有其他一些我可以调查的实现吗?

4

2 回答 2

1

CScrollView具有OnScrollBy滚动视图控件的整个客户区的虚拟方法。您可以覆盖此方法并实现自己的滚动功能。

::ScrollWindowEx有一个参数prcScroll可以指定只滚动的客户区的一部分。

NewOnScrollBy将客户区分成 4 个条带,并分别调用::ScrollWindowEx它们。

这些条纹是:

  1. 图标上方的客户区(整个客户区的矩形宽度)
  2. 图标左侧的客户区(矩形高度与图标相同)
  3. 图标右侧的客户区(矩形高度与图标相同)
  4. 图标下方的客户区(整个客户区的矩形宽度)

    1 1 1 1 1
    2 2 2 * 3
    4 4 4 4 4
    4 4 4 4 4

滚动所有单个客户矩形后,只需使图标所在的客户区域无效。

于 2013-09-06T16:11:12.807 回答
0

你可以简单地使用

CPoint GetScrollPosition( ) const;

方法来获取滚动视图的当前滚动位置并相应地重新计算您的“静态”标签偏移量。

顺便说一句:而不是 WM_PAINT 使用 CScrollView 的方法

virtual void OnDraw( CDC* pDC );

这一点很重要

于 2013-09-05T22:33:47.233 回答