Как запустить окно минимизированным в трей

Тема в разделе "WASM.WIN32", создана пользователем Flasher, 19 фев 2008.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Окно создаю вот так:
    Код (Text):
    1. invoke DialogBoxParam,hInstance,1,0,offset WndProc,0
    Код (Text):
    1. 1 DIALOG 0,0,222,182
    2. STYLE DS_MODALFRAME  | DS_CENTER | WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZE
    3. FONT 8,"Tahoma"
    4. BEGIN
    5. ;...
    6. END
    пробовал при обработывании сообщения WM_INITDIALOG отправить
    и
    Код (Text):
    1. invoke ShowWindow,hDlg,SW_MINIMIZE
    и
    Код (Text):
    1. invoke ShowWindow,hDlg,SW_HIDE
    результата ноль.

    Помог только
    Код (Text):
    1. invoke PostMessage,hDlg,WM_SYSCOMMAND,SC_MINIMIZE,0
    но окно серавно на полсекунды остается в нормальном состоянии только потом сворачивается, не подскажите как с этим боротся?
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Flasher
    а зачем его вообще создавать?
     
  3. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    Flasher
    Просто создавай окно невидимым. А при необходимости переноси на передний план ( SetForegroundWindow ) и отображай.
     
  4. zet

    zet New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2007
    Сообщения:
    121
    Убери WS_VISIBLE :)
     
  5. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    zet
    Собственно я это и предложил.
     
  6. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    Во первых:
    Т.е. система отображает диалоговое окно уже после того как приходит WM_INITDIALOG. Естественно, что вызов ShowWindow ни к чему не приводит.

    Наличие/отсутствие WS_VISIBLE тоже ни на что не влияет:
    Ну, можно например просто обрабатывать первый WM_SHOWWINDOW, приходящий твоему окну. Но это, имхо, громоздкое, ненадёжное и неэлегантное решение. (По крайней мере, в моей реализации. =)


    Код (Text):
    1. .data
    2. ; . . .
    3. Coun_Ter    db 0
    4. ; . . .
    5.  
    6. .code
    7.  
    8.  
    9. ; . . .
    10.  
    11.     sub     eax,eax
    12.     push    eax
    13.     push    offset WndProc
    14.     push    eax
    15.     inc     eax
    16.     push    eax
    17.     push    hInstance
    18.     call    DialogBoxParam
    19.  
    20. ; . . .
    21.  
    22.     .elseif uMsg == WM_SHOWWINDOW
    23.         .if Coun_Ter==1
    24.             xor     al,al
    25.             mov     Coun_Ter,al
    26.             push    WS_MINIMIZE
    27.             push    GWL_STYLE       ;offset of value to set
    28.             push    hDlg            ;handle to window
    29.             call    SetWindowLong
    30.         .endif
     
  7. letika

    letika New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    28
    Flasher
    В общем случае задача не имеет решения :) Попробуй CreateDialogParam, если окно одно (главное), то модальность тебе не нужна. Если же хочешь поищвращаться, то вот сокрытие модального окна при загрузке.
     
  8. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    G13, и SetWindowLong не помог :)
    Рас другого выхода нет, ну и фиг сним, пусть высветится перед уходом в трей ;)
     
  9. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    Flasher, покажи код. можно в пм
     
  10. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    letika
    Ну, почему же. Вот вариант решения:

    1) rc-диалог - обязательно без WS_VISIBLE, и 2) ShowWindow(SW_HIDE) - на первое WM_NCPAINT.

    В аттаче - демка на эту тему.
     
  11. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    В моём случае и
    Код (Text):
    1.  .elseif uMsg==WM_NCPAINT
    2.     invoke GetWindowLong,hWnd,DWL_USER
    3.     .if eax==0
    4.       invoke IsWindowVisible,hWnd
    5.       .if eax!=0
    6.         invoke SetWindowLong,hWnd,DWL_USER,eax
    7.         invoke ShowWindow,hWnd,SW_MINIMIZE
    8.       .endif
    9.     .endif
    10.     xor eax,eax
    11.     ret
    без Timer'a прекрасно подошло.

    kero, спасибо огромное!
     
  12. kero

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

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

    1) По ссылке от letika теперь в конце можно найти указание и на другой способ:
    на WM_WINDOWPOSCHANGING в WINDOWPOS.flags сбрасывать бит SWP_SHOWWINDOW (структура WINDOWPOS по lParam).

    2) Предложенный выше вариант решения приходит автоматически при правильной постановке исходного вопроса, а именно: "Когда модальный диалог начинает быть видимым?"). В аттаче - соответствующий тест (и на васме это уже было).