【问题标题】:Win32 scrolling examplesWin32 滚动示例
【发布时间】:2011-02-14 19:18:23
【问题描述】:

谁能指出(或提供?)一些关于如何在 Win32 中实现滚动的漂亮、清晰的示例?很明显,谷歌提供了很多东西,但大多数例子似乎太简单或太复杂,以至于我无法确定它们展示了正确的做事方式。我在当前项目中使用 LispWorks CAPI(跨平台 Common Lisp GUI 库),在 Windows 上,我有一个与滚动相关的难以解决的错误;基本上我想直接通过 Win32 API 做一些测试,看看我是否可以对这种情况有所了解。

非常感谢, 克里斯托弗

【问题讨论】:

  • 不清楚你的意思。您通过发送WM_SCROLLWINDOW 消息来告诉窗口滚动,然后由窗口来正确响应。如果您发现问题,则可能是该窗口没有发送正确的消息,或者它不正确地处理消息。所以:你在看什么?
  • 正如 egrunin 指出的那样,您需要更加具体。你想滚动什么以及如何滚动?是文字吗?你想控制一个滚动框吗?是老式位图滚动吗?它是一个什么样的应用程序?游戏?
  • 这在 Petzold 的书中都有介绍,就像这里的许多 Win32 问题一样。
  • @egrunin 我找不到对 WM_SCROLLWINDOW 的引用。
  • @user13947194 抱歉,我的意思是“WM_VSCROLL 或 WM_HSCROLL 消息”。

标签: winapi scroll win32gui


【解决方案1】:

这是ScrollCall,(从页面复制):。

ScrollCall 是一个以 Windows 标准为样本的演示程序 控件,连同一个标准的 GDI 图像,并将它们排列在一个 设备上下文(或 DC),在窗口中。根据尺寸 图像,以及包含窗口的大小,水平和/或 系统滚动条变得可见,以启用图像滚动 和控制。因此 ScrollCall 至少同样关注大小 因为它是滚动的,两者都为 程序员。

ScrollCall 功能:

  • 系统滚动条
  • 可选组框
  • 在设备上下文 (DC) 上打开图像的按钮
  • 用于选择窗口滚动功能的单选选项
  • 用于拉伸而不是滚动图像的复选框
  • 使用 UpDown 和 Buddy 标记 Paint Mult 以增加 WM_SIZE 在调整期间的等待时间,从而减少 WM_PAINT 处理
  • 右键单击以获取默认视图或连接到桌面的监视器的系统快照
  • 双击将(大部分为空的)客户端窗口的可见部分打印到 DC,然后返回客户端窗口(实验性)
  • ScrollCall 暂时打开 SPI_SETDRAGFULLWINDOWS 以测试拖动的视觉效果(如果曾经关闭)
  • 与 AeroSnap 尺寸的兼容性

【讨论】:

    【解决方案2】:

    我认为您正在讨论如何处理 WM_VSCROLL/WM_HSCROLL 事件的示例。如果是这样,第一步是处理该事件。您不应使用该调用的 HIWORD(wParam) 值,而应使用 GetScrollInfo、GetScrollPos 和 GetScrollRange 函数。

    以下是MSDN - Using Scroll Bars 截取的示例代码。例如,xCurrentScroll 是通过调用 GetScrollPos() 来确定的。

    int xDelta;     // xDelta = new_pos - current_pos  
    int xNewPos;    // new position 
    int yDelta = 0; 
    
    switch (LOWORD(wParam)) { 
        // User clicked the scroll bar shaft left of the scroll box. 
        case SB_PAGEUP: 
            xNewPos = xCurrentScroll - 50; 
            break; 
    
        // User clicked the scroll bar shaft right of the scroll box. 
        case SB_PAGEDOWN: 
            xNewPos = xCurrentScroll + 50; 
            break; 
    
        // User clicked the left arrow. 
        case SB_LINEUP: 
            xNewPos = xCurrentScroll - 5; 
            break; 
    
        // User clicked the right arrow. 
        case SB_LINEDOWN: 
            xNewPos = xCurrentScroll + 5; 
            break; 
    
        // User dragged the scroll box. 
        case SB_THUMBPOSITION: 
            xNewPos = HIWORD(wParam); 
            break; 
    
        default: 
            xNewPos = xCurrentScroll; 
    } 
    
    [...]
    
    // New position must be between 0 and the screen width. 
    xNewPos = max(0, xNewPos); 
    xNewPos = min(xMaxScroll, xNewPos); 
    
    [...]
    
    // Reset the scroll bar. 
    si.cbSize = sizeof(si); 
    si.fMask  = SIF_POS; 
    si.nPos   = xCurrentScroll; 
    SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 2020-08-16
      相关资源
      最近更新 更多