Překreslování WIN32 API okna – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Překreslování WIN32 API okna – C / C++ – Fórum – Programujte.comPřekreslování WIN32 API okna – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
honza
~ Anonymní uživatel
393 příspěvků
19. 1. 2012   #1
-
0
-

Dobrý den,

chtěl bych se zeptat na věci týkající se překreslování okna ve Win32 API. Pro vypisování textu za běhu programu používám tento postup:

InvalidateRect( hwnd, NULL, TRUE);
UpdateWindow(hwnd);
hDC = GetDC(hwnd);

TextOut(hDC, 50, 50, "text", 4);

ale jakmile tento postup použiji znovu překreslí se celé okno. Proto jsem tyto volání přizpůsobil tak, aby znovu vykreslovaly již vykreslené čímž vytvořili iluzi že tam předchozí text zůstává.  S tímto řešením bych se jistě spokojil (ale nejspíš by to bylo obtížné a typuji že se to tak nedělá) ovšem po minimalizaci na lištu a opětnou maximalizací se vše co jsem za běhu programu vypsal je smazáno.

Tak bych byl velice rád kdyby mi někdo poradil, jak mám upravit vykreslování textu za chodu programu aby v okně zůstal vykreslený jako je tomu u textu vykresleném při startu pomocí zprávy WM_PAINT, a nebo poradil nějakou zprávu pro detekci maximalizace.

Předem děkuji za odpověď. 

Nahlásit jako SPAM
IP: 89.102.181.–
Reklama
Reklama
Pudni tvor+2
Stálý člen
20. 1. 2012   #2
-
0
-

Ahoj,

Ano po minimalizaci a maximalizaci je to smazáno protože se nezavolá ten kód co to vykreslil.
Většinou je zbytečné duplikovat kreslící kód na víc míst, je v tom pak jen bordel.
Běžně se všechno vykresluje ve WM_PAINT.
Naprogramuj WM_PAINT tak, aby vykreslovala současný stav okna/aplikace.
No a když se někde ten stav změní (třeba se změní nějaký text), je třeba oknu jen oznámit aby se překreslilo, tzn. po změně zavoláš:

// Označení pravoúhelníku, který se změnil a je třeba ho překreslit (NULL - celé okno)
InvalidateRect( hwnd, NULL, TRUE);
UpdateWindow(hwnd); // Ihned zavolá WM_PAINT která překreslí neplatný pravoúhelník
                    // (ten který je v předchozím řádku označen InvalidateRect - může jich být víc)

Toť vše, samotné vykreslení ať zařídí WM_PAINT.

Protože WM_PAINT je automaticky voláno při potřebě překreslení obrazu
v důsledků manipulací s oknem systémem např. změnách velikosti okna, např maximalizace.

Nahlásit jako SPAM
IP: 90.180.213.–
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, 160 hostů

Moderátoři diskuze

 

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