Zeiger auf Klasse PrivateFontCollection erstellen

Hallo Muepe32,

den Parameter 6 der "GetCharacterPlacement(,,,,n);" hatte ich mit 0 und auch mit dem Rückgabewert der Funktion GetFontLanguage(), auch maskiert mit FLI_MASK beglückt.
Auch die DWORD ändern nichts.

Code:
DWORD dLangInfo = GetFontLanguageInfo(hdcEdit);
DWORD dFlags = dLangInfo | FLI_MASK;

DWORD dRet = GetCharacterPlacement(hdcEdit, acChPl, nCount, nMaxExtent, &lpResults, dFlags);

Ich stelle fest, dass der Handle zum Device Context nicht gültig ist oder auf eine anderes Steuerelement zeigt.
Der Versuch über den Device Context Handle auf das Steuerelement zu schreiben läuft schief.
Code:
HWND hwndEdit = GetDlgItem(_instance->hDlg, IDC_EDIT1);
HDC hdcEdit = GetDC(hwndEdit);

bool b = TextOutA( hdcEdit , 0 , 0 , "TEST" , 4 );
Jetzt versuche ich ob es an den x- y- Koordinaten liegen mag.




mfG.
fujitsufan
 
Ich habe mich mal ein bisschen mehr durch die Dokumentation gelesen und folgender Code erzeugt bei mir das gewünschte Ergebnis:
C++:
	HFONT hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Arial");
	HDC hDc = GetDC(m_hWindow);
	HGDIOBJ oldObj = SelectObject(hDc, hFont);
	GCP_RESULTS results = { 0 };
	results.lStructSize = sizeof(GCP_RESULTS);
	results.nGlyphs = 1;
	results.nMaxFit = 1;
	DWORD dwRet = GetCharacterPlacement(hDc, "H", 1, 0, &results, 0);
	SelectObject(hDc, oldObj);
	ReleaseDC(m_hWindow, hDc);

	Log::Print("%u / %u\n", LOWORD(dwRet), HIWORD(dwRet));

Allerdings ist es so, dass die Höhe irgendwie für jeden Buchstaben gleich ausgegeben wird, sei es ein 'H' oder ein 'a'. Ob die Funktion also wirklich das richtige ist für dich sei dahingestellt :P

Gruss
Muepe
 
Hallo Muepe32,

sieht gut aus.

Die Rückgabewerte (Höhe und Breite) der Schriftzeichen variiert von Font zu Font. Ändert man die Zeichen, da hast Du recht, bleibt zumindest die Höhe gleich. Die Breite ändert sich.
Ich nehme an die einzelnen Schriftzeichen belegen innerhalb des Fonts alle den gleiche Höhenbereich. Selbst untenhängende Zeichen wie das "j" unterliegen alle dem gleichen Höhenbereich. Wäre für meine Zwecke völlig ausreichend.

Jetzt habe ich auch mein Fehler gefunden warum die Funktion "GetCharacterPlacement(,,,,)" immer 0 zurückgab.
Ich hab´ vergessen vor dem Aufruf der Funktion "GetCharacterPlacement(,,,,)" den Eintrag "lStructSize" auf einen gültigen Wert zu setzen. Sorry.

Vielen Dank für deine Geduld!
fujitsufan
 
Hallo Muepe32,

kennst Du eine direkte Konvertierung von GDI+ Font in einen HFONT.

Bis jetzt habe ich eine Zeiger auf eine Privat Schriften Tabelle.

Code:
static  PrivateFontCollection *pfc1 ;

Um einem Steuerelement den Font zuzuweisen benötige ich eine HFONT.
Code:
SendMessage ( hwndEdit , WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
Ich habe aber nur eine GDI+ Font greifbar.
Code:
Gdiplus::Font myFont(wcstring, fontSize, iStyle, UnitPoint, GdiPlusBitmap::pfc1);
Kann ich hier konveriteren?

mfG.
fujitsufan
 
Zuletzt bearbeitet:
Hallo Muepe32,

jetzt habe ich eine Funktion geschrieben, die mir den GDI+ Font in einen HFont konvertieren soll. Diese Konvertierung brauche ich an allen Ecken.

HEADER
Code:
static HFONT GdipFontToHfont(Gdiplus::Font gdipFont);

CPP
Code:
HFONT GdipFontToHfont(Gdiplus::Font gdipFont)
{
	HFONT hFont = NULL;

	//LOGFONG Objekt erstellen
	LOGFONT lfFont;
	FillMemory ( (PVOID) &lfFont,  sizeof(lfFont),  0x0);

	//Gdiplus::Font::GetLogFontA(gdipFont, lfFont);

	return hFont;
}
Diese Funktion ist noch nicht fertig, es geht lediglich um den Übergabeparameter.

Bis hierher wir fehlerfrei compiliert.

Anwendung:
Code:
//GDI+ Font aus Privat-Schrift Tabelle ermitteln über Zeiger "pfc1"
    Gdiplus::Font myFont(wcstring, fontSize, iStyle, UnitPoint, GdiPlusBitmap::pfc1);


//GDI+ Font in HFont konverieren
	HFONT hNewFont = GdipFontToHfont(myFont);

Bei Funktionsaufruf meckert der Compiler.
error C2248: "Gdiplus::Font::Font": Kein Zugriff auf private Member, dessen Deklaration in der Gdiplus::Font-Klasse erfolgte.


Die Funktion "Gdiplus::Font::GetLogFont(,)" hört sich gut an. Aber wo zu Hölle bekomme ich jetzt wieder den 1. Parameter her. Es wird kein Gdiplus::Font verlangt.

********



mfG.
fujitsufan
 
Zuletzt bearbeitet:
Hi fujitsufan,

Der Copykonstruktor von Gdiplus::Font ist privat, daher kannst du darauf nicht zugreifen. Das ist auch gut so, wäre es doch auch zu viel Overhead für jede Konvertierung das Gdiplus::Font-Objekt noch zu kopieren. Du kannst es als Referenz übergeben:
C++:
HFONT GdipFontToHfont(const Gdiplus::Font& gdipFont)
 
Hallo Muepe32,

noch was, was ich nicht verstehe.

Ich erstelle ein Font mit bestimmter Schrifhöhe und sende diesen an ein Textfeld, welches ich zuvor erstellt habe.
Code:
HWND hwndEdit = CreateWindow("edit",textToDraw.c_str(),WS_CHILD|WS_VISIBLE|WS_DLGFRAME,10,50,450,200,hwndRealSize,(HMENU)0xf001,hInstance,NULL);
hdcEdit = GetDC(hwndEdit);
Code:
HFONT hFont = CreateTFTFont(hdcEdit, hdcEdit, FontName, iActFontSize, 0, Laufweite, iStyle, &BFontEx);
HGDIOBJ oldOgj = SelectObject(hdcEdit, hFont);
SendMessage ( hwndEdit , WM_SETFONT, (WPARAM)hFont, MAKELPARAM(TRUE, 0));
Lese anschließend die Text Metrics aus.
Code:
GetTextMetrics(hdcEdit, &tmMetric);
Stelle fest, dass es Schriften gibt, die Bereiche unter und Bereiche über der Basislinie beschreiben (tmMetric.tmAscent und tmMetric.tmDescent).

Frage: Ist es überhaupt möglich den Font so zu korrigieren, dass ein Zeichen, z. Bsp. das 'H' in jeder gewählten Schrift gleich hoch dargestellt wird?

mfG.
fujitsufan
 
Zurück