gpt4 book ai didi

c++ - 在 MFC CScrollView 的固定位置显示子窗口

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:18 25 4
gpt4 key购买 nike

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

我想显示一些图例,以便用户了解每个形状的含义。由于用户不会经常看这个图例,因此想法是在 View 控件的右上角会有一个小图标。当用户将鼠标移到这个图标上时,它会扩展成小矩形,显示图形中使用的形状图例。当鼠标移出此矩形时,它将收缩回小图标。

这是我目前尝试过的:

  1. 在 View 类的 WM_PAINT 处理程序中使用 GDI 绘制热点图标和图例矩形。
  2. 将热点实现为作为 ScrollView 的子项创建的单独窗口。
  3. 将热点实现为单独的窗口,但将其创建为没有父窗口的弹出窗口。

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

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

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

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

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

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

最佳答案

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

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

新的 OnScrollBy 将客户区分成 4 个 strip ,并为每个 strip 调用 ::ScrollWindowEx

这些条纹是:

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

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

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

关于c++ - 在 MFC CScrollView 的固定位置显示子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18640634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com