listbox autoscroll
-
Hallo
ich nutze eine Listbox für Log-ausgaben. Die Nachichten werden logischerweise
immer unten dran gehängt (neue zeile). gibt es eine möglichkeit, einen window-
style oder sowas, damit die Listbox automatisch nach unten scrollt?
(listbox hat eine scrollbar)MfG scroller
-
wenn du die message bekommst das ein neuer eintrag da ist:
SendMessage(hwndListBox, WM_VSCROLL, SB_Bottom, 0);
vollautomatisch gehts rein von der winapi her nicht.
-
Ich habe sowas immer mit subclassing gemacht - nur wenn die Listbox ist 'gescrollt' nach unten oder wenn ist leer, wird gescrollt
WNDPROC g_ListBoxProc; LRESULT CALLBACK MyListboxProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam),LRESULT { SCROLLINFO si; if (uMsg == LB_ADDSTRING) { si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo(hwnd, SB_VERT, &si); } LRESULT result = CallWindowProc(g_ListBoxProc, hwnd, uMsg, wParam, lParam); if (uMsg == LB_ADDSTRING) { if ((si.nPos + si.nPage) > si.nMax) { PostMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0); } } return result; } CDlg::OnCreate() { // autoscroll HWND hwndListBox = GetDlgItem(m_hwnd, IDC_LOG); g_ListBoxProc = (WNDPROC)SetWindowLong(hwndListBox, GWL_WNDPROC, (LONG)MyListboxProc); SetWindowLong(hwndAnotherListBox, GWL_WNDPROC, (LONG)MyListboxProc);
-
Am einfachsten ist es sich mit LB_GETITEMHEIGHT die Höhe zu ermitteln, die gesamte Höhe mit GetClientRect zu holen. Ein wenig Division und Subtraktion und dann mit LB_SETTOPINDEX den adäquaten Top-Index zu setzen.
-
vielen dank euch drei
alle lösungen ham was. hm wird schwer. tendiere atm zum subclassing, da ich das
nur einmal machen muss (eine änderung nach Create statt 100 beim aufruf).MfG scroller