Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] - SHBrowseForFolder - okienko nie zatrzymujące programu?

Ostatnio zmodyfikowano 2012-11-18 12:39
Autor Wiadomość
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?
P-69427
xevuel
» 2012-11-17 20:14:25
C/C++
BROWSEINFO bInfo;
bInfo.hwndOwner = NULL;
//...

LPITEMIDLIST lpItem = SHBrowseForFolder( & bInfo );
P-69428
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:
C/C++
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?
P-69429
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...
P-69430
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...
P-69432
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ć.
P-69437
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.html

Wciąż nad tym siedzę ale nie mam pojęcia jak temu zaradzić.
P-69455
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.
P-69461
« 1 » 2
  Strona 1 z 2 Następna strona