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

时间:2011-08-07 07:17:39

标签: c windows winapi visual-c++

我正在编写一个类似于记事本的示例应用程序,使用C& Win32功能。一旦用户按下键盘上的任何键,它就会在输出上显示为“按下按键:”,然后移动到下一行。当用户继续按键时,他将到达页面的末尾,但我发现难以动态滚动垂直条。 我甚至尝试使用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;

1 个答案:

答案 0 :(得分:2)

您在Windows中违反了一个非常基本的编码模式:只在WM_PAINT事件处理程序中向窗口绘制内容。你在别处画的任何东西都不会存活很长时间,下一次重画会抹去它。比如通过调整滚动条触发的那个。

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