[C#] Antialiasing textu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Tepster 2. 5. 2014 19:24

Ahoj,

používám WinForms a chtěl bych, aby text byl "hezčí" - ne tolik hranatý - chci použít antialiasing.
Dělal jsem podle toho návodu (http://msdn.microsoft.com/en-us/library/a619zh6z(v=vs.110).aspx), nicméně mám problém:

Obrázek

Mám pocit, že to souvisí s tím posledním parametrem funkce DrawString, kterému moc nerozumím - když tam zadám třeba new Point(10, 10), tak to vykreslí ten "druhý text" 10px doleva a 10px dolu. Z toho ale logicky usuzuji, že když zadám třeba new Point(0, 1), tak dostanu správný výsledek, nicméně se mi ty písmena roztahují čím dál víc, dle vzdálenosti od počátku.


Poradíte, co s tím?
Děkuji
Tepster
Junior

Odeslat příspěvekod George2005 2. 5. 2014 20:01

Vždyť to na tom MSDN máš popsané, to si to neumíš ani naklikat?
http://msdn.microsoft.com/en-us/library/76c5db29%28v=vs.110%29.aspx
Nesnáším nesmysly jako jsou lesklé displeje, počítače typu tablet a pak především facebook, jakožto i ostatní společenské sítě, které kdekdo chybně překládá jako sociální ...

Blog: http://dlazdic.blog.zive.cz/
George2005
Junior

Odeslat příspěvekod Drozi 2. 5. 2014 20:29

Moje rada je nepoužívat WinForms.
Drozi
Kolemjdoucí

Odeslat příspěvekod Wikan 2. 5. 2014 21:00

Ten příklad jsi nejspíš vůbec nepochopil. Ty tam nemáš dávat dva texty, ty jsou tam jenom pro ukázku, aby byl mezi nimi vidět rozdíl.
To "kouzlo" je v:
Kód: Vybrat vše
e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;

vs
Kód: Vybrat vše
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
Wikan
Moderátor
Uživatelský avatar

Odeslat příspěvekod Tepster 5. 5. 2014 08:23

Wikan:
Díky, nicméně, kam mám dát to

Kód: Vybrat vše
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;

?
Tepster
Junior

Odeslat příspěvekod George2005 5. 5. 2014 08:39

Vždyť to v tom ukázkovém kódu už máš! Jinak řečeno vůbec nepoužiješ TextRenderingHint.SingleBitPerPixel, pouze TextRenderingHint.AntiAlias
Kód: Vybrat vše
// e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
// e.Graphics.DrawString(string1, font, solidBrush, new PointF(10, 10));
e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString(string2, font, solidBrush, new PointF(10, 60));
Nesnáším nesmysly jako jsou lesklé displeje, počítače typu tablet a pak především facebook, jakožto i ostatní společenské sítě, které kdekdo chybně překládá jako sociální ...

Blog: http://dlazdic.blog.zive.cz/
George2005
Junior

Odeslat příspěvekod Tepster 5. 5. 2014 08:54

Dík. Už to asi začínám chápat :)

Poslední otázka: Kam ten kód mám vložit?
Já jsem asi předtím někde četl, že se to má dát to metody pro událost Paint nějakého labelu, který chci vykreslit s antialiasingem. Proto to taky nešlo, resp. se tam vykreslovali dva texty - jeden normálně a jeden z té metody Paint.

Kam tedy ten kód mám dát? Když jsem ho zkusil dát do události pro metodu Paint celého toho formuláře, tak se to sice vykreslí, ale nějak nemohu ovládat kde atd. A když to dám do metody pro událost Paint labelu, tak se to vykreslí dvakrát.
Tepster
Junior

Odeslat příspěvekod Nargon 5. 5. 2014 09:07

Obecně vzato to musíš napsat tam, kde je použitý stejný objekt "Graphics". A musíš to zapsat před použití funkce na vypsání textu.

Tedy třeba tak jak je uvedeno v tom příkladu - před tu funkci na vypsání textu.

Jen mě celkem udivuje že se na to ptáš. Řešíš tady celkem nepodstatný detail, ale vypadá to že jsi se zatím nenaučil ani OOP programování.
Taky než budeš chtít začít běhat 500m přes překážky, tak bude fajn když se před tím naučíš chodit.

-- 5. 5. 2014 09:13 --

Aha, ty to chceš pro labely. V tom případě je možná nejlepší si udělat vlastní label:
Kód: Vybrat vše
public class MyLabel : Label 

    private TextRenderingHint _textRenderingHint = TextRenderingHint.SystemDefault; 

    public TextRenderingHint TextRenderingHint 
    { 
        get { return _textRenderingHint; } 
        set { _textRenderingHint = value; } 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
        e.Graphics.TextRenderingHint = _textRenderingHint; 
        base.OnPaint(e); 
    } 
}

Ten bude fungovat jako originální label, jen u něj můžeš nastavit tu antialias funkci a vše v něm bude vykresleno antialiasem.
viz link odkud jsem ten kód vykopíroval: http://social.msdn.microsoft.com/Forums ... t-in-label
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Tepster 5. 5. 2014 10:02

Díky moc.
Tepster
Junior

Odeslat příspěvekod mracka michal 5. 5. 2014 10:38

Labely (a vseobecne WinForms) su standardne antialiasovane podla toho, ci je to zapnute na urovni systemu:
pravy klik This PC -> Properties -> Advanced System Settings -> Advanced -> [Performance] Settings -> [Visual Effects] Smooth edges of screen fonts
„You don't need a reason to help people.”
~Zidane Tribal, Final Fantasy IX
--
Pouzivam suborovy manazer Nomad.Net.
mracka michal
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků