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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка нажатия на кнопку ОК 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование мобильных устройств"
Alexeis

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

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

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


 




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


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

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