![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
первое окно - форма
далее создается несколько окон CreateWindowEx(ws_ex_layered + ws_ex_toolwindow + ws_ex_noparentnotify + ws_ex_acceptfiles) wndClass->style = CS_DBLCLKS + CS_OWNDC; окна позиционируются на первом и должны оставаться всегда поверх него (как дочерние, но без стиля ws_child чтобы их можно было вытащить с первого окна) подскажите как сделать. сейчас использую SetWindowLong(hWnd, GWL_HWNDPARENT, ParentHWnd) - для присоединения и SetWindowLong(hWnd, GWL_HWNDPARENT, 0) - для отсоединения Есть еще одна задача: необходимо как-то активировать главное окно (выводить на передний план и передавать фокус ввода) с сохранением вышеописанного функционала. Заранее благодарен за помощь. |
|||
|
||||
EnergoHokum |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: 3 Всего: 6 |
Посмотри тут. Может, подойдёт?
|
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
насчет BringWindowToTop не помню но наверняка уже пробовал (для активации), но дело не в этом
мне как раз и нужно выстроить z-последовательность и сохранять ее в нужном порядке я выставляю ее при помощи функции deferWindowPos (если устанавливать по SetWindowPos, то будет работать долго, неприемлемо для моего приложения) выставляю в массив для defer позицию 0xffffffff сначала для главного окна и следом для остальных но получаю ситуацию что иногда некоторые из окон оказываются под главным. я даже пробовал что-то вроде реакции на wm_windowposchanging и возвращал свой параметр в качестве zorder, не помогло, а может не так что-то делал, документации-то как весь zordering работает нет ... пример того как надо - ObjectDock, он кроме главного окна и дополнительных окон каждого пункта (иконки) создает еще столько же окон (для каждого пункта) с именем класса ZOrderWindow (или что-то типа того, не суть). Из названия просто не может быть непонятно что он использует эти окна для достижения эффекта, который мне нужен, но вот как ?... Просто последнее что я могу сделать это поставить хук на все оконные сообщения ObjectDock'а (например используя APIMonitor) и смотреть что происходит, но потом лог разбирать ... жуть |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
holmes, лови и обрабатывай WM_WINDOWPOSCHANGING .
-------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
все просто, для этого нужно все остальные окна, которые должны всегда быть поверх первичного, создавать со стилем WS_POPUP, а в hwndParent ставить им дескриптор этого самого - первичного окна. WS_POPUP для этого как раз и предназначен.
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
окна я и так создаю с ws_popup и ставлю им hwndParent, но не помогает ...
а по поводу обработки WM_WINDOWPOSCHANGING я написал что уже пробовал (см. 3 пост), тоже не помогло, объясните как |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
Izvinite za takoy tekst, na mashine net russkogo yazika.
Kak vi obrabativali WM_WINDOWPOSCHANGING ? Posmotrite na strukturu WINDOWPOS. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
обрабатывал примерно так:
возвращал в hwndInsertAfter для главного окна например $fffffffd а для окошек пунктов $fffffffe еще вроде пробовал получать hwndInsertAfter из сообщения главного окна и ставить для окошек пунктов hwndInsertAfter + 1 эффект отсутствует, точнее присутствует, но стало еще хуже (не поддается описанию) что бы еще такое придумать ?... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
что значит не помогает, открой фотошоп, и посмотри на поведение его окошек-панелек, это как раз попап-панельки, если сомневаешься, запусти Spy, проверь стили своих окошек. проблема может крыться только в двух вещах: либо ты перекрываешь установку слилей, затирая попап, либо перекрываешь установку родителя в CreateWindow/Ex. В обоих случаях, если не учесть хоть одно условие, поведение окна уже не будет попап. PS: SetWindowLong - не всегда то же самое, что указать стили при создании окна, тебе нужно создать окно со стилем popup, а не установить этот стиль после создания окна -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
я писал что SetWindowLong я использую только для указания родителя (wndParent), стиль я не меняю по ходу работы программы
хотя ... может и указание родителя может портить мне жизнь? а еще может следующая вещь: я так и не смог активировать главное окно программы при помощи BringWindowToTop, SetForegroundWindow и т.п., поэтому делаю это устанавливая главному окну и всем окошкам пунктов HWND_TOPMOST и следом сразу HWND_NOTOPMOST (при этом если не делать этого для окошек пунктов то они хоть и имеют родителя = главное окно, но все равно под него проваливаются) вобщем если у кого появятся мысли буду оч благодарен, а так ... буду шаманить на выходных ... потом отпишу |
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
положительных результатов нет
|
|||
|
||||
HumanAPI |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.2.2008 Репутация: нет Всего: нет |
А просто диалог сделать нельзя?
Примерно так(кусок моего кода извеняюсь не стал править) hMgr = CreateDialogParam((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE), "DialogMenedgerObj", hWnd, DlgMenedgerObjProc, (LPARAM)this); ну и в ресурсах DialogMenedgerObj DIALOGEX 6,5,112,214 CAPTION "Менеджер объектов" FONT 8,"MS Sans Serif",0,0 STYLE 0x10C30000 EXSTYLE 0x00000080 BEGIN CONTROL "",301,"ListBox",0x5021094B,2,3,108,126,0x00000200 CONTROL "Вид",ID_OBJ_VIEW,"Button",0x50010000,4,149,48,13 CONTROL "Скрыть",ID_OBJ_SEEN,"Button",0x50010000,4,166,48,13 CONTROL "Удалить",ID_OBJ_DELETE,"Button",0x50010000,58,166,48,13 CONTROL "Объеденить",ID_OBJ_UNIT,"Button",0x50010000,58,182,48,13 CONTROL "Показать",ID_VISIBLE,"Button",0x50010000,4,182,48,13 CONTROL "Копировать",ID_OBJ_COPY,"Button",0x50010000,58,149,48,13 CONTROL "",302,"ComboBox",0x10010043,2,132,108,67 CONTROL "Трансформировать",ID_OBJ_TRANS,"Button",0x50010000,6,199,100,13 END |
|||
|
||||
holmes |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 17.4.2006 Репутация: нет Всего: нет |
ммм ... нет. не в моем случае
продолжаю ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |