【问题标题】:based on user input scroll dynamically using Win32 functions基于用户输入使用 Win32 函数动态滚动
【发布时间】:2011-08-07 07:17:39
【问题描述】:

我正在使用 C 和 Win32 函数编写一个类似于记事本的示例应用程序。只要用户按下键盘上的任何键,它就会在输出中显示为“Key Pressed:”,然后移至下一行。当用户继续按键时,他将到达页面末尾,但我发现动态滚动垂直条很困难。 我什至尝试使用 WM_CHAR 中的 SetScrollInfo 动态设置滚动条范围,但它仍然不起作用。请建议我一种方法来做到这一点。示例代码供您参考。

    case WM_CHAR:
        //////////////////////////////////////////////////////////////////////////
        hdc = GetDC( hwnd );    
        //////////////////////////////////////////////////////////////////////////
        GetTextMetrics( hdc, &tm );
        cyChar = tm.tmHeight + tm.tmExternalLeading;
        //////////////////////////////////////////////////////////////////////////
        si.cbSize = sizeof( si );
        si.fMask  = SIF_RANGE | SIF_PAGE;
        si.nMin   = 0;
        si.nMax   = iMaxLines;
        si.nPage  = cyClient / cyChar;
        SetScrollInfo( hwnd, SB_VERT, &si, TRUE );
        //////////////////////////////////////////////////////////////////////////
        wsprintf( szBuffer, TEXT("Key pressed %c, Pos: %d"), wParam, iMaxLines );
        TextOut( hdc, 0, cyChar * iMaxLines++, szBuffer, lstrlen( szBuffer ) );
        //////////////////////////////////////////////////////////////////////////
        ReleaseDC( hwnd, hdc );
        //////////////////////////////////////////////////////////////////////////

        break;

【问题讨论】:

  • 我不确定这是否有必要,但是你的窗口有 WS_VSCROLL 样式吗?
  • 是的...我有。请在下面找到创建窗口的代码。
  • hwnd = CreateWindow(szClassName, TEXT("Text Pad"), WS_OVERLAPPEDWINDOW | WM_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow);更新窗口(hwnd);
  • 上面写的是 WM_ 而不是 WS_
  • 对您的最佳建议是忘记您认为自己知道的所有内容,获取 Petzold 的副本,然后正确地重新学习。

标签: c windows winapi visual-c++


【解决方案1】:

您在 Windows 中违反了一个非常基本的编码模式:仅在 WM_PAINT 事件处理程序中将内容绘制到窗口。你在别处画的任何东西都不会长期存在,下一次重绘会擦除它。比如调整滚动条触发的那个。

使用列表框简化此编码任务。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 2017-10-06
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    相关资源
    最近更新 更多