Скрыть диалог

Тема в разделе "WASM.WIN32", создана пользователем Freecod, 21 дек 2006.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Quantum

    >Я предпочитаю немного изменить условие задачи без какого-либо ущерба в функциональности, чем использовать извратные уловки, типа невидимого отчима.

    Немного изменяя условия задачи - мы решаем немного не ту задачу.
    Сами понимаете - это не всегда допустимо.
    Да и наши личные предпочтения не всегда имеют значение...

    Что касается "извратных уловок" - а вот сама винда без стеснения таковыми пользуется.
    Скажем, на Win>=2k каждый раз, когда наводите курсор на одну из стандартных кнопок оконного заголовка, -
    винда на несколько секунд превращает message-only окно класса #32774 в top-level подобие тултипа с надписью "Свернуть", "Закрыть" и т.п. ...
    омерзительно, правда ? :)

    >>И на фига Petzold кропал свои главы о modal и modeless диалогах ...
    >Модальность зависит не от функции, а от реализации. С помощью CreateDialogParam можно делать как модальные, так и немодальные диалоги.

    Ну вот, опять, значит, предпочли "немного изменить условие задачи" и говорить немного не о том :)
    У Petzold-а "Modal Dialog Boxes" и "Modeless Dialog Boxes" описывают соответственно DialogBox* и CreateDialog*, о чем я этак застенчиво и напоминал.
    Ну зачем было вцепляться в слово "модальность", о ней-то ведь и речи не было :)
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Nouzui
    Дочерние окна невидимого родителя не могут быть видны.

    kero
    Не всегда, но в данном случае велика вероятность допустимости предложенного мной решения. Вообще трудно представить ситуацию, в которой DialogBoxParam нельзя заменить на более гибкую версию CreateDialogParam или ещё более гибкую CreateWindowEx.

    Что же в этом плохого?

    В MSDN - тоже. Из немодального окна можно запросто сделать модальное: задисаблить основное окно + инициировать новый цикл обработки сообщений.

    Тогда о чём мы спорим?
     
  3. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    угу..
    просто я поэкспериментировал немного и ухитрился скрыть диалог с помощью видимого окошка ))
    потом понял, в чем было дело..
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Quantum

    >>омерзительно, правда ? :)

    >Что же в этом плохого?

    Так ведь 1) недокументированная 2) извратная 3) уловка ?

    Впрочем, с вами шутки плохи :)
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kero
    Вам не нравится, что всплывающие подсказки ("Свернуть", "Закрыть" и т.п) являются окнами? - А как бы их иначе можно было реализовать, вроде неклиентских надстроек по типу полос прокрутки? Не нравится, что для работы с этими подсказками не предусмотрено API? Так ведь никто не мешает использовать стандартные tooltip'ы.

    Это всё было шуткой? В следующий раз, не сочтите за труд, расставляйте слова "лопата" по тексту, а то одних смайликов уже недостаточно - однозначно их трактовать становится всё трудней.
     
  6. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    Вот так файтинг ) Забавно, неужели MS при разработке API DialogBox не подумали о такой вполне стандартной операции как скрытие окна? А вот в мессаге от Kero
    непонятно, когда-же окно становится видимым?
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Quantum

    >В следующий раз, не сочтите за труд, расставляйте слова "лопата" по тексту, а то одних смайликов уже недостаточно

    Боюсь, и лопаты недостаточно, и даже бульдозера ...

    Freecod

    >Забавно, неужели MS при разработке API DialogBox не подумали о такой вполне стандартной операции как скрытие окна?
    [...]
    >непонятно, когда-же окно становится видимым?

    Непонятно ? Ну, вставьте в обработчик WM_INITDIALOG - MessageBox.
    Т.е. остановите прекрасное мгновенье и осмотритесь.
    DialogBox вы не увидите, но любой вменяемый спай покажет, что

    1) DialogBox (со всеми его контролами) уже создан,
    2) его бит WS_VISIBLE сброшен (даже если в ресурсах установлен),
    3) DialogBox находится в пределах экрана (даже если в ресурсах заданы отрицательные или запредельные координаты).

    Т.е. - видимым становится уже после выхода из обработчика WM_INITDIALOG.


    Так что для MS DialogBox - что-то вроде продвинутогго MessageBox-а, служебный-служебный,
    готовый к применению и обеспеченно попадающий на экран, заботливо огражденный от "случайностей" в ресурсах.

    Но, конечно, есть куча различных способов преодолеть эту заботливость.
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    А вот нестрогий, но все же тест: когда же DialogBox становится видимым ?
    Код (Text):
    1. .data
    2. dlg db "dlg",0
    3. app db "When  DialogBox  becomes  visible  ?",0
    4. ft  db "( uMsg  #%lu :  WM_INITDIALOG )",13,10
    5.     db "  uMsg  #%lu :  %#x",0
    6.  
    7. .data?
    8. count  dd ?
    9. icount dd ?
    10. flag   dd ?
    11.  
    12. .code
    13.  
    14. DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    15.  local buf[128]:BYTE
    16.  inc count
    17.  .if uMsg==WM_CLOSE
    18.    invoke EndDialog,hWnd,0
    19.  .elseif uMsg==WM_INITDIALOG
    20.    mov eax,count
    21.    mov icount,eax
    22.  .else
    23.    .if flag==0
    24.      invoke IsWindowVisible,hWnd
    25.      .if eax!=0
    26.        inc flag
    27.        invoke wsprintf,addr buf,offset ft,icount,count,uMsg
    28.        invoke MessageBox,hWnd,addr buf,offset app,40000h
    29.      .endif
    30.    .endif
    31.    mov eax,FALSE
    32.    ret
    33.  .endif
    34.  mov eax,TRUE
    35.  ret
    36. DlgProc endp
    37.  
    38. start:
    39.   invoke GetModuleHandle,0
    40.   invoke DialogBoxParam,eax,offset dlg,0,offset DlgProc,0
    41.   invoke ExitProcess,eax
    42. end start
    У меня получается, что вот когда: на 0x85 (WM_NCPAINT).