Модераторы: Alexeis

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка нажатия на кнопку ОК 
:(
    Опции темы
Brodyaga
Дата 26.2.2009, 17:55 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброго времени суток! Пишу на С++ (MSVC 2005) под WinMobile.. Интересует следующее.. Как сделать так, чтобы при нажатие на кнопку ОК, находящуюся в правом верхнем углу диалога программа не закрывалась, а сворачивалась.. И как повесить на эту кнопку свой обработчик?
PM MAIL   Вверх
WaReZMEN
Дата 26.2.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 683
Регистрация: 9.6.2006
Где: Россия, Санкт-Пет ербург

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



Brodyaga, а разве у формы нет события onClose?
PM MAIL ICQ   Вверх
Brodyaga
Дата 26.2.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть, но что с того? Мне нужно на кнопку свой обработчик повесить как то...
PM MAIL   Вверх
Brodyaga
Дата 6.3.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну что? неужели никто не знает? :(

Событие OnClose не вызывается при нажатии на кнопку ОК..
PM MAIL   Вверх
Skynin
Дата 6.3.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

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



...Потому что кнопка ОК - закрывает а не сворачивает форму. В правом верхнем углу у формы должен быть крестик (такие вот парадоксы) и тогда форма-приложение будет сворачиваемым.

Насчет  OnClose... пишу на .NET CF - поэтому подсказать о С++ не могу.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Brodyaga
Дата 6.3.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Тогда, как сделать этот самый крестик? а самое главное как обработать нажатие на эти кнопки.. потому что при нажатии на них во всех диалогах кроме главного, программа просто зависает.. а при нажатии на главном - закрывается...
PM MAIL   Вверх
Skynin
Дата 6.3.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

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



MyForm.MinimizeBox = true;

Цитата

а самое главное как обработать нажатие на эти кнопки.. 

В C# на .NET CF подпиской на соответствующие события.

Цитата

потому что при нажатии на них во всех диалогах

У меня не зависает.
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Brodyaga
Дата 6.3.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

В C# на .NET CF подпиской на соответствующие события.

Судя из первого поста С# меня не интересует.

На C# у меня тоже не виснет и минимайзбокс свойство работает корректно..

Это сообщение отредактировал(а) Brodyaga - 6.3.2009, 13:28
PM MAIL   Вверх
ksili
Дата 6.3.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Brodyaga @  26.2.2009,  21:55 Найти цитируемый пост)
Как сделать так, чтобы при нажатие на кнопку ОК, находящуюся в правом верхнем углу диалога программа не закрывалась, а сворачивалась..

У меня в этом углу крестик. Расскажи как ты держишь девайс...



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


Опытный
**


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

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



Что значит как держу? Проект создаю MFC Smart Device Application основанный на диалогах..
PM MAIL   Вверх
ksili
Дата 6.3.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Проект такого типа я не создавал, но там наверно как и в обычном MFC. В дизайнере диалога щёлкни дважды по этой кнопке и открется её обработчик.


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


Опытный
**


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

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



smile)) В Дизайнере диалога этой кнопки нет smile
PM MAIL   Вверх
ksili
Дата 6.3.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Можно попробовать так: найти в свойствах диалога, как отключить эту системную кнопку. Чтоб ее воообще не было. А на ее месте нарисовать свою. А уж для своей кнопки обработчик сможешь приделать.


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


Опытный
**


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

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



Можно.. Но помоему это будет через одно место... Должен же быть грамотный способ, как то ведь пишут такие приложения на с++ и нормально...

Это сообщение отредактировал(а) Brodyaga - 6.3.2009, 14:34
PM MAIL   Вверх
mrbrooks
Дата 12.3.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Brodyaga, все что тебе нужно - это перехватить событие этой кнопки.
Либо перегрузить функции PreTranslateMessage и перехватить там сообщение WM_COMMAND по параметрам IDOK (я обычно в трей пихаю по нажатию на эту кнопку) и IDCANCEL
Либо в функции InitInstance есть переменная nResponse. Она принимает также принимает значения IDOK и IDCANCEL. Собственно простым оператором ветвления можешь описать свои действия.
PM MAIL   Вверх
Brodyaga
Дата 12.3.2009, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Первый вопрос:
Как запихнуть в терй по условию нажатия на эту кнопку

Второй:
Как быть с другими диалогами? По нажатию кнопки ОК на которых приложение зависает..
PM MAIL   Вверх
Brodyaga
Дата 13.3.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Либо в функции InitInstance есть переменная nResponse. Она принимает также принимает значения IDOK и IDCANCEL. Собственно простым оператором ветвления можешь описать свои действия.


Ну и что... послал я по нажатию на IDOK форме сообщение, чтобы она свернулась.. а она всеровно закрылась...

Код

    INT_PTR nResponse = dlg.DoModal();
    if (nResponse == IDOK)
    {
        ::SendMessage(dlg.GetSafeHwnd(),WM_CLOSE,0,0);
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
    }


Она же модально открывается... следовательно в любом случае наверное закроется... Как избежать то этого?
PM MAIL   Вверх
Brodyaga
Дата 13.3.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашёл такую инфу...

вот ссылочки..
http://4pda.ru/forum/index.php?showtopic=6...aded&start=
http://www.rsdn.ru/Forum/message/3010001.flat.aspx

как там сказано использовал на диалогах (только не на главном) функцию SHDoneButton после их отображения:

Код

    pDialog->ShowWindow(SW_SHOW);

    ::SHDoneButton(pDialog->GetSafeHwnd(), SHDB_HIDE);


Кнопка ОК действительно исчезла.. появилась кнопка X. Как обработать событие нажатия на эту кнопку?? 

P.S.
Событие OnClose не срабатывает... :(
PM MAIL   Вверх
Brodyaga
Дата 20.3.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так никто и не ответил :(
Жаль..

Вот как это делается:

в файле где создаётся объект главного диалога есть функция InitInstance(). В ней наш диалог открываеца как модальный:
Код

    CMyDialog* dlg;

    m_pMainWnd = &dlg;
    INT_PTR nResponse = dlg.DoModal();

    if (nResponse == IDOK)
    {
        // TODO: Place code here to handle when the dialog is
        //  dismissed with OK
    }

    return FALSE;

При таком подходе сворачивания конечно не получица. Меняем это и открываем диалог как не модальный, убирая при этом кнопку ОК и ставя на её месте X:
Код

    CMyDialog* dlg;

    dlg = new CMyDialog();
        
    m_pMainWnd = dlg;

    BOOL ret = dlg->Create(IDD_MYDIALOG);

    if(!ret)
        AfxMessageBox(L"Ошибка при создании диалога");

    dlg->ShowWindow(SW_SHOW);

    dlg->ModifyStyle(0, WS_EX_CAPTIONOKBTN, SWP_NOSIZE);
    ::SHDoneButton(dlg->GetSafeHwnd(), SHDB_SHOWCANCEL);
    ::SHDoneButton(dlg->GetSafeHwnd(), SHDB_HIDE);

    return TRUE;


После этого обрабатываем в нашем диалоге событие OnCancelMode:
Код

void CMyDialog::OnCancelMode()
{
    CDialog::OnCancelMode();

    ShowWindow(SW_HIDE);
}


Всё.. Кнопка ОК заменена на Х! И самое главное диалог по нажатию на Х действительно сворачивается! smile

Это сообщение отредактировал(а) Brodyaga - 20.3.2009, 15:55
PM MAIL   Вверх
Brodyaga
Дата 26.10.2009, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Опять вернусь к этому вопросу... для главной формы то сделал.. а как быть с остальными диалоговыми формами?! При нажатию на кнопку ОК которых, приложение виснет, а должно закрывать формы...

Написание обработчика в OnCancelMode() не помогло, так как следом вызывается OnCancelMode() главнйо формы и сворачивает всё формы одной левой... :(

проект MFC Smart Device Application, MSVC 2005.
PM MAIL   Вверх
Brodyaga
Дата 29.10.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну что? есть какиенить предположения, очень надо...
PM MAIL   Вверх
ksili
Дата 30.10.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Ну у тебя же есть уже свой класс диалогов CMyDialog? Пропиши все эти настройки у него в OnInitDialog , а потом все диалоги в своем приложении создавай как экземляры класса CMyDialog. И у них у всех будет
Цитата(Brodyaga @  20.3.2009,  19:54 Найти цитируемый пост)
Кнопка ОК заменена на Х! И самое главное диалог по нажатию на Х действительно сворачивается!




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


Опытный
**


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

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



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

Цитата

Пропиши все эти настройки у него в OnInitDialog

какие эти? 

Если эти:
Код

   CMyDialog* dlg;

    dlg = new CMyDialog();
        
    m_pMainWnd = dlg;

    BOOL ret = dlg->Create(IDD_MYDIALOG);

    if(!ret)
        AfxMessageBox(L"Ошибка при создании диалога");

    dlg->ShowWindow(SW_SHOW);

    dlg->ModifyStyle(0, WS_EX_CAPTIONOKBTN, SWP_NOSIZE);
    ::SHDoneButton(dlg->GetSafeHwnd(), SHDB_SHOWCANCEL);
    ::SHDoneButton(dlg->GetSafeHwnd(), SHDB_HIDE);

    return TRUE;


То это же я не в InitDialog прописывал, а в InitInstance, главного класса:
Код

class CMyApp : public CWinApp
{
 ...
};


Это сообщение отредактировал(а) Brodyaga - 30.10.2009, 08:56
PM MAIL   Вверх
ksili
Дата 30.10.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Brodyaga @  30.10.2009,  12:43 Найти цитируемый пост)
Дык мне нужно чтобы у других как раз была кнопка OK, которая бы закрывала окно

а раньше писал
Цитата(Brodyaga @  27.10.2009,  01:46 Найти цитируемый пост)
для главной формы то сделал.. а как быть с остальными диалоговыми формами?!

вот и понял неправильно 

Ну наверно стоит поставить брекпойнт в оконной функции и посмотреть, что происходит на сообщении WM_CLOSE.


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


Опытный
**


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

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



Цитата

вот и понял неправильно 

Да, это я неправильно выразился

Цитата

Ну наверно стоит поставить брекпойнт в оконной функции и посмотреть, что происходит на сообщении WM_CLOSE.

Тут нет оконной функции, MFC. Можно подписаться на сообщение WM_CLOSE, но прога туда не переходит :( как быть?
PM MAIL   Вверх
Brodyaga
Дата 31.10.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выкладываю пример, в котором можно наблюдать то, о чём я говорю.
Чтобы увидеть это:
1. Запустите приложение
2. Нажмите кнопку "Открыть форму"
3. На открытой форме нажмите кнопку ОК в правом верхнем углу.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TestProject.rar 104,83 Kb
PM MAIL   Вверх
ksili
Дата 6.11.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Я не наблюдаю зависания. По-моему просто на это нажатие нет никакого действия. Кнопка мигает при каждом нажатии, т.е. реагирует.


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


Опытный
**


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

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



Цитата

Я не наблюдаю зависания.

А попробуй после нажатия на кнопку ОК(в правом верхнем углу) понажимать на кнопки ОК и Cancel на форме..
PM MAIL   Вверх
ksili
Дата 7.11.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(Brodyaga @  7.11.2009,  00:22 Найти цитируемый пост)
А попробуй после нажатия на кнопку ОК(в правом верхнем углу) понажимать на кнопки ОК и Cancel на форме..

После первого нажатия на любую кнопки ОК и Cancel перестают реагировать. Так что по-моему дело не только в кнопке ОК в правом верхнем углу. Если будет время, я ещё посмотрю.


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


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

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



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

или как вариант можно изменить стиль на лету

Добавлено через 5 минут и 3 секунды
Цитата(Brodyaga @  30.10.2009,  12:49 Найти цитируемый пост)
Можно подписаться на сообщение WM_CLOSE, но прога туда не переходит :( как быть? 

тебе надо перегрузить методы OnOk & OnCancel

PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование мобильных устройств"
Alexeis

Раздел посвящен программированию мобильных устройств.

Все остальные вопросы по мобильным устройствам (КПК, смартфоны, телефоны, фотоаппараты и т.п),
не имеющие отношения к программированию, просьба размещать в разделе КПК, смартфоны, мобильники

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Платформы Windows Mobile и Windows Embedded | Следующая тема »


 




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


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

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