c - 使用 Win32 函数基于用户输入动态滚动

标签 c windows winapi visual-c++

我正在使用 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;

最佳答案

您违反了 Windows 中非常基本的编码模式:仅在 WM_PAINT 事件处理程序中将内容绘制到窗口。您在其他地方绘制的任何内容都不会保留很长时间,下次重新绘制时会将其删除。比如调整滚动条触发的。

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

关于c - 使用 Win32 函数基于用户输入动态滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971326/

相关文章:

c - fgets 不会停止读取用户输入

java - 从java类编译C文件

mysql - mysqlimport --delete 背后发生了什么? auto_increment 值没有被重置

c++ - 如何仅使用 WinAPI (ATL/WTL) 在 WPF 中创建类似 Expander 控件的东西?

c - 访问函数中的数组时发生访问冲突(函数内部)

c - bss 和数据段中的整数变量大小

c - 什么 C 编译器与 Borland Turbo Link 5.1 匹配?

c++ - Windows 7 异常代码 : 0xc0000409

c++ - 如何获取此文件夹中的文件夹列表?

python - 在 Python 中检测 Windows 注销