在Windows移动设备上,我有一个mutliline文本编辑控件,设置为只读,并在显示生命周期内显示一些静态文本。我想只显示一个实际有用的垂直滚动条(即文本大于显示)。
由于两个原因,我不能轻易弄清楚文本是否要显示大。
编辑控件必须告诉滚动条在某个时刻它的滚动范围是什么。我想知道我是否可以进入,然后隐藏滚动条,如果它不会被使用。
答案 0 :(得分:1)
这就是我解决这个问题的方法。
首先关闭:
解决方案:
我有一个绑定到控件的标准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的那个