在多行文本编辑控件中自动显示垂直滚动条

时间:2009-02-18 18:34:55

标签: c++ windows-mobile mfc

在Windows移动设备上,我有一个mutliline文本编辑控件,设置为只读,并在显示生命周期内显示一些静态文本。我想只显示一个实际有用的垂直滚动条(即文本大于显示)。

由于两个原因,我不能轻易弄清楚文本是否要显示大。

  1. 没有显示水平滚动条,因此文字换行。
  2. 在windows mobile下,用于计算将显示的文本大小的win32例程无法正常工作。它们返回一个不正确的矩形。
  3. 编辑控件必须告诉滚动条在某个时刻它的滚动范围是什么。我想知道我是否可以进入,然后隐藏滚动条,如果它不会被使用。

2 个答案:

答案 0 :(得分:1)

这就是我解决这个问题的方法。

首先关闭:

  • 它仅适用于编辑控件的只读模式(因为您不希望文本经常更改)。
  • 我认为特定于Windows Mobile MFC,大型Windows可以更好地处理这个问题。
  • 解决方案非常黑客。

解决方案:

  • 我有一个绑定到控件的标准CEdit。

      

    CEdit m_Message;

         

    DDX_Control(pDX,IDC_MESSAGE,   m_Message);

  • 在InitDialog和OnSize调用期间,打开滚动条的显示并设置定时器消息。

      

    m_Message.ShowScrollBar(SB_VERT,   TRUE);

         

    SetTimer(DO_ADJUST_DISPLAY_STATE,50,   0);

  • 在计时器处理代码中,使用滚动信息确定是否需要显示滚动条。

  • 如果没有显示,请关闭滚动条并强制窗口重新显示。

 void CMessageDlg::OnTimer( UINT_PTR nIDEvent )
  {
    switch(nIDEvent)
    {
    case DO_ADJUST_DISPLAY_STATE:
        KillTimer(nIDEvent);
        // deselect all text
        m_Message.SetSel(0, 0);
        SCROLLINFO info;
        m_Message.GetScrollInfo(SB_VERT, &info);

        if(info.nPage > (UINT)info.nMax)
        {
            // need to re-display the non scroll bar version
            m_Message.ShowScrollBar(SB_VERT, FALSE);

            // I could not find any other way to force a redisplay 
            // correctly without display problems...

            // first move the window to a know invisible area
            // then wait (using a timer) for the window to move
            // then move the window back to it's original position     
            RECT rt;
            rt.left = 0;
            rt.right = 5;
            rt.top = 0;
            rt.bottom = 5;
            m_Message.MoveWindow(&rt);

            SetTimer(DO_REDISPLAY_MESSAGE, 50, 0);
        }
        break;

    case DO_REDISPLAY_MESSAGE:
        KillTimer(nIDEvent);
        // m_MessagePosition holds the original position
        // worked out dynamically during the WM_SIZE
        // processing
        m_Message.MoveWindow(&m_MessagePosition);
        break;
    }
}

我希望能帮助其他可能有相似要求的人。

答案 1 :(得分:0)

  

我想知道是否可以进入之间并隐藏滚动条,如果它不会被使用的话。

我非常怀疑。但我打赌你可以在创建文本框后的某个时间调用SetScrollInfo,并发送自己的滚动参数。

编辑:错误的链接,我的坏。 Here是Windows CE的那个