C++ Schriftart in Anw. verwenden ohne install (VS 08 - Formanw.)

fox40phil

Vice Admiral
Registriert
Okt. 2008
Beiträge
6.705
Hi Leute,

ich suche eine Möglichkeit eine Schriftart in meiner C++ Windows Form Anwendung zu verwenden ohne sie vorher auf den PCs installieren zu müssen.

Ich habe schon hier und da mit FontFamiliy und Ressourcen rumpobiert...komme aber zu keinem Ergebnis :(

Kann mir bitte jmd. weiterhelfen?

Grüße,

Phil
 
Wenn mit der Windows-API gerendert wird gibts die Möglichkeit soweit ich weiß nicht.
 
Sowas wird oft mit Bildern gemacht.

Du erstellst dir ein Bild, in dem alle Zeichen deiner Schrift vorhanden sind und setzt dann die jeweiligen Buchstaben zusammen um einen Text zu bekommen. Das Ganze ist zwar etwas aufwändig, aber machbar.

Gruß
BlackMark
 
Mit Bildern macht man sowas grundsätzlich nicht. Dann passt nämlich der Look-and-Feel nicht mehr. Die Schrift sieht optisch deutlich anders aus als von Windows gerendert, v.a. wenn ClearType customized ist.
 
Natürlich sieht es anders aus, es ist schließlich auch ein Bild und keine richtige Schrift, aber es ist eine funktionierende Alternative, wenn die Schriftart am Zielsystem nicht vorhanden ist.

Ich wüsste sonst keine Möglichkeit, wie man das realisieren könnte. Wenn du eine bessere Lösung dafür hast, dann würde mich das interessieren.

Gruß
BlackMark
 
Du hast recht Yuuri, mit der Funktion AddFontMemResourceEx ist es möglich.

Der C++ Code dazu sieht dann in etwa so aus:
Code:
HRSRC hResource = NULL;
HGLOBAL hGlobalResource = NULL;
void* pResource = NULL;
unsigned int uiSize = 0;

hResource = FindResource( hInstance, MAKEINTRESOURCE( FONT_RESOURCE ), _T("BINARY") );

if( hResource != NULL )
{
    hGlobalResource = LoadResource( hInstance, hResource );

    if( hGlobalResource != NULL )
    {
        pResource = LockResource( hGlobalResource );

        if( pResource != NULL )			
        {
            uiSize = SizeofResource( hInstance, hResource );

            if( uiSize != 0 )
            {
                DWORD dwFonts;
                HANDLE hFont = AddFontMemResourceEx( pResource, uiSize, 0, &dwFonts );

                if( hFont != 0 )
                {
                    SendMessage( GetDlgItem(hWnd, IDC_DLGITEM), WM_SETFONT, (WPARAM)CreateFont(14, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY, VARIABLE_PITCH, _T("Font Name")), FALSE );
                }
            }
        }
    }
}

Wobei "hInstance" die Instanz des Prozesses ist, "FONT_RESOURCE" der Wert der Resource von der Font, "IDC_DLGITEM" der Wert der Resource des Feldes dessen Schrift geändert werden soll und bei "Font Name" kommt der Name der geladenen Schrift hin.

Edit:
Falls das ganze öfter als nur einmal aufgerufen wird, sollte man die Font auch wieder löschen und den Speicher freigeben, in den die Resource geladen wurde. Ist aber nicht nötig, wenn das Ganze nur einmal verwendet wird, weil Windows das automatisch macht, sobald das Programm geschlossen wird.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Zurück
Oben