Ich habe ein Problem beim Scrollen großer Bereiche in einem CScrollView festgestellt. Wenn Sie die Bildlaufleiste langsam von oben nach unten bewegen, ist das folgende Verhalten: Zunächst funktioniert das Scrollen gut. Zu einem gewissen Zeitpunkt macht das Scrollen weiter nichts, stattdessen wird das obere Ende des Bereichs angezeigt. Irgendwann beginnt das Scrollen wieder von oben.CScrollView scrollt nur durch Teile eines großen Bereichs
Hier ist ein kleines Beispiel. Ich habe ein neues MFC-Projekt mit dem Dokumentansichtsmodell erstellt und CScrollView als Ansichtsklasse verwendet. Ich habe den folgenden Code einen großen Bereich zu erstellen und einen Text hinzufügen zu zeigen, der Teil zur Zeit angezeigt wird:
void CScrollViewTest2View::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100*1000;
SetScrollSizes(MM_TEXT, sizeTotal);
for(int i = 0; i < 1000; i++)
{
CStatic* label = new CStatic();
label->Create(NULL, WS_CHILD | WS_VISIBLE, CRect(10,10 + i*100,100,30 + i*100), this);
CString text;
text.Format(L"%d",i);
label->SetWindowText(text);
}
}
Wenn ich den folgenden Code, den ich sehen, dass während der Scrollen der Wert ‚nPos‘ scheint zu wickeln um. Dies würde das Verhalten erklären. Aber ich weiß nicht, wie ich das umgehen soll.
BOOL CScrollViewTest2View::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
{
CString msg;
msg.Format(L"nPos = %u\n",nPos);
TRACE(msg);
return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}
und hier ist der Ausgang, wenn es nicht mehr steigt:
nPos = 27826
nPos = 29190
nPos = 30281
nPos = 31372
nPos = 31645
nPos = 32464
nPos = 4294938588
nPos = 4294939134
nPos = 4294939407
nPos = 4294939680
nPos = 4294940225
nPos = 4294940771
So ist es eine Möglichkeit, eine CScrollView zu verwenden komplett mit einer großen Fläche nach unten zu rollen?
Der Code des Beispielprojekts kann here gefunden werden.
'CScrollView' verwendet' SetScrollRange' und andere alte Funktionen, die 16-Bit-Grenze haben, es geht nur bis zu '32767'. Es sollte 'SetScrollInfo/GetScrollInfo' verwenden, aber sie haben sich nicht um die Aktualisierung gekümmert. Sie haben ein zusätzliches Problem beim Erstellen von statischen Steuerelementen, deren Koordinaten außerhalb des 16-Bit-Bereichs liegen. Ich denke nicht, dass es dafür eine Lösung gibt. –
Also, wenn ich meine eigene Version von 'CScrollView' mit 'SetScrollInfo/GetScrollInfo' schreiben würde, würde ich dieses Problem umgehen? Weißt du, ob jemand das schon getan hat und es zur Verfügung stellt? Und was genau ist das Problem mit statischen Kontrollen und Koordinaten aus dem 16-Bit-Bereich? Danke für Ihre Hilfe. – sietschie
Ich glaube nicht, dass etwas getan werden kann, um Fenstersteuerungen außerhalb von 32767 zu platzieren. Ich habe einen Fix für 'CScrollView' hinzugefügt, es ist für normales Zeichnen gedacht, ansonsten solltest du vielleicht HTML Dialog oder eine andere Lösung in Betracht ziehen. –