CEdit: Problem mit dem Scrollbar
-
Hallo,
ich hab ein Problem mit einem mehrzeiligen CEdit mit vertikalem Scrollbar in einer dialogbasierten Anwendung. Die Nachrichen ON_VSCROLL und ON_HSCROLL habe ich abgefangen und alles funktioniert perfekt. Das Problem ist, das keine Nachricht kommt, wenn man den Scrollbutton zieht, erst nach dem loslassen. Das ist für meine Anwendung aber zu spät, denn die Ausgaben werden beim scrollen grafisch unbrauchbar. Ich habe WM_CTLCOLOR überschrieben und dem CEdit nen Bitmap-Hintergrund und TRANSPARENTEN-Text verpasst. Der Text beginnt dann einfach zu "schmieren" während man den Button zieht. Ich muss also auch ein Ereignis bekommen können während der Benutzer den Button zieht, damit ich das saubere Zeichnen selbst übernehmen kann. Wenn ich die Pfeile oben/unten klicke kommt das Ereignis sofort, nur eben beim ziehen nicht...
Die API kennt dafür ja ne Reihe Nachrichten der Serie SB_THUMB..., diese scheinen in der MFC aber nicht reflektiert zu sein, der KA kennt sie jedefalls nicht. Was kann ich also tun, wer weis Rat?
Schonmal Dank für eure Hilfe...
-
suchst du so was ??
//h private: LRESULT OnHScroll(WPARAM wParam, LPARAM lParam); //cpp BEGIN_MESSAGE_MAP(CScrollWndD, CFWndD) //ON_MESSAGE(WM_VSCROLL, OnVScroll) ON_MESSAGE(WM_HSCROLL, OnHScroll) END_MESSAGE_MAP() LRESULT CScrollWndD::OnHScroll(WPARAM wParam, LPARAM lParam) { //TRACE("CScrollWndD::OnHScroll\n"); { SCROLLINFO si; si.cbSize=sizeof(SCROLLINFO); si.fMask=SIF_ALL; ::GetScrollInfo(m_hWnd, SB_HORZ, &si); int nPos=si.nPos; switch (LOWORD(wParam)) { case SB_LINELEFT: si.nPos -=1; break; case SB_LINERIGHT: si.nPos +=1; break; case SB_PAGELEFT: si.nPos -=si.nPage; break; case SB_PAGERIGHT: si.nPos +=si.nPage; break; case SB_THUMBTRACK: si.nPos=si.nTrackPos; break; } si.fMask=SIF_POS; ::SetScrollInfo(m_hWnd, SB_HORZ, &si, TRUE); ::GetScrollInfo(m_hWnd, SB_HORZ, &si); //TRACE("CScrollWndD::OnHScroll oPos:%i nPos:%i\n", nPos, si.nPos); if (si.nPos!=nPos) { //... }
-
Hallo, hab erstmal Dank für Deine Hilfe.
Dein Code ist Standard-Code für ein CScrollWndD, selbigen (zumindest ähnlich) verwende ich auch immer. Leider wird von einem CEdit ON_HSCROLL oder ON_VSCROLL nur gesendet, wenn der User auf die Pfeile der Scrollbar klickt. Beim Ziehen sollte das gleiche passieren und man könnte WPARAM und LPARAM auswerten...
Aber diese Nachrichten kommen eben nicht im Dialog an wenn ich die Scrollbar ziehe. Ich hab das mit TRACE und auch Breakpoints überprüft. Die Klicks auf die Pfeile, wie gesagt, schon. Ich habe auch mit SPY++ nachgesehen, das Control (bzw. die Klasse CEdit) verarbeitet diese Nachricht selbst und gibt scheinbar nur noch TRUE raus wenn man am Balken zieht. Ich werd wohl am Subclassing nicht vorbeikommen.

Naja nix zu machen, nochmals vielen Dank. Bei nem CScrollWndD wär Dein Tipp Gold wert gewesen

Gruss
-
Dank an alle die sich gedanken gemacht haben!
Nach langen hin und her musste ich feststellen, das CEdit
SB_THUMBPOSITION und SB_THUMBTRACK nicht zum Parent reflektiert...
Ich hab ne Lösung gebastelt in dem ich die Klasse CEdit einfach per
Ableitung erweitert habe. Die daraus entstandene Klasse überlässt CEdit
immernoch das behandeln der SBN_ Nachrichten (wie gehabt) und sendet - falls
SB_THUMBPOSITION und SB_THUMBTRACK behandelt wurden - diese separat zum Parent
des Controls. Somit kann im Parent auf SB_THUMBPOSITION und SB_THUMBTRACK von
einem CEdit eingegangen werden.Gruss