Quantum >Я предпочитаю немного изменить условие задачи без какого-либо ущерба в функциональности, чем использовать извратные уловки, типа невидимого отчима. Немного изменяя условия задачи - мы решаем немного не ту задачу. Сами понимаете - это не всегда допустимо. Да и наши личные предпочтения не всегда имеют значение... Что касается "извратных уловок" - а вот сама винда без стеснения таковыми пользуется. Скажем, на Win>=2k каждый раз, когда наводите курсор на одну из стандартных кнопок оконного заголовка, - винда на несколько секунд превращает message-only окно класса #32774 в top-level подобие тултипа с надписью "Свернуть", "Закрыть" и т.п. ... омерзительно, правда ? >>И на фига Petzold кропал свои главы о modal и modeless диалогах ... >Модальность зависит не от функции, а от реализации. С помощью CreateDialogParam можно делать как модальные, так и немодальные диалоги. Ну вот, опять, значит, предпочли "немного изменить условие задачи" и говорить немного не о том У Petzold-а "Modal Dialog Boxes" и "Modeless Dialog Boxes" описывают соответственно DialogBox* и CreateDialog*, о чем я этак застенчиво и напоминал. Ну зачем было вцепляться в слово "модальность", о ней-то ведь и речи не было
Nouzui Дочерние окна невидимого родителя не могут быть видны. kero Не всегда, но в данном случае велика вероятность допустимости предложенного мной решения. Вообще трудно представить ситуацию, в которой DialogBoxParam нельзя заменить на более гибкую версию CreateDialogParam или ещё более гибкую CreateWindowEx. Что же в этом плохого? В MSDN - тоже. Из немодального окна можно запросто сделать модальное: задисаблить основное окно + инициировать новый цикл обработки сообщений. Тогда о чём мы спорим?
угу.. просто я поэкспериментировал немного и ухитрился скрыть диалог с помощью видимого окошка )) потом понял, в чем было дело..
Quantum >>омерзительно, правда ? >Что же в этом плохого? Так ведь 1) недокументированная 2) извратная 3) уловка ? Впрочем, с вами шутки плохи
kero Вам не нравится, что всплывающие подсказки ("Свернуть", "Закрыть" и т.п) являются окнами? - А как бы их иначе можно было реализовать, вроде неклиентских надстроек по типу полос прокрутки? Не нравится, что для работы с этими подсказками не предусмотрено API? Так ведь никто не мешает использовать стандартные tooltip'ы. Это всё было шуткой? В следующий раз, не сочтите за труд, расставляйте слова "лопата" по тексту, а то одних смайликов уже недостаточно - однозначно их трактовать становится всё трудней.
Вот так файтинг ) Забавно, неужели MS при разработке API DialogBox не подумали о такой вполне стандартной операции как скрытие окна? А вот в мессаге от Kero непонятно, когда-же окно становится видимым?
Quantum >В следующий раз, не сочтите за труд, расставляйте слова "лопата" по тексту, а то одних смайликов уже недостаточно Боюсь, и лопаты недостаточно, и даже бульдозера ... Freecod >Забавно, неужели MS при разработке API DialogBox не подумали о такой вполне стандартной операции как скрытие окна? [...] >непонятно, когда-же окно становится видимым? Непонятно ? Ну, вставьте в обработчик WM_INITDIALOG - MessageBox. Т.е. остановите прекрасное мгновенье и осмотритесь. DialogBox вы не увидите, но любой вменяемый спай покажет, что 1) DialogBox (со всеми его контролами) уже создан, 2) его бит WS_VISIBLE сброшен (даже если в ресурсах установлен), 3) DialogBox находится в пределах экрана (даже если в ресурсах заданы отрицательные или запредельные координаты). Т.е. - видимым становится уже после выхода из обработчика WM_INITDIALOG. Так что для MS DialogBox - что-то вроде продвинутогго MessageBox-а, служебный-служебный, готовый к применению и обеспеченно попадающий на экран, заботливо огражденный от "случайностей" в ресурсах. Но, конечно, есть куча различных способов преодолеть эту заботливость.
А вот нестрогий, но все же тест: когда же DialogBox становится видимым ? Код (Text): .data dlg db "dlg",0 app db "When DialogBox becomes visible ?",0 ft db "( uMsg #%lu : WM_INITDIALOG )",13,10 db " uMsg #%lu : %#x",0 .data? count dd ? icount dd ? flag dd ? .code DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM local buf[128]:BYTE inc count .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 .elseif uMsg==WM_INITDIALOG mov eax,count mov icount,eax .else .if flag==0 invoke IsWindowVisible,hWnd .if eax!=0 inc flag invoke wsprintf,addr buf,offset ft,icount,count,uMsg invoke MessageBox,hWnd,addr buf,offset app,40000h .endif .endif mov eax,FALSE ret .endif mov eax,TRUE ret DlgProc endp start: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,offset dlg,0,offset DlgProc,0 invoke ExitProcess,eax end start У меня получается, что вот когда: на 0x85 (WM_NCPAINT).