1. 文本框
用途说明:
在文本框中打印日志,或向ListCtrl中插入数据时,怎么样可以把滚动条时时滚动到最后一行,这样便可看到添加的新数据内容。
方法I:
CWnd *pWnd = GetDlgItem(IDC_EDIT1); HWND g_hLog = pWnd->GetSafeHwnd(); ::SendMessage(g_hLog, WM_VSCROLL, MAKEWPARAM(SB_BOTTOM,0), 0);
方法II:
HWND g_hLog = ::GetDlgItem(m_hWnd, IDC_EDIT1); ::SendMessage(g_hLog, WM_VSCROLL, MAKEWPARAM(SB_BOTTOM,0), 0);
方法III:
CWnd* g_CWnd = GetDlgItem(IDC_EDIT1); int nLineCount = ((CEdit*)g_cWnd)->GetLineCount(); ((CEdit*)g_cWnd)->LineScroll(nLineCount);
2. ListCtrl
说明:
比如你找查找某一行(或者对某一行数据做处理),而此行并在listctrl当前可视范围内并不可见。当你查找这条记录时,你可能想要自动进行选中高亮显示,并且将此行自动滚动到可视范围内,而不想去手动拖动滚动条找到此行,你可以试试一下方法:
(1) 自动选中某行的方法:
选中高亮:
m_list.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);
或:m_list.SetItemState(nItem, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
去选中高亮:
m_List.SetItemState(nItem, 0, LVIS_SELECTED);
(2)自动滚动列表,让指定行在区域内可见的方法:
注意:指定行在列表区域内可见,并非选中行
方法I:滚动到指定行
m_ListCtrl->EnsureVisible(nItem, TRUE);
第二个参数:如果为 false,则该项在列表区域内部分可见时不会发生滚动。如果为 true,则滚动条会自动滚动使该项完全在窗口区域内可见。
方法II:滚动到列表的末尾
加完数据后执行: m_ListCtrl.SendMessage(WM_VSCROLL, SB_BOTTOM, NULL); 或全局 ::SendMessage(g_hList, WM_VSCROLL, MAKEWPARAM(SB_BOTTOM,0), 0);
m_ListCtrl.SetFocus(); //设置最后一行被选中 m_ListCtrl.SetItemState(m_ListCtrlLog.GetItemCount() - 1, LVIS_ACTIVATING | LVIS_FOCUSED | LVIS_SELECTED, LVIS_SELECTED | LVIS_FOCUSED); //滚动到最后一行 m_ListCtrl.Scroll(CSize(0, 100000));
例如:
m_wndList.SetItemState(k, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); //先选中行
m_wndList.EnsureVisible(k, FALSE); //再滚动到行