Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hide on SC_MINIMIZE 
:(
    Опции темы
tusha
Дата 28.8.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



доброго времени суток всем!
полдня бьюсь с такой проблемой
есть обычное MFC Dialog приложение, надо при запуске формы (приложения) свернуть в трей а саму форму убрать с экрана. с добавлением иконки в трей , с подвязкой обработчика событий на клик по иконке проблем нету. возникла проблема с сворачиванием приложения - при загрузке оно остается видимым на панеле задач(свернутое). однако ж когда второй раз нажимаю кнопку свернуть - оно обрабатывает нормально - т.е. убирается с экрана и панели задач. 

код: OnInitDialog()
Код

BOOL CPreventClosingDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // прочая инициализацая 

    SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0); // без этого не отрабатывает OnSysCommand ?? почему??????
    ShowWindow(SW_MINIMIZE);

    return TRUE;  // return TRUE  unless you set the focus to a control
}


OnSysCommand
Код

if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {        
        switch (nID)
        {
        case SC_MINIMIZE:            
            MessageBox(L"ACHTUNG!!!",0,0);
            ShowWindow(SW_HIDE);            
            break;
        default:
            CDialog::OnSysCommand(nID, lParam);
        }
    }

подскажите в чем прикол ?  smile 
PM MAIL   Вверх
GremlinProg
Дата 28.8.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 2
Всего: 106



Цитата(tusha @  28.8.2009,  14:58 Найти цитируемый пост)
подскажите в чем прикол ? 

Цитата(WM_SYSCOMMAND Notification @  MSDN)

In WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system. To obtain the correct result when testing the value of wParam, an application must combine the value 0xFFF0 with the wParam value by using the bitwise AND operator. 



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
tusha
Дата 28.8.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



да, забыл про эту фишку...
однако ж
Код

if ((nID & 0xFFF0) == SC_MINIMIZE)
{
    ShowWindow(SW_HIDE);            
}


тоже не хочет с первого раза работать, в дальнейшем - нормально
PM MAIL   Вверх
GremlinProg
Дата 28.8.2009, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 2
Всего: 106



сложно сказать, если тот код был имено на WM_SYSCOMMAND, то непонятно, как может быть связан nID с IDM_ABOUTBOX, оставь тут только свитч

но вообще, если без IDM_ABOUTBOX не работает, значит проблема где-то в другом месте


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
tusha
Дата 28.8.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



вот полностью 
Код

void CPreventClosingDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    switch (nID & 0xFFF0)
    {
    case SC_MINIMIZE:
        ShowWindow(SW_HIDE);
        break;
    default:
        CDialog::OnSysCommand(nID, lParam);
    }
}


причем кусок 
Код

        if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
  *******************************

сгенерен самой студией при создании проекта
PM MAIL   Вверх
Albor
Дата 28.8.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



OnInitDialog() отрабатывает когда окна ещё нет на экране, поэтому сразу окно появляется в свёрнутом виде и видимое.  
Цитата(GremlinProg @  28.8.2009,  13:46 Найти цитируемый пост)
как может быть связан nID с IDM_ABOUTBOX

Что здесь удивительного - это идентификатор меню, то есть проверяется команда от системного меню, если он попал в OnSysСommand, значит показывается диалог About. 
PM MAIL ICQ   Вверх
tusha
Дата 28.8.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



в таком случае в какой момент посылать окну сообщение 
Код

SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);


??
PM MAIL   Вверх
Albor
Дата 28.8.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Когда оно появляется на экране.

Добавлено через 2 минуты и 41 секунду
WM_SHOWWINDOW, толко обеспечь однократное срабатывание при первом показе окна, иначе окно всё время будет невидимым.
PM MAIL ICQ   Вверх
GremlinProg
Дата 28.8.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 2
Всего: 106



теперь понятно,
просто с API (тема мигрировала) это выглядит не логично,
т.к. для использования такого "финта" нужно хотя бы дать понять,
что была произведена работа с системным меню (добавление item'а),
прежде чем вставлять IDM_ABOUTBOX в свитч системного меню


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Albor
Дата 28.8.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



А разве студия не вставляет в OnInitDialog такой код?
Код

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

PM MAIL ICQ   Вверх
tusha
Дата 31.8.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Всеравно какойто бок получается... 
создал обработчик на WM_SHOWWINDOW обработчик отрабатывает, однако после него еще какоето событие происходит....
Код

void CPreventClosingDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
    CDialog::OnShowWindow(bShow, nStatus);
    if (IsFirstTime && bShow==TRUE)
    {
//        MessageBox(L"хххх",0,0);
        SendMessage(WM_SYSCOMMAND,SW_HIDE,0);
        IsFirstTime=FALSE;
    }
    // TODO: Add your message handler code here
}

т.е. мессаджбокс отрабатывает, но форма всеравно становится видимой...)
Добавлено @ 10:30
такая же фигня если поместить данный кусок кода в обработчик OnPaint

Это сообщение отредактировал(а) tusha - 31.8.2009, 10:31
PM MAIL   Вверх
GremlinProg
Дата 31.8.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 2
Всего: 106



Цитата(tusha @  31.8.2009,  12:22 Найти цитируемый пост)
т.е. мессаджбокс отрабатывает, но форма всеравно становится видимой...)

а что мешает использовать немодальный диалог и начальный:
Код

::ShowWindow( hwnd, SW_HIDE );

т.е. не показывать диалог вообще при старте, т.к.:
Цитата(WM_SYSCOMMAND Notification @ MSDN)

window receives this message when the user chooses a command from the Window menu (formerly known as the system or control menu) or when the user chooses the maximize button, minimize button, restore button, or close button.

тут ведь ни слова о том, что уведомление должно сработать на ShowWindow


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Albor
Дата 1.9.2009, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Да, действительно не всё так просто с модальным диалогом. Как вариант можно попробовать скрыть окно таймером. Если найду что красивее, напишу.
PM MAIL ICQ   Вверх
tusha
Дата 1.9.2009, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 17.7.2008

Репутация: нет
Всего: 1



Цитата

т.е. не показывать диалог вообще при старте

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

а что мешает использовать немодальный диалог и начальный
 - 2 диалога ? или я не понял чтото... 

Цитата

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

 smile 
PM MAIL   Вверх
Albor
Дата 1.9.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



С таймером: в OnInitDialog вставляешь строку
Код

SetTimer(WM_USER+100,100,0);

Добавляешь обработчик WM_TIMER и в нём пишешь
Код

if(nIDEvent==WM_USER+100) 
    {
        ShowWindow(SW_HIDE);
        KillTimer(WM_USER+100);
    }
    CDialog::OnTimer(nIDEvent);


PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0776 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.