[mfc] Scrollen beschleunigen + Scrollabbschnitte verkleinern?

Hallo ich abbeite mit VisualStudio 7 an einem SDI Projekt und meine Ansichtsklasse ist von CScrollView abgeleitet.

Nun hab ich in diesem View sehr viel Text. Dementsprechend groß ist auch der Scrollbereich. Daraus ergeben sich zwei Probleme:


  1. Das scrollen verläuft sehr langsam, wie kann ich das Scrollen optimieren?
  2. Auch wenn man nur kurz auf den Pfeil auf der scrolleiste drückt wird ein zu großer Abbschnitt gescrollt. Wie kann ich einstellen wieviel gescrollt wird?

Zum besseren Verständnis mein Code:

C++:
void CDctMainView::OnDraw(CDC* pDC)
{
	CDctMainTxt txt;
	if(IsFirstTime)
	{
		m_ptOldScrollPos.y=-1;
		m_pDoc = GetDocument();//Zeiger auf Doc
		IsFirstTime=false;
		txt.LoadTxtD2L();
		m_StrTxt=txt.m_strD2L;
	}
    
	
	SetScrollSizes(MM_TEXT,CSize(1000,450000));
	m_ptScrollPos=GetScrollPosition();
		
	
		
	CBitmap bg;
	BITMAP bm;
	bg.LoadBitmap(IDB_PAPIER);//BITMAP laden
	bg.GetObject(sizeof(bm),&bm);
		
	CDC speicherDC;
	speicherDC.CreateCompatibleDC(pDC);
	speicherDC.SelectObject(&bg);
		
         RECT rect;
	GetClientRect(&rect);
	pDC->StretchBlt(0,m_ptScrollPos.y,rect.right-         rect.left,rect.bottom,&speicherDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

	.....//Font erstellen und selektieren
	RECT myrect;
         .....//myrect initialisiern
	pDC->DrawText(m_StrTxt,&myrect,0);

	if(m_ptScrollPos.y != m_ptOldScrollPos.y)//falls gescrollt wurde
	{
		RedrawWindow();
		m_ptOldScrollPos.y=m_ptScrollPos.y;
		IsChanged=false;
	}
}

Kann mir bitte jmd helfen :( :(
 
Hi DigitalRevolution,

die schlechte Performance kommt daher, dass du zu viel unnötigen Code in der OnDraw Funktion verwendest.

SetScrollSizes() nur dann aufrufen, und dann auch nicht in OnDraw(), wenn sich diese auch wirklich ändert! Von mir aus in OnZoomChanged() oder so..

Zusätzlich setze die ScrollSizes auf die korrekten Werte und nicht fix auf CSize(1000,450000). Dann sollten deine Scrolleinheiten auch passen!


Die Funktion StretchBlt ist sehr sehr langsam, und diese wird bei jedem Scrollen und jedem neuzeichnen aufgerufen.

Verzichte auch darauf, die Bitmap bei jedem Zeichenvorgang neu zu laden!

Halte dir stattdessen die Originalbitmap als Membervariable in deiner Klasse!

Ich nehme an, IDB_PAPIER soll so was wie ein Hintergrundbild für deine Fensterklasse sein.

Dann solltest du diese in dem MessageHandler OnEraseBkgnd() zeichnen und versuche Tiles zu zeichnen, anstatt eine Bitmap jedesmal auf die neue Fenstergröße per StretchBlt() zu zoomen.

Das sollte die Performance ungemein steigern und sieht zudem viel besser aus ;-)

Ganz schlecht ist auch der Aufruf von RedrawWindow() in OnDraw().

Hoffe dir einige Anregungen gegeben zu haben.


Schönen Gruß,

Peter
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück