Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Asan
Založen: 31. 08. 2007 Příspěvky: 22
|
Zaslal: 11. červenec 2008, 23:15:22 Předmět: Problémy se zprávami u neaktivního okna |
|
|
Zdravím, mám trochu problém se zprávami u neaktivního okna. Má se to asi takhle, smyčka zpráv vypadá takto:
kód: |
while( true )
{
if (Active == true) {
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT) break;
}
if(GetTickCount() - LastTick > 1000 / 25 ) {
UpdateWindow(H_Okno);
LastTick = GetTickCount();
}
}
else {
GetMessage(&msg,(HWND) NULL, 0, 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
Log(msg.message);
if (msg.message == WM_QUIT) break;
}
} |
Což by měla být víceméně klasická základní Message Pump, která by měla teoreticky normálně fungovat.
Problém je, že když okno nemá fokus, přijímá neustále dokola zprávu WM_PAINT na kterou reaguje. A neustále je skutečně neustále - viz. úryvek logu:
citace: |
0ms Funkce: "Registrace Tridy" probehla uspesne.
47ms Funkce: "Vytvoreni okna" probehla uspesne.
1844ms Zprava: 15
1844ms Zprava: 15
1844ms Zprava: 15
1844ms Zprava: 15
1844ms Zprava: 512
1844ms Zprava: 15
1844ms Zprava: 15
1844ms Zprava: 15
1844ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 512
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15
1860ms Zprava: 15 |
Problém odstraním, když z procedury okna smažu návěstí pro WM_PAINT, jenže ta procedura zatím vypadá takhle:
kód: |
LRESULT CALLBACK WindowProcedure(
HWND H_Okno,
UINT M_Zprava,
WPARAM wParam,
LPARAM lParam )
{
switch (M_Zprava)
{
case WM_ACTIVATE:
if (wParam != WA_INACTIVE) Active = true;
else Active = false;
break;
case WM_CLOSE:
DestroyWindow(H_Okno);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
break;
default:
return (DefWindowProc(H_Okno, M_Zprava, wParam, lParam));
}
return 0;
} |
Takže mi to chování nedává smysl. Zkoušel jsem si i jiné programy (příklady pro knihy Programujeme grafiku v Direct3D a Počítačové hry za 24 hodin) a chování bylo stejné - jakmile ztratí fokus, začnou sát maximální možné množství výkonu procesoru, nevíte, co to?
Na jiném počítači jsem zatím neměl možnost to ozkoušet. |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 11. červenec 2008, 23:43:20 Předmět: |
|
|
Asi je potřeba něco překreslit, ale ty to ignoruješ, proto systém WM_PAINT posílá furt dokola. Ve WM_PAINT musíš alespoň vyvolat DefWindowProc, což řekne systému, že není potřeba už nic kreslit (uvnitř se volá ValidateRect nebo tak něco). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Asan
Založen: 31. 08. 2007 Příspěvky: 22
|
Zaslal: 12. červenec 2008, 00:03:12 Předmět: |
|
|
Díky, moje chyba, měl jsem za to, že ValidateRect je potřeba pro překreslení obnovu objektu v rámci kontextu zařízení a při používání GDI+ jsem se o to moc nestaral. Když jsem si teď pročítal dokumentaci, už jsem to našel. Mimochodem, prohlížel jsem zdrojáky a skutečně příklady obou výše zmíněných, u nás vydaných knih (Programujeme grafiku v Direct3D a Naučte se programovat očítačové hry za 24 hodin) tímto nedostatkem trpí... co dodat... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 12. červenec 2008, 00:05:42 Předmět: |
|
|
Co se týče těch knih, tak se tomu ani nedivím. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Tutchek
Založen: 28. 07. 2007 Příspěvky: 140 Bydliště: Praha -Pankrác
|
Zaslal: 12. červenec 2008, 13:36:25 Předmět: |
|
|
Pokud chytas WM_PAINT musis zavolat BeginPaint a EndPaint... VZDY!!!!!
jinak se ti drzi ten rectangle invalidni a tudiz to tu zpravu posle vzdy _________________ Nemarni čas u kompu, pojď si zaběhat do lesa
function god_exists() { return false; } |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 12. červenec 2008, 14:25:04 Předmět: |
|
|
No vždy právě ne, ten DefWindowProc ho taky zvaliduje. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
Asan
Založen: 31. 08. 2007 Příspěvky: 22
|
Zaslal: 12. červenec 2008, 14:51:28 Předmět: |
|
|
A ValidateRect pro celou oblast taky... (Jinak jsem si toho nevšiml právě kvůli přechodu z GDI na GDI+, čímž mi zmizelo Begin a End paint) |
|
Návrat nahoru |
|
|
Tutchek
Založen: 28. 07. 2007 Příspěvky: 140 Bydliště: Praha -Pankrác
|
Zaslal: 13. červenec 2008, 23:08:47 Předmět: |
|
|
Eosie napsal: |
No vždy právě ne, ten DefWindowProc ho taky zvaliduje. |
Pokud ji chytas, tak musis, pokud to spadlo do DefWindowProc, tak jsi ji nechytil a muze ti to byt putna _________________ Nemarni čas u kompu, pojď si zaběhat do lesa
function god_exists() { return false; } |
|
Návrat nahoru |
|
|
Crusty
Založen: 28. 08. 2007 Příspěvky: 120 Bydliště: Praha
|
Zaslal: 15. červenec 2008, 11:55:23 Předmět: |
|
|
pokud zavolas ValidateRect ve WM_PAINT mohlo by byt vse OK, ne? _________________ http://www.2ox.cz |
|
Návrat nahoru |
|
|
Tutchek
Založen: 28. 07. 2007 Příspěvky: 140 Bydliště: Praha -Pankrác
|
Zaslal: 17. červenec 2008, 21:27:53 Předmět: |
|
|
Crusty napsal: |
pokud zavolas ValidateRect ve WM_PAINT mohlo by byt vse OK, ne? |
Jak rikal clovek co nas ucil winapi "muzete delat nestandarni veci, ale musite vedet co delaji, proc jsou nestandarni a co z toho plyne". Tzn ano, muzes si to volat, pokud vis co to dela a proc. _________________ Nemarni čas u kompu, pojď si zaběhat do lesa
function god_exists() { return false; } |
|
Návrat nahoru |
|
|
|