gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:33:56 25 4
gpt4 key购买 nike

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

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

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

编辑控件必须在某个时候告诉滚动条它的滚动范围是多少。我想知道我是否可以介于两者之间并在不使用滚动条时隐藏它。

最佳答案

我就是这样解决这个问题的。

首先:

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

解决方法:

  • 我有一个绑定(bind)到控件的标准 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;
}
}

我希望能帮助其他可能有类似需求的人。

关于c++ - 在多行文本编辑控件中自动显示垂直滚动条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/562313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com