【问题标题】:Automatically display vertical scrollbar in multiline text edit control在多行文本编辑控件中自动显示垂直滚动条
【发布时间】:2010-10-08 10:03:24
【问题描述】:

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

由于两个原因,我无法轻易确定文本是否太大而无法显示。

  1. 没有显示水平滚动条,因此文本换行。
  2. 在 windows mobile 下,用于计算将显示的文本大小的 win32 例程无法正常工作。他们返回一个不正确的矩形。

编辑控件必须在某个时刻告诉滚动条它的滚动范围是什么。我想知道如果不使用滚动条,我是否可以在这之间插入并隐藏滚动条。

【问题讨论】:

    标签: c++ windows-mobile mfc


    【解决方案1】:

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

    首先:

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

    解决方案:

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

      CEdit m_Message;

      DDX_Control(pDX, IDC_MESSAGE, m_Message);

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

      m_Message.ShowScrollBar(SB_VERT, 真的);

      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;
        }
    }
    

    我希望这对可能有类似要求的其他人有所帮助。

    【讨论】:

    • 令我惊讶的是,win32/MFC 不会自动解决这个问题。太棒了
    【解决方案2】:

    我想知道我是否可以在这之间插入并隐藏滚动条(如果不使用)。

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

    编辑:错误的链接,我的错。 Here 是用于 Windows CE 的

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2010-10-24
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多