Savail Temat założony przez niniejszego użytkownika |
[WinAPI] - SHBrowseForFolder - okienko nie zatrzymujące programu? » 2012-11-17 20:01:47 Hej, Próbuję otworzyć okienko dialogowe do wybierania folderu w trybie niemodalnym (aby nie zatrzymywało programu). Szukałem trochę na ten temat w necie ale nic konkretnego nie znalazłem. Natknąłem się na kontrolkę FolderView ale może jednak da radę jakoś zmodyfikować SHBrowseForFolder? |
|
xevuel |
» 2012-11-17 20:14:25 BROWSEINFO bInfo; bInfo.hwndOwner = NULL;
LPITEMIDLIST lpItem = SHBrowseForFolder( & bInfo );
|
|
Savail Temat założony przez niniejszego użytkownika |
» 2012-11-17 20:41:06 Dzięki za odpowiedź, lecz efekt jest nadal ten sam :/. Tworzę okienko w ten sposób: BROWSEINFO bi; memset( & bi, 0, sizeof( bi ) ); bi.hwndOwner = NULL; bi.pidlRoot = NULL; bi.pszDisplayName = FolderPath; bi.lpszTitle = "Choose path of your folder"; bi.ulFlags = BIF_USENEWUI | BIF_VALIDATE | BIF_NONEWFOLDERBUTTON;
LPITEMIDLIST pIDL = SHBrowseForFolder( & bi ); Może nadal coś z tym źle? Chyba, że mimo wszystko wartość NULL bierze jako uchwyt do głównego okna? |
|
xevuel |
» 2012-11-17 20:51:15 Nie mam pojęcia o co może chodzić, wklejenie na żywca kodu który podałeś nie powoduje zablokowania głównego okna, jak to się dzieje przy ustawieniu hwndOwner. Czyli działa ok... |
|
Savail Temat założony przez niniejszego użytkownika |
» 2012-11-17 21:17:44 Powstawiałem parę breakpointów i uruchomiłem program w trybie debug i niestety poza linię LPITEMIDLIST pIDL = SHBrowseForFolder( & bi ); program nie przechodzi dopóki okna nie zamknę. Tak samo przy przesuwaniu tego okienka główne okno nie odrysowuje się. Chociaż w google jest pełno tematów typu: Jak zrobić modalne SHBrowseForFolder? to wygląda na to, że tylko ja mam problem z niemodalnym oknem :o... |
|
xevuel |
» 2012-11-17 22:08:38 Stwórz nowy projekt, a w nim najprostsze możliwe okienko (CreateWindowEx) wyświetlające SHBrowseForFolder (z hwndOwner równym NULL), i nie robiące poza tym nic. Skompiluj, i sprawdź czy działa. Jeśli nie, spakuj exeka i źródło do pliku .zip i wrzuć na jakiś hosting. Zobaczymy, czy da się coś wykombinować. |
|
Savail Temat założony przez niniejszego użytkownika |
» 2012-11-18 12:04:26 hmm, no więc stworzyłem proste okienko w którym po wciśnięciu entera otwiera się właśnie SHBrowseForFolder. Jeśli chodzi o samo WinAPI to wszystko działa w porządku - okienko otwiera się w trybie niemodalnym i wszystko się dobrze odrysowuje. Dodałem jednak funkcję RenderGraphics wykorzystującą DirectX do rysowania i okazało się że właśnie do tej funkcji program już nie dociera dopóki nie zamknę SHBrowseForFolder. Wystarczy poprzeciągać sobie okienko SHBrowseforFolder i będzie widać ze tło w głównym oknie nie odrysowuje się. Przesyłam paczkę: http://www29.zippyshare.com/v/66268711/file.htmlWciąż nad tym siedzę ale nie mam pojęcia jak temu zaradzić. |
|
xevuel |
» 2012-11-18 12:24:21 Aa, o to Ci chodzi... Ok, spróbuj w takim razie wsadzić wywołanie SHBrowseForFolder do nowego wątku, powinno pomóc.
Wiesz, czemu nie renderuje? Bo SHBrowseForFolder czeka na zamknięcie okienka, żeby móc przekazać wszystkie informacje. A skoro ona czeka, to również główna pętla odbierająca komunikaty postanawia zaczekać, aż wykonanie się skończy. Ponieważ komunikaty są zatrzymywane w kolejce, a nie przetwarzane (przez to czekanie właśnie), okno nie jest odmalowywane. Zapamiętaj: w grach wszystko co czeka na użytkownika dobrze jest wsadzać do wątku, lub w jakiś sposób sprawić, aby odbieranie komunikatów nie czekało zbyt długo. |
|
« 1 » 2 |