Dialog 1 zawsze na wierzchu, 2 nad nim

0

Jak ustawić style niemodalnych 2 dialogów, aby okno jednego z dialogów było zawsze na pierwszym planie i nie było możliwości schowania tego okna pod drugie okno.
http://img148.imageshack.us/i/oknat.jpg/
Style obu okien mam zdefiniowane następująco:
dialog z czarnym paskiem:
STYLE WS_CAPTION | WS_BORDER | WS_POPUP | WS_DLGFRAME
dialog bez czarnego paska:
STYLE WS_CAPTION WS_BORDER | WS_POPUP | WS_DLGFRAME | WS_SYSMENU | WS_MAXIMIZEBOX

Oba dialogi są dzieckiem głównego okna aplikacji.
Zauważyłem również, że komunikat MessageBox można zakryć takim dialogiem. Co poradzić, żeby nie można było nigdy zakryć kontrolki MessageBox? Przypuszczam, że coś trzeba w procedurze obsługi dialogu bez tego czarnego paska dać w stylu:
case WM_ACTIVATE (lub WM_KILLFOCUS): SetFocus(hWnd); break;
ale kombinuje jak mogę z różnymi komunikatami typu SetForegroundWindow itd. itp. i nic nie wychodzi.

0

Oczywiście chodzi też o to, aby po tym oknie na drugim planie móc operować, przesuwac paski przewijania, ale żeby okno drugie było zawsze na pierwszym miejscu, więc SetFocus odpada, bo blokuje mi ono okno w tle.

0

Mam też drugie pytanie:
Jakie dokładnie polecenia, komunikaty są wywoływane w komunikacie WM_INITDIALOG?
Jest taki problem, że mam dialogBoxa tworzonego w programie w którymśtam momencie i chcę aby ten DialogBox zajął miejsce np. w prawym górnym rogu głównego okna aplikacji i zawsze tam był!Główne okno aplikacji może być zmaksymalizowane, mieć różne rozmiary więc w resource.rc nie ustawię odpowiednich współrzędnych w definicji DialogBoxa. No więc najlepiej zrobić umieszczając w procedurze obsługi komunikatów głównego okna taki kod:

case WM_SIZE:
hDial=FindWindow(NULL,"Tytuł mojego DialogBoxa");
GetClientRect(hWnd, &rcClient);
MapWindowPoints(hWnd, HWND_DESKTOP, (LPPOINT)&rcClient, 2); 
MoveWindow(hDial, rcClient.right-320, rcClient.top, 340, 230, TRUE);
break;

Dzięki temu DialogBox ma położenie zawsze takie samo. Niestety człowiek co tworzył winapi był na tyle po...ny że nie da rady w
WM_INITDIALOG zasymulować zdarzenia SendMessage(hWnd,WM_SIZE,0,0); tzn. da radę, symuluje się ale DialogBox i tak przyjmuje położenie takie jakie podano w jego definicji! Dopiero po zmianie rozmiarów głównego okna aplikacji przyjmuje położenie takie jak pod komunikatem WM_INITDIALOG. A więc co zrobić??? Jest jakieś wyjście???

0
  1. Z pozycją zawsze na górze: probowałeś SetWindowPos i parametr HWND_TOPMOST?

  2. Może zamiast SendMessage daj PostMessage. Albo spróbuj też SetWindowPos.

0

Chyba najprościej jest spowodować aby jeden dialog był dzieckiem pierwszego - tak aby pokazywał się w jego obrębie. Wtedy nie da się tego pierwszego wypchnąć przed drugie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1