R
@RHBaum
Eigentlich hast du recht, mit dem bestrafen Aber Spaß beiseite. Das Prinzip funktioniert folgendermaßen:
In meiner MDI Anwendung halte ich im Dokument alle Zeichen des Fonts als CObListe. Ein Zeichen ist eigentlich nichts anderes als ein 2 dimensionales Array [50][90], in dem die Werte schwarz oder weiß gespeichert sind (schwarz für ein gesetztes Pixel).
Damit ich nun alle Zeichen in einem extra Fenster anzeigen kann, habe ich eine CObListe von genausovielen Bitmaps erstellt, wie Zeichen im Font vorhanden sind. Außerdem habe ich dazu passend auch eine CObListe von Gerätekontexten erstellt, damit die Bitmaps überhaupt auf dem Bildschirm darstellbar sind. Beim Erzeugen werden die Bitmaps Pixel für Pixel gefüllt. Dargestellt werden diese Bitmaps tabellarisch, d.h. 16 Zeilen und x Spalten. Das ganze sieht wie folgt aus:
// Bitmap Liste
CObList m_BmpObjList;
CBitmap* m_pBmpList;
// Liste Speicherkontext
CObList m_CDCObjList;
CDC* m_pCDCList;
CClientDC dcScreen(this);
// Anlegen von k Bitmaps und Speicherkontexten in der Liste
for(int k=0; k<nSum; k++)
{
m_pBmpList = new CBitmap;// Anlegen eines CBitmap-Objektes
m_BmpObjList.AddTail(m_pBmpList); // Einfügen in die Bmp-Liste
m_pBmpList->CreateCompatibleBitmap(&dcScreen,50,90);
// Speicherkontext
m_pCDCList = new CDC;
m_CDCObjList.AddTail(m_pCDCList);
m_pCDCList->CreateCompatibleDC(&dcScreen);
}
Da jedes Bitmap in der Liste der gleichen Position meiner Zeichenliste entspricht, errechne ich über
pDC->GetClipBox()
und durch die Spalten und Zeilen die Zeichen, die nur beim Scrollen dargestellt werden sollen und übergebe die errechneten Indexwerte meiner Funktion
CFontView::DrawFont(ZeichenNr)
, welche über den Wert 'ZeichenNr' das entsprechende Bitmap lädt und dann
pDC->StretchBlt(....m_pCDCList...);
aufruft, womit das Bmp auf den Bildschirm projiziert wird.
Ich hoffe ich konnte dir (und natürlich auch den anderen) den Ablauf etwas besser erläutern
Gruß