Jak uzyskać taką samą czcionkę z CreateFont jak TFont pod VCL.

2013-09-10 03:20
0

Cześć. Zwykle staram się radzić sobie sam, ale tutaj liczę na pomoc osób ogarniających WinAPI i temat czcionek. Każda rada się mi przyda.

Przymierzam się do przepisania mojego plugina dla Total Commandera z VCL na WinAPI. I póki co robię sobie wprawki testując pewne rzeczy. I natrafiłem na problem. Chciałbym aby mój ListBox miał identyczną czcionkę jak widać na screenie u samego dołu. Pod Delphi i VCL jest to po prostu standardowy font pod Windows 7 o nazwie Terminal. Styl: zwykły. Rozmiar: 12. Rysowanie i kolorowanie odbywa się przez obsługę OwnerDraw. Dla WinAPI font tworzę tak:

  Fnt := CreateFont(-18, 0, 0, 0, FW_NORMAL, 0, 0, 0,
    ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
    DEFAULT_QUALITY, DEFAULT_PITCH, 'Terminal');
  SendMessage(SamplesLBHandle, WM_SETFONT, Fnt, 1);

I efekt jest taki:
my_plugin_dlg_test.jpg

A chciałbym najlepiej tak, wtedy przy rozszerzeniu okna TotalCmd (wtedy kontrolki w groupboxie plugin przesuwa obok ListBoxa) widać na Listboxie dokładnie 31 pozycji o wysokości po 13 pikseli każda (taki jest ListBoxowy ItemHeight). Dodatkowo każdy wiersz jeśłi jest maksymalnej długości, wypełniony tekstem plus wolne miejsce na ScrollBar ListBoxowy, kiedy ListBox nie mieści wszystkich elementów (na przykład przy wybraniu widoku instrumentów dla modułów IT/XM lub zwężonym oknie podglądu.
my_plugin_in_fullscreen.jpg
Prosił bym o podpowiedzi jak to osiągnąć. Kombinowałem stawiając BreakPoint na CreateFontA w wersji okienkowej mojego playera (początkowo miał to być osobny program, ale stwierdziłem że plugin jest wygodniejszy bo odpada zabawa z całą obsługą dla plików, wystarczy je teraz tylko ładować.

Póki co plugin w wersji 0.2 z błędnie działającym TFlatScrollBarem, który poitrafi wywalić błędy AV jest na: http://www.totalcmd.net/plugring/modules_player.html - planuje go w wersji 0.3 jeśłi przejdzie testy zastapić zwykłym ScrollBarem. Natomiast docelowo następna wersja - jeśli się uda- będzie w WinAPI. Wtedy może pomyslę nad udostępnieniem source.

I dodam, że próbowałem pod OllyDbg zakładać pułpaki w wersji okienkowej programu VCL (bo taką też mam) na CreateFontA. Jednak tam tworzony jest tylko dwukrotnie domyślny font dla MS Sans Serif, a więc raczej nie tędy droga :/


edytowany 2x, ostatnio: olesio, 2013-09-10 03:30

Pozostało 580 znaków

2013-09-10 09:01
0

nie bardzo rozumiem - piszesz, że standardowo fint ma rozmiar 12 a Ty tworzysz go z rozmiarem 18 :/.
No i czytałem to kilka razy ale nie jestem do końca czy zrozumiałem z czym masz problem :) - chodzi Ci o wielkość czcionki?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2013-09-10 09:06
0

Nie wiem jak działają pluginy TC ale czy nie możesz po prostu pobrać czcionki z tamtej kontrolki i utworzyć na jej bazie takiej samej? Chodzi mi o coś w stylu:

  hFont:= SendMessage(hWnd, WM_GETFONT, 0, 0);
  ZeroMemory(@lf, SizeOf(LOGFONT));
  GetObject(hFont, SizeOf(LOGFONT), @lf);
  hFont:= CreateFontIndirect(lf);

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.

Pozostało 580 znaków

2013-09-10 09:18
0

Jeżeli w VCL ci działa to wykorzystaj ten VCL lub weź zajrzyj do źródeł i zaadoptuj fragment kodu. Jeżeli nie masz kodu VCL to weź go z lazarusa lub starszego delphi, na tak niskim poziomie nie powinno być różnić.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
"Przymierzam się do przepisania mojego plugina dla Total Commandera z VCL na WinAPI" - Azarien 2013-09-10 12:44

Pozostało 580 znaków

2013-09-10 12:49
0

Terminal nie jest czcioną TrueType, tylko rastrową przeznaczoną do konsoli. Spróbuj dać OEM_CHARSET zamiast ANSI_CHARSET.

Pozostało 580 znaków

2013-09-10 13:25
0

Dziękuje wszystkim za odpowiedzi. Niestety problem nadal nierozwiązany. Ponieważ...

@Azarien: niestety to nie pomaga. Na moje oko to czcionka dalej nie jest identyczna. Czyli 31 elementów nie wypełnia całego ListBoxa na ustawioną wysokość (342 dla dialogu zdefiniowanego w pliku *.rc).

@kAzek: nie zrozumiałeś, nie urządza mnie taki kod. Bo jak niby mam pobrać coś z kontrolki VCL? Jak docelowo cały plugin ma być w WinAPI. Nie będę miał się z czego wzorować. Kontrek VCL nie będzie. O ile wiem to pokazanie na przykłąd przez MessageBox i IntToStr zwróconego HFONT, a późnej przypisanie takiej liczby nic mi nie da.

@abrakadaber: poczytaj http://msdn.microsoft.com/en-[...]esktop/dd183499(v=vs.85).aspx - to -18, jest wartością jaką dla ListBoxa zwraca mi Font.Height. I stąd się to wzieło, nie jest to mój wymysł. Te 12 to wartość Font.Size. Oczywiście tutaj mowa o TFont.

I dodam, że cięzko mi doszukać się odpowiedniego kodu w modułach VCL, ktore mam "podkranięte" z wersji Enterprise. Dlatego pytam na forum.


edytowany 2x, ostatnio: olesio, 2013-09-10 13:27
@olesio aha no tak nie zrozumiałem że tamtej kontrolki docelowo nie będzie..., ok wiadomo że podanie uchwytu czcionki na stałe nic nie da bo jest on "jednorazowy" ale jeżeli o tym mowa to możesz podejrzeć co masz w zmiennej lf (po GetObject oczywiście) i tak samo wypełnisz strukturę już na stałe w kodzie utworzysz czcionkę funkcją CreateFontIndirect wtedy teoretycznie powinna być taka sama. Prosty "testowy" programik FindWindow, FindWindowEx + kod który podałem 5 min roboty i można sprawdzić. - kAzek 2013-09-10 15:55
@kAzek: ok, tak zrobie, bo zobaczyłem na MSDNie jak wygląda structura tagFONT. Tylko nie wiem czy czcionka powtórzy się identycznie, czy na rzeczy nie ma te ustawione 111℅ powiększenia ekranu w Windows 7, o czym napisałem poniżej oraz DPI, o czym wspomina poniżej @Azrien. - olesio 2013-09-10 17:38
Tego to ja też nie wiem ale z tym testem nie dużo roboty więc chyba warto spróbować. - kAzek 2013-09-10 18:55

Pozostało 580 znaków

2013-09-10 13:49
0

Wiem jak to działa bo się swego czasu tym bawiłem. Zdziwiłem się bo ja dla size = 12 mam height = -16 więc nijak mi nie wychodziło Twoje -18 :). A ustaw zamiast wartości absolutnej -18 te 12


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
U mnie to samo: Size = 12 daje Height = -16, Size = 13 daje Height = 17, a Size = 14 daje Height = -19, tak że -18 nijak wyjść nie chce; Być może to kwestia ustawień w systemie, ale dokładnie nie wiem; Poza tym fonty widocznie się różnią - u @olesio nie wychodzi typowy Terminal; - furious programming 2013-09-10 13:58
Olesio wspominał, że to na W7 a tam jest chyba inne DPI - abrakadaber 2013-09-10 14:04
Mimo wszystko te fonty są różne - na dolnym zrzucie wygląda inaczej, niż u niego w programie; Tak mi się wydaje, że na jednym kompie jeden font powinien tak samo wyglądać, chyba że coś innego jeszcze przeszkadza; Różnicę widzę w cyfrze 0, która na dolnym zrzucie ma wewnątrz ukośną linię; - furious programming 2013-09-10 14:09
Jak dla mnie to są po prostu dwie różne czcionki - abrakadaber 2013-09-10 14:28
@abrakadaber: domyślne DPI jest wszędzie takie samo (96, aka “100%”), ale fakt że warto by sprawdzić jak program się zachowuje przy 120dpi (aka “125%”) - Azarien 2013-09-10 14:46

Pozostało 580 znaków

2013-09-10 14:17
0

Przy takim kodzie z innym pierwszym parametrem za radą @abrakadaber i innym OEM (hint @Azarien'a):

        LBFontH := CreateFont(12, 0, 0, 0, FW_NORMAL, 0, 0, 0,
          OEM_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
          DEFAULT_QUALITY, DEFAULT_PITCH, 'Terminal');
        SendMessage(SamplesLBHandle, WM_SETFONT, LBFontH, 1);

Mam taki efekt:
font_12.jpg
Ale faktycznie coś może jest na rzeczy z ustawieniami Windows'a. Ponieważ o ile pamiętam pod VMWare Workstation kiedy testowałem mój plugin na Windowsach: 98, XP x86 oraz 8 x64. To czcionki zarówno w ListBoxie jak i te na Labelu obok przycisków Play/Pause/Stop (to standardowy MS Sans Serif) mają inne rozmiary. Być może powodem jest ustawienie "Zwiększ czytelność ekranu" w ustawieniach Personalizuj w Windows 7 na niestandardowe 111%, ponieważ wtedy lepiej układają mi się ikonki na Pulpicie, ale nie myślałem też że ma to wpływ na czcionki w kontrolkach. Tak to wygląda na XP, gdzie nie modziłem z takimi ustawieniami, bo tam chyba nawet ich nie ma.

Plugin w akcji:
modules_player_windows_xp.jpg
Wygląd testowego dialogu (brak paska tytułowego jest celowy, bo plugin nie będzie go posiadać):
font_12_windows_xp.jpg

I teraz pytanie, jak można zrobić szerszą czcionkę, tak jak to jest przy moich 111% ustawienia w Windows 7. I żeby pod innymi systemami niż siódemka też miało to zastosowanie. Bo przyznam, że taka rozciągnięta czcionka jest dla mnie czytelniejsza. A widać, że pod WinAPI w przeciwieństwie do VCL takie ustawienia "zwiększenia czytelności" są chyba ignotowane. Co może jest i na plus, bo pod różnymi systemami wszystko będzie wyglądać tak samo. Ale za to niestety jak dla mnie czytelność sux.


Pozostało 580 znaków

2013-09-10 14:25
1

jeśli weźmiesz font skalowalny to w nWidth możesz podać jego szerokość. Ja się tak bawiłem jak pisałem programik, który wydruki na igłówkę drukował na laserówkach i to dość fajnie działa

BTW @olesio jesteś pewien, że w TC to jest Terminal - nie używam go ale pamiętam, że tam można chyba było wybrać sobie czcionkę jaka ma być w okienkach


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber, 2013-09-10 14:29
ale on MA działającą czcionkę Terminal, i taką CHCE, tylko przepisuje plugina z VCL na WinAPI i chce zachować identyczny wygląd) - Azarien 2013-09-10 15:05
no to ja się pogubiłem - który screen jest z czcionką dobrą z pluginem w VCLu a który z czcionką złą w WinAPI? - abrakadaber 2013-09-10 15:17
Dokładnie, jak napisał @Azarien. A co do screnoow to z pluginu jest ten w pierszym postcie w tym wątku, gdzie widać otwarcie pliku pod TotalCmd, a testy pod WinAPI to screen z tekstem o 22 znakach, bo tyle maksymalnie nastąpi po dwukropku i spacji po "Sxxx". - olesio 2013-09-10 17:42

Pozostało 580 znaków

2013-09-10 15:04
0

Być może powodem jest ustawienie "Zwiększ czytelność ekranu" w ustawieniach Personalizuj w Windows 7 na niestandardowe 111%, ponieważ wtedy lepiej układają mi się ikonki na Pulpicie

Echh... odstęp między ikonkami ustawia się zupełnie gdzie indziej ;-)

Przelicznik między dodatnim a ujemnym rozmiarem czcionki jest taki:

ujemna = - dodatnia * DPI / 72
dodatnia = - ujemna * 72 / DPI

gdzie DPI wyrażone w procentach jest względem 96, czyli 100% to 96, 125% to 120, a użyte przez ciebie 111% to 106,56 (co Windows zapewne zaokrągli do 107).

zatem twoje -18 przy 107 dpi odpowiada 12,11 ≈ 12 punktom.

Pozostało 580 znaków

2013-09-10 16:54
0

@Azarien: zatem mógłbym Ciebie prosić o przykład kodu użycia CreateFont, dla takiego efektu i DPI, aby uzyskać taki rezultat jak pod VCL na screenach z siódemki dla Pluginu? A ustawienia siódemki ogarniam tak sobie i te 111 procent ustawiłem kiedyś i tak zostało. Poza ikonkami zauważyłem tylko, że ma to też wpływ na domyślne powiększenie strony startowej wczytanej z pliku html pod nowszymi IE.

Zastanawia mnie też teraz rozwiązanie, które podał @kAzek. Czy jeśli bym sobie otworzył moduł w moim pluginie, ustalił HWND ListBoxa i na sztywno podając jego uchwyt bez zamykania pluginu, pobrał tę czcionkę tak jak to pokazał @kAzek, i ustawił w testowym dialogu dla "WinAPIowego ListBoxa". To jeżeli font byłby identyczny znaczy, że jednak taką informację zawiera sam typ HFONT. Jednak wątpię, skoro dochodzi kwestia DPI. Ale upewnie się dopiero jutro, będąc w domu.


edytowany 1x, ostatnio: olesio, 2013-09-10 16:56

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0