Controls HIDE/SHOW =(((

Тема в разделе "WASM.WIN32", создана пользователем gloomyraven, 16 май 2006.

  1. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    Зачем изобретать велосипед? Диалог - есть окно. Класс этого окна регистрируется виндой и содержит кучу немаловажных фишек, от которых Вы намеренно отказываетесь изобретая свой класс диалога.





    Указываем на WndProc, который не обрабатывает WM_CREATE. А кто будет контролы создавать, если Вы уже лишили винду этого права? Раз уж так хочется надругаться над диалогами в Win32, делайте это до конца, т.е. обрабатывайте сами все сообщения как это сделал бы обработчик стандартного класса диалога.
     
  2. Quantum

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

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


    Когда приходит первый EN_UPDATE, статики ещё не создались.
     
  3. gloomyraven

    gloomyraven Руслан

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

    По-моему как раз WM_CREATE и обрабатывается, а WM_INITDIALOG - нет
     
  4. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    У меня форма отображается нормально со всеми статиками... бред какой-то...
     
  5. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    тебе надо вызывать GetDlgItem лучше при сообщении WM_CREATE вот почему у тебя неполучается
     
  6. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    тоесть те сообщения раньше пришли чем контрол создался имхо
     
  7. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    Если это можно назвать обработкой:
    Код (Text):
    1. .IF uMsg==WM_CREATE
    2. ; записываем значение TimeOut в EDIT
    3. .ELSEIF uMsg==WM_COMMAND




    В догонку к моему предыдущему сообщению:

    Контролы в шаблоне создаются в том порядке, в котором они обьявлены. Так что можете переместить все статики в начало шаблона, чтоб они гарантированно присутствовали когда прийдёт первый EN_UPDATE.
     
  8. gloomyraven

    gloomyraven Руслан

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

    Т.е. заранее высчитать все нужные хэндлы и сохранить?
     
  9. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    да помоему лучше сохраньть все хэндэлы

    .IF uMsg==WM_CREATE

    ;вот тут

    invoke GetDlgItem,hWnd,IDC_lbl_Error

    invoke ShowWindow,eax,FALSE

    .ELSEIF

    и тамже его скрыть
     
  10. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    Вот я тоже удивляюсь, что винда разрулила такой безграмотный код. Для того чтобы обойти стандарты винды, нужно учесть кучу тонкостей, о которых Вы пока ещё не знаете.



    readme



    Только не в WM_CREATE, а в WM_INITDIALOG, который гарантированно приходит после того как все дочерние контролы уже созданы.
     
  11. gloomyraven

    gloomyraven Руслан

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

    - это недописаный код =)))



    readme

    Ты хочешь сказать, что EN_UPDATE для контрола EDIT приходит раньше (!!!), чем он создается?
     
  12. readme

    readme New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2005
    Сообщения:
    271
    Адрес:
    Russia
    gloomyraven

    я точно сказать немогу

    но если ты последуешь примеру выше то оно будет работоспособно
     
  13. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    EN_UPDATE посылает edit и это происходит раньше чем создастся статик. См. моё сообщение за "Дата: Май 17, 2006 01:42:17".
     
  14. gloomyraven

    gloomyraven Руслан

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

    Дак ведь это уже не диалоговое окно, а обычное, созданное на основе диалогового (блин, масло-масленное) и WM_INITDIALOG не должен приходить.

    Насчет безграмотного кода: где его безграмотность? В том, что я "копирую" станд. диалог и создаю свой?
     
  15. gloomyraven

    gloomyraven Руслан

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



    Это, конечно правильно... но почему же FindWindow видит эти статики?
     
  16. gloomyraven

    gloomyraven Руслан

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

    Я уже наступал на эти грабли (пытался обратиться к контролу раньше его создания). Вот я всё запутал... Но, думаю, твой вариант подходит.
     
  17. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    Она находит первый статик потому что он в шаблоне стоит первый, до edit.





    Он и не придёт. Я же говорил, что в диалогах много полезных фишек, от которых жалко отказываться. А чем поможет получение хендлов через WM_CREATE/WM_INITDIALOG, если EN_UPDATE всё равно придёт раньше? Причём WM_CREATE придёт ещё раньше, когда дочерних контролов ещё и в помине нет. Единственный вариант: изменить последовательность строчек в шаблоне.





    В том, что влечёт за собой столько граблей.
     
  18. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Все, я решил проблему:

    1. WM_CREATE на фиг не нужен

    2. сохранять хэндлы надо ПОСЛЕ создания окна и ДО цикла сообщений (в WinMain), там же, где инициализируется PROGRESSBAR, т.к. именно в этом месте все контролы будут уже созданы



    Quantum

    Грабли оказались в том, что "WM_INITDIALOG" теперь "неофициально" находится между "ПОСЛЕ" и "ДО" (в WinMain)

    Других ограничений я не вижу



    СПАСИБО ОГРОМНОЕ ВСЕМ, что помогли разобраться!!! =)
     
  19. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    gloomyraven



    Хотя я и предлагал более простой вариант, без сохранения хендлов, должен признать, что решение оригинальное. Кстати, WM_INITDIALOG скорее всего посылает CreateDialogParam, но он не может его послать, т.к. не знает адрес процедуры обработчика (там ноль вообще).



    До сих пор не могу понять зачем было создавать свой класс диалога.
     
  20. gloomyraven

    gloomyraven Руслан

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

    =) Я сторонник "нестандартного" программирования (или, как скажут некоторые, через ж...) Т.о. лучьше вникаешь в тонкости программирования, ИМХО. Доброй ночи.