Окно создаю вот так: Код (Text): invoke DialogBoxParam,hInstance,1,0,offset WndProc,0 Код (Text): 1 DIALOG 0,0,222,182 STYLE DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZE FONT 8,"Tahoma" BEGIN ;... END пробовал при обработывании сообщения WM_INITDIALOG отправить и Код (Text): invoke ShowWindow,hDlg,SW_MINIMIZE и Код (Text): invoke ShowWindow,hDlg,SW_HIDE результата ноль. Помог только Код (Text): invoke PostMessage,hDlg,WM_SYSCOMMAND,SC_MINIMIZE,0 но окно серавно на полсекунды остается в нормальном состоянии только потом сворачивается, не подскажите как с этим боротся?
Flasher Просто создавай окно невидимым. А при необходимости переноси на передний план ( SetForegroundWindow ) и отображай.
Во первых: Т.е. система отображает диалоговое окно уже после того как приходит WM_INITDIALOG. Естественно, что вызов ShowWindow ни к чему не приводит. Наличие/отсутствие WS_VISIBLE тоже ни на что не влияет: Ну, можно например просто обрабатывать первый WM_SHOWWINDOW, приходящий твоему окну. Но это, имхо, громоздкое, ненадёжное и неэлегантное решение. (По крайней мере, в моей реализации. =) Код (Text): .data ; . . . Coun_Ter db 0 ; . . . .code ; . . . sub eax,eax push eax push offset WndProc push eax inc eax push eax push hInstance call DialogBoxParam ; . . . .elseif uMsg == WM_SHOWWINDOW .if Coun_Ter==1 xor al,al mov Coun_Ter,al push WS_MINIMIZE push GWL_STYLE ;offset of value to set push hDlg ;handle to window call SetWindowLong .endif
Flasher В общем случае задача не имеет решения Попробуй CreateDialogParam, если окно одно (главное), то модальность тебе не нужна. Если же хочешь поищвращаться, то вот сокрытие модального окна при загрузке.
G13, и SetWindowLong не помог Рас другого выхода нет, ну и фиг сним, пусть высветится перед уходом в трей
letika Ну, почему же. Вот вариант решения: 1) rc-диалог - обязательно без WS_VISIBLE, и 2) ShowWindow(SW_HIDE) - на первое WM_NCPAINT. В аттаче - демка на эту тему.
В моём случае и Код (Text): .elseif uMsg==WM_NCPAINT invoke GetWindowLong,hWnd,DWL_USER .if eax==0 invoke IsWindowVisible,hWnd .if eax!=0 invoke SetWindowLong,hWnd,DWL_USER,eax invoke ShowWindow,hWnd,SW_MINIMIZE .endif .endif xor eax,eax ret без Timer'a прекрасно подошло. kero, спасибо огромное!
Добавление для тех, кого забросит сюда Поиск. 1) По ссылке от letika теперь в конце можно найти указание и на другой способ: на WM_WINDOWPOSCHANGING в WINDOWPOS.flags сбрасывать бит SWP_SHOWWINDOW (структура WINDOWPOS по lParam). 2) Предложенный выше вариант решения приходит автоматически при правильной постановке исходного вопроса, а именно: "Когда модальный диалог начинает быть видимым?"). В аттаче - соответствующий тест (и на васме это уже было).