Text in Bitmap (anhand Textlänge)
-
Ich habe folgendes Problem:
Ich habe einen CString, den ich in ein CBitmap packe. Der Text wird mittels Edit-Feld im Dialog eingegebne und soll dann in das Bitmap "reingemalt" werden. Klappt auch soweit ganz gut. Nur habe ich das Problem, dass ich bis jetzt eine Feste Breite angebe um das Bitmap zu zeichnen. Ich würde aber gerne haben, dass das Bitmap die Breite bekommt, die der Text hat. Habe es mit .GetLength versucht, aber leider entsprechen die Zeichen ja nicht den Pixeln für die einzelnen Zeichen. Gibt es eine Funktion, die das umrechnet oder muss ich mit einem Pauschalwert von Bsp. 5 Pixel pro Zeichen rechnen.
Hier meine Zeichenfunktion:
void Cproj_1Dlg::TextToBitmap(CString value, int pos_x, int pos_y) { CBitmap cBitmap; CDC cDC; CDC* pDC = this->GetDC(); int loop = 0; int wBit = 0; //TextCount = value.GetLength(); //Create a bitmap and set the options cDC.CreateCompatibleDC(pDC); cDC.SetBkColor(RGB(0,0,0)); cDC.SetTextColor(RGB(255,255,255)); cBitmap.CreateCompatibleBitmap(pDC, 64, 8); //<- Erstellen des Bitmaps mit breite 64pixel und Höhe 8pixel //Select the bitmap and write into it cDC.SelectObject(&cBitmap); cDC.SelectObject(&cFont); cDC.TextOutW(pos_x, pos_y, value, TextCount); pDC->StretchBlt(20, 20, 128, 32,& cDC, 0, 0, 32, 8, SRCCOPY); cDC.DeleteDC(); cBitmap.DeleteObject(); }Danke
-
-> GetDeviceCaps wäre einen Blick wert

grüssle

-
Bringt mich nicht wirklich weiter... In welchem Zusammenhag soll ich das bitte nutzen?
-
war wohl etwas schreibfaul

GetDeviceCaps -> LOGPIXELSX
Bei LOGFONT( MSDN ) nachschauen, ist ein Beispiel zur Umrechnung für die Höhe. Auf die Breite übertragen und du hast die Breite deines Bitmaps in Points. Dann in Pixel, ist halt ne ewige rechnerei.
also: Stringlänge x Länge( einzelnes Zeichen );Aber vllt gehts auch schneller / einfacher.
grüssle

-
Leider ist das nicht das richtige.
cFont.CreateFontW(10, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, _T("Small Fonts")); LOGFONT font; cFont.GetLogFont(&font); PixelFont = font.lfWidth;Wenn ich das so mache, dann habe ich eine lfWidth von 0. Wenn ich in CreateFont() die Breite der Schrift auf z.B.4 stelle, dann ist lfWidth auch 4, aber das entspricht nicht der wirklichen Breite des Zeichens ('A' z.B. hat in der Schriftart "SmallFonts" eine Breite von 5 Pixeln, 'F' nur 4). Und er passt die Zeichen auch nicht dementsprechend an. Das bringt mich also nicht wirklich weiter.
EDIT:
HAb gerade herrausgefunden, dass 5 die kleinste Zeichenbreite ist