CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Właściwości czcionki

Właściwości czcionki

dział ogólny

Re: Właściwości czcionki

Nowy postprzez mckri » piątek, 4 marca 2011, 15:35

Jest nieudokumentowany sposób pobierania nazwy kroju czcionki, na razie w delphi:


KOD delphi:     UKRYJ  
procedure TForm1.Button1Click(Sender: TObject);
var
 dwLength: DWORD;
 hDll: THandle;
 GetFontResourceInfo: function(wzFontName: PWideChar; var
dwBufSiz: DWORD;
   wzBuffer: PWideChar; dwInfo: DWORD): DWORD; stdcall;
  wzFontInfo: array[0..MAX_PATH] of WideChar;
begin
 hDll := GetModuleHandle(gdi32);
  GetFontResourceInfo := GetProcAddress(hDll,
'GetFontResourceInfoW');
  dwLength := SizeOf(wzFontInfo);
  GetFontResourceInfo('Arial.ttf', dwLength, wzFontInfo, 1);
  ShowMessage('Font name = ' + wzFontInfo);
end;
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 15:59

Ten kod wydaje się być niekompletny, albo źle go przetłumaczyłem:

KOD cpp:     UKRYJ  
DWORD __stdcall GetFontResourceInfo(wchar_t wzFontName[], DWORD dwBufSiz,
               wchar_t wzBuffer[], DWORD dwInfo)
{
 HMODULE hDll;

 hDll = GetModuleHandle(gdi32);

 GetProcAddress(hDll, "GetFontResourceInfoW");
}
//-----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 DWORD dwLength;

 wchar_t wzFontInfo[MAX_PATH];
 dwLength = sizeof(wzFontInfo);

 GetFontResourceInfo( L"Arial.ttf", dwLength, wzFontInfo, 1);

 Label1->Caption = (String)wzFontInfo;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez mckri » piątek, 4 marca 2011, 16:13

Poniższy kod odczytuje nazwę czcionki. Nie radzi sobie jednak z czcionkami systemowymi .fon. Z OpenType nie sprawdzałem, bo takiej nie posiadam.
Żeby odczytać nazwe kroju, wcześniej oczywiście czcionka musi istnieć w zasobach.

KOD cpp:     UKRYJ  
 WCHAR g_szTypeFaceName[LF_FULLFACESIZE];
 typedef BOOL (WINAPI *PGFRI)(LPCWSTR, DWORD *, LPVOID, DWORD);
 HINSTANCE hDLL = LoadLibraryW(L"GDI32.DLL");
 PGFRI GetFontResourceInfoW = (PGFRI)GetProcAddress(hDLL, "GetFontResourceInfoW");
 DWORD dwSize = sizeof(g_szTypeFaceName);
 if (!GetFontResourceInfoW(L"85f874.fon", &dwSize, g_szTypeFaceName, 1))
 {
                ShowMessage("blad odczytu");
                return ;
 }
 else
 {
         ShowMessage(g_szTypeFaceName);
 }



Strukura pliku czcionki wydaje się zbyt zakręcona. Jak dla mie powyższy kod wystarcza.
Pozdrawiam.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 19:07

Nie wiem, czy zauważyłeś, że podany przez Ciebie kod sprawdza nazwę tylko czcionek zainstalowanych. Zmodyfikowałem go nieco, tak by obsługiwał również czcionki nie zainstalowane w systemie. Zadanie jest realizowane po prostu poprzez tymczasowe instalowanie czcionek za pomocą funkcji AddFontResource oraz poprzez odinstalowywanie tej czcionki po sprawdzeniu nazwy za pomocą funkcji RemoveFontResource. Instalowanie odbywa się oczywiście bez kopiowania czcionki do katalogu Fonts. U mnie funckja obsługuje czcionki *.fon.
KOD cpp:     UKRYJ  
void TForm1::GetFontName(String sFontFile, String *FontName)
{
 BOOL removeFont = false;

 if(AddFontResource( sFontFile.c_str())) removeFont = true;

 WCHAR g_szTypeFaceName[LF_FULLFACESIZE];

 typedef BOOL(WINAPI *PGFRI)(LPCWSTR, DWORD *, LPVOID, DWORD);

 HINSTANCE hDLL = LoadLibraryW(L"GDI32.DLL");

 PGFRI GetFontResourceInfoW = (PGFRI)GetProcAddress(hDLL, "GetFontResourceInfoW");

 DWORD dwSize = sizeof(g_szTypeFaceName);

 if(!GetFontResourceInfoW( sFontFile.c_str(), &dwSize, g_szTypeFaceName, 1))
 {
  ShowMessage("Błąd odczytu");
  return ;
 }

 *FontName = (String)g_szTypeFaceName;

 if(removeFont) RemoveFontResource(sFontFile.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 OpenDialog1->Options = TOpenOptions() << ofOldStyleDialog;
 if(OpenDialog1->Execute())
 {
  String FontName;
  GetFontName( OpenDialog1->FileName, &FontName);
  Label1->Caption = FontName;
 }
}


Jak widać w kodzie, do wybierania czcionki posłużyłem się obiektem TOpenDialog. Niestety, to okno dialogowe nie pozwala wybierać czcionek z katalogu C:\Windows\Fonts\ dlatego w kodzie włączany jest stary styl tego okna dialogowego, a to dlatego, że w starym stylu nie ma problemu z wybieraniem czcionek.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Właściwości czcionki

Nowy postprzez mckri » piątek, 4 marca 2011, 20:37

Wiem, że czcionka musi istnieć w zasobach. Napisałem to w poście.
Żeby odczytać nazwe kroju, wcześniej oczywiście czcionka musi istnieć w zasobach.
Avatar użytkownika
mckri
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): piątek, 15 sierpnia 2008, 13:48
Podziękował : 10
Otrzymał podziękowań: 2
System operacyjny: Windows Vista SP2
Kompilator: BCB 5/2007/2009
    Windows VistaOpera

Re: Właściwości czcionki

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 20:38

Jeszcze trochę to poprawiłem, by uzyskać więcej informacji o czcionce. Nie udało mi się jednak opracować skutecznej metody na rozpoznawanie typu czcionki. W przykładzie kod, który miał realizować to zadanie został wy-komentowany:
KOD cpp:     UKRYJ  
String CurrentFontName;
bool __stdcall InfoFontProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme,
      DWORD FontType, TListBox *ListBox1)
{
 String fontName = (String)lpelfe->elfFullName;
 if(CurrentFontName.LowerCase() == fontName.LowerCase())
 {
  String fName = "Nazwa: " + fontName;

  if(ListBox1->Items->IndexOf(fName))
  {
   ListBox1->Items->Add(fName);
   ListBox1->Items->Add("Styl: "  + (String)lpelfe->elfStyle);
   /*
   NEWTEXTMETRIC TextMetric;
   TextMetric = lpntme->ntmTm;

   String fType;
   switch(TextMetric. ntmFlags)
   {
    case 64: fType = "TrueType"; break;
    default: fType = "OpenType";

   }
   ListBox1->Items->Add("Typ: " + fType); */

   ListBox1->Items->Add("Skryty:  " + (String)lpelfe->elfScript);
  }
  else
    ListBox1->Items->Add("              " + (String)lpelfe->elfScript);
 }

 return true;
}
//---------------------------------------------------------------------------
void TForm1::GetFontName(String sFontFile, String *FontName, TListBox *ListBox1)
{
 BOOL removeFont = false;

 if(AddFontResource( sFontFile.c_str())) removeFont = true;

 WCHAR g_szTypeFaceName[LF_FULLFACESIZE];

 typedef BOOL(WINAPI *PGFRI)(LPCWSTR, DWORD *, LPVOID, DWORD);

 HINSTANCE hDLL = LoadLibraryW(L"GDI32.DLL");

 PGFRI GetFontResourceInfoW = (PGFRI)GetProcAddress(hDLL, "GetFontResourceInfoW");

 DWORD dwSize = sizeof(g_szTypeFaceName);

 if(!GetFontResourceInfoW( sFontFile.c_str(), &dwSize, g_szTypeFaceName, 1))
 {
  ShowMessage("Błąd odczytu");
  return ;
 }

 *FontName = (String)g_szTypeFaceName;

 CurrentFontName = *FontName;
 ListBox1->Items->Clear();
 EnumFontFamiliesEx( GetDC(0), NULL, (FONTENUMPROC)InfoFontProc, (LPARAM)ListBox1, 0);

 if(removeFont) RemoveFontResource(sFontFile.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 OpenDialog1->Options = TOpenOptions() << ofOldStyleDialog;
 if(OpenDialog1->Execute())
 {
  String FontName;
  GetFontName( OpenDialog1->FileName, &FontName, ListBox1);
  Label1->Caption = FontName;
  Label2->Caption = OpenDialog1->FileName;
 }
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 53 gości

cron