CFont - vyhlazení písma, WinCE – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

CFont - vyhlazení písma, WinCE – C / C++ – Fórum – Programujte.comCFont - vyhlazení písma, WinCE – C / C++ – Fórum – Programujte.com

 

TomyB
~ Anonymní uživatel
57 příspěvků
8. 4. 2018   #1
-
0
-

Ahoj, načítám vlastní TTF font přes AddResource();

a vytvářím přes

CFont font;
VERIFY(font.CreateFont(
   36,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   FW_NORMAL,                 // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   DEFAULT_QUALITY,           // nQuality
   DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
   TEXT("NewDR")));           // lpszFacename

Ale při zobrazení je text kostičkovaný, nepodařilo se mi ho vyhladit. Viz výše nelze použít ani PROOF_QUALITY, on to nezná, zkoušel jsem rovnou číslo, ale to nepomáhá.

Jak by to šlo doladit?

Ukázka jak to vypadá (nahoře) a jak by to mělo vypadat (dole).

Připojen obrázek.

Připojen obrázek.

Díky

Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
21. 4. 2018   #2
-
0
-

Takže vyhlazeno, a teď ještě bojuji s češtinou, načítám texty z txt souboru

CDC*	pDC = CDC::FromHandle(hdcMem);
CFont font;
VERIFY(font.CreateFont(
   36,                        // nHeight
   0,                         // nWidth
   0,                         // nEscapement
   0,                         // nOrientation
   400,                       // nWeight
   FALSE,                     // bItalic
   FALSE,                     // bUnderline
   0,                         // cStrikeOut
   ANSI_CHARSET,              // nCharSet
   OUT_DEFAULT_PRECIS,        // nOutPrecision
   CLIP_DEFAULT_PRECIS,       // nClipPrecision
   4,                         // nQuality
   VARIABLE_PITCH | FF_ROMAN, // nPitchAndFamily
   TEXT("NewDR")));           // lpszFacename

CFont *pFont = pDC->SelectObject(&font);
pDC->SetTextColor(g_TextColor);
pDC->DrawText(g_Caption,-1,&crect,DT_WORDBREAK);
pDC->SelectObject(pFont);
font.DeleteObject();

a nezobrazují se mi korektně některé znaky

txt file je uložen jako ANSI, takto se zobrazí některé české znaky, pod UTF-8 se zobrazi úplné nesmysly

CharSet jsem zkousel měnit, nic z hodnot nepomohlo. Věděl by někdo jak pomoci češtině?

ěščřžýáíé zobrazí takto

Připojen obrázek.

Dík

Nahlásit jako SPAM
IP: 94.113.172.–
Radek Chalupa
~ Redaktor
+1
Super člen
22. 4. 2018   #3
-
0
-

#2 TomyB
Nemělo by v createFont být spíš EASTEUROPE_CHARSET?

Pak bych ještě zkontroloval zda v tom textovém souboru je čeština opravdu kódovaná v té stránce 1250 a zda je v systému jako jazyk čeština.

Radek Chalupa
- individuální konzultace, školení programování, (C/C++, C#, WinAPI, .NET, COM, ATL, MFC...)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
TomyB
~ Anonymní uživatel
57 příspěvků
22. 4. 2018   #4
-
0
-

#3 Radek Chalupa
Tak text natvrdo vložený funguje jak s EASTEUROPE_CHARSET tak ANSI_CHARSET, čeština se zobrazí, problém bude asi s tím jak otevírám ten soubor

...
FILE * f = _tfopen(path, _T("rt"));
	if(f)
	{
		TCHAR line[1024] = {0};
		LPTSTR key;
		LPTSTR value;
		LPTSTR it;

		while(_fgetts(line, 1024, f))
		{
...


zkoušel jsem přidat "rt, ccs=UTF-8", ANSI, UNICODE, a dle toho mít uložený TXT, ale výsledek je stejný nebo nelze soubor otevřít.

Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
22. 4. 2018   #5
-
0
-

Se v tom nějak motám, přes toto jsem si načtený text převedl, v const char* vidím správný český text, ale jak s tím do DrawTextu, který chce LPCTSTR?

char *UnicodeToCodePage(int codePage, const wchar_t *src)
    {
    if (!src) return 0;
    int srcLen = wcslen(src);
    if (!srcLen)
	{
	char *x = new char[1];
	x[0] = '\0';
	return x;
	}
	
    int requiredSize = WideCharToMultiByte(codePage,
        0,
        src,srcLen,0,0,0,0);
	
    if (!requiredSize)
        {
        return 0;
        }
	
    char *x = new char[requiredSize+1];
    x[requiredSize] = 0;
	
    int retval = WideCharToMultiByte(codePage,
        0,
        src,srcLen,x,requiredSize,0,0);
    if (!retval)
        {
        delete [] x;
        return 0;
        }
	
    return x;
    }
Nahlásit jako SPAM
IP: 94.113.172.–
Radek Chalupa
~ Redaktor
+1
Super člen
22. 4. 2018   #6
-
0
-

#5 TomyB
Co je LPCTSTR záleží na tom zda projekt kompiluješ pro unicode (v tom případě je to const wchar_t*) nebo multibyte (resp. ansi) (pak je to const char*).

Pokud jak píšeš to máš správně převedené do ansi (tj char*) můžeš i v unicode projektu použít přímo ansi verzi DrawTextA, která jako parametr vždy chce char*. Naopak DrawTextW chce vždy wchar_t*. Totiž DrawText je ve skutečnosti makro, které se pomocí podmíněné kompilace nahradí buď DrawTextW nebo DrawTextA.

Radek Chalupa
- individuální konzultace, školení programování, (C/C++, C#, WinAPI, .NET, COM, ATL, MFC...)
- vývoj software na zakázku
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 89.177.51.–
TomyB
~ Anonymní uživatel
57 příspěvků
22. 4. 2018   #7
-
0
-

#6 Radek Chalupa
Kompiluji to pro Unicode.

Když to předělám na DrawTextA, tak mám error unresolved external symbol. A navíc nemůžu použít CFONT, pod HFONT nefunguje načtení vlastního fontu. Je tam výchozí Arial. :-(

Jde zkonvertovat český text z char* do w_char* bez ztráty diakritiky?

Nahlásit jako SPAM
IP: 94.113.172.–
TomyB
~ Anonymní uživatel
57 příspěvků
23. 4. 2018   #8
-
0
-

#7 TomyB
Tak jsem si udělal replace fci, a čeština jak víno :-)

LPTSTR unicodefixCZ(LPTSTR str)
{
	while(*str!='\0')
	{
		if(*str==236)
			*str=0x0115; //ě
		if(*str==353)
			*str=0x0161; //š
		if(*str==232)
			*str=0x010d; //č
		if(*str==248)
			*str=0x0159; //ř
		if(*str==382)
			*str=0x017e; //ž
		if(*str==253)
			*str=0x00fd; //ý
		if(*str==225)
			*str=0x00e1; //á
		if(*str==237)
			*str=0x00ed; //í
		if(*str==233)
			*str=0x00e9; //é
		if(*str==242)
			*str=0x0148; //ň
		if(*str==157)
			*str=0x0165; //ť
		if(*str==250)
			*str=0x00fa; //ú
		if(*str==249)
			*str=0x016f; //ů
		if(*str==239)
			*str=0x010f; //ď

		if(*str==204)
			*str=0x011a; //Ě
		if(*str==352)
			*str=0x0160; //Š
		if(*str==200)
			*str=0x010c; //Č
		if(*str==216)
			*str=0x0158; //Ř
		if(*str==381)
			*str=0x017d; //Ž
		if(*str==221)
			*str=0x00dd; //Ý
		if(*str==193)
			*str=0x00c1; //Á
		if(*str==205)
			*str=0x00cd; //Í
		if(*str==201)
			*str=0x00c9; //É
		if(*str==210)
			*str=0x0147; //Ň
		if(*str==141)
			*str=0x0164; //Ť
		if(*str==218)
			*str=0x00da; //Ú
		if(*str==217)
			*str=0x016e; //Ů
		if(*str==207)
			*str=0x010e; //Ď
		str++;
	}
	return str;
}

Připojen obrázek.

Nahlásit jako SPAM
IP: 94.113.172.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý