.[ ČeskéHry.cz ].
Problémy se zprávami u neaktivního okna

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Asan



Založen: 31. 08. 2007
Příspěvky: 22

PříspěvekZaslal: 11. červenec 2008, 23:15:22    Předmět: Problémy se zprávami u neaktivního okna Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 11. červenec 2008, 23:43:20    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Asan



Založen: 31. 08. 2007
Příspěvky: 22

PříspěvekZaslal: 12. červenec 2008, 00:03:12    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 12. červenec 2008, 00:05:42    Předmět: Odpovědět s citátem

Co se týče těch knih, tak se tomu ani nedivím.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tutchek



Založen: 28. 07. 2007
Příspěvky: 140
Bydliště: Praha -Pankrác

PříspěvekZaslal: 12. červenec 2008, 13:36:25    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 12. červenec 2008, 14:25:04    Předmět: Odpovědět s citátem

No vždy právě ne, ten DefWindowProc ho taky zvaliduje.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Asan



Založen: 31. 08. 2007
Příspěvky: 22

PříspěvekZaslal: 12. červenec 2008, 14:51:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tutchek



Založen: 28. 07. 2007
Příspěvky: 140
Bydliště: Praha -Pankrác

PříspěvekZaslal: 13. červenec 2008, 23:08:47    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Crusty



Založen: 28. 08. 2007
Příspěvky: 120
Bydliště: Praha

PříspěvekZaslal: 15. červenec 2008, 11:55:23    Předmět: Odpovědět s citátem

pokud zavolas ValidateRect ve WM_PAINT mohlo by byt vse OK, ne?
_________________
http://www.2ox.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tutchek



Založen: 28. 07. 2007
Příspěvky: 140
Bydliště: Praha -Pankrác

PříspěvekZaslal: 17. červenec 2008, 21:27:53    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna