在MFC CScrollView中的固定位置上显示子窗口

时间:2013-09-05 15:41:43

标签: c++ windows mfc

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

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

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

  1. 在视图类的WM_PAINT处理程序中使用GDI绘制热点图标和图例矩形。
  2. 将热点实现为一个单独的窗口,创建为滚动视图的子窗口。
  3. 将热点实现为单独的窗口,但将其创建为没有父级的弹出窗口。
  4. 如果用户滚动图表视图,版本1和2会表现得很奇怪。

    在版本1中,我可以看到工件(按钮涂抹在视图上),同时执行滚动我想在滚动期间,现有图像不会失效但只会被移动。

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

    版本3是最令人不安的,因为图例不是图形视图的子项我甚至在未显示图形视图的情况下会显示图例按钮的一些奇怪行为,我认为这个问题太多了投资时间的可行发展道路。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

OnScrollBy将客户区域拆分为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

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

答案 1 :(得分:0)

您可以只使用

CPoint GetScrollPosition( ) const;

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

BTW:而不是WM_PAINT使用CScrollView的方法

virtual void OnDraw( CDC* pDC );

这很重要