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

  • Mod

    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


Log in to reply