Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Použití Accelerators v Dialogu

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Použití Accelerators v Dialogu

Autor: pepak

16:04:34 23.11.2010

Kdyby po tom někdo pátral, tak #2 funguje, ale s tím, že je třeba pomocí GetParent projít celou strukturu parentů, protože ta klávesová zpráva bude určená pro "podřízené" okno, ne přímo pro dialog.

Citovat příspěvek

 

Použití Accelerators v Dialogu

Autor: pepak

11:05:08 23.11.2010

Mám aplikaci, do které nemohu zasahovat. Ta aplikace umí nějakým způsobem zavolat můj dialog ( http://msdn.microsoft.com/en-us/library/ms632588(VS.85).aspx ) - dejme tomu, že ten dialog mám celý uložený do DLL, ve kterém publikuji dvě funkce, jednu pro zobrazení dialogu modálně a druhou pro zobrazení nemodálně.

Chtěl bych, aby můj dialog šel ovládat klávesnicí. Na to je podle všeho vhodné používat akcelerátory ( http://msdn.microsoft.com/en-us/library/ms645526(v=VS.85).aspx ).

Problém je v tom, že pro použití akcelerátorů je potřeba volat TranslateAccelerator v message loop aplikace - tedy z místa, do kterého já nemohu zasáhnout. Já bych mohl zasáhnout do DialogProc dialogu, ale tam už je pozdě - tam už se TranslateAccelerator volat nedá. Co jsem se díval, existuje několik způsobů, jak to řešit, ale všechny mi připadají, že mají zásadní nedostatky. Protože ale tenhle problém docela určitě musel být řešen, zřejmě něco přehlížím:

1) Místo DialogBoxParam se dá modální dialog nasimulovat tím, že ho zobrazím nemodálně pomocí CreateDialogParam, zakážu rodičovské okno, nechám běhat vlastní message loop (která tím pádem může provést TranslateAccelerator), po jejím konci zase rodičovské okno povolím a vrátím se. Problémy:

- Tento postup evidentně nejde použít na dialogy, které nemají být modální.

- Musím znát rodičovské okno, tzn. volající mi ho musí předat. Ten volající ovšem může být ve stejné situaci jako já, on taky nemusí být přímo "vlastníkem" rodičovského okna a tudíž to okno vůbec nemusí znát.

- Rodičovské okno samo může být nemodální, tzn. zákazem jenom rodiče celkem nic nezískám; pro stoprocentní funkčnost bych musel zakázat všechna ostatní okna v aplikaci.

- Co když někdo bude chtít rodičovskému oknu poslat nějakou zprávu? Řekl bych, že tímhle řešením mu ji zablokuju, ne?

2) Mohu si před zobrazením dialogu zaregistrovat MSGFILTER hook, takže se "napíchnu" přímo do hlavní message loop aplikace, tam provádět potřebné TranslateAccelerator a na konci hook zase zrušit ( http://us.generation-nt.com/answer/accellerators-modal-dialog-boxes-how-do-i-do-help-27734892.html ). Problémy:

- Není mi úplně jasné, jak tohle implementovat za situace, kdy mám několik současně zobrazených dialogů, přičemž každý může mít jiné akcelerátory (nebo taky třeba vůbec žádné). Zřejmě bych musel ověřit, že HWND zprávy je můj dialog, dohledat k němu použitý HACCEL a teprve na tuhle dvojici pak použít TranslateAccelerator?

Pepak

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: