Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как создать невидимый модальный диалог?

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как создать невидимый модальный диалог?
 
Раньше думал нет проблем .
Не срабатывает в МОДАЛЬНОМ:

Код:
WINDOWPOS wp;
memset(&wp, 0, sizeof(wp));
wp.hwnd = this->m_hWnd;
wp.flags = SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER;
PostMessage(WM_WINDOWPOSCHANGING, 0, (LPARAM)&wp);
 
 
Пробовал, например, и вариант:
 SendMessage(WM_SHOWWINDOW, (WPARAM) SW_HIDE, 0);
Игрался с ModifyStyle(), ShowWindow(SW_HIDE) и т.д.
Ничего не помогло...
В своем диалоге рождаю 2 потока и работаю в них...
МОДАЛЬНый создан, чтобы в это время нельзя было нажать многочисленные меню, кнопки, тул-бары...  
Он никогда не нужен видимым. Закрываю его с одного из потоков, созданных им.  
 
Какие будут идеи?

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 14:09 30-01-2005
odl455



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
...
Although an application can designate the WS_VISIBLE style, the system always displays a modal dialog box regardless of whether the dialog box template specifies the WS_VISIBLE style.
...

Всего записей: 659 | Зарегистр. 26-08-2002 | Отправлено: 01:32 31-01-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
МОДАЛЬНый создан, чтобы в это время нельзя было нажать многочисленные меню, кнопки, тул-бары...  
Он никогда не нужен видимым. Закрываю его с одного из потоков, созданных им.

А не проще ли тогда на время сделать главному окну EnableWindow(hWnd,False) а потом наоборот.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:29 31-01-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
А не проще ли тогда на время сделать главному окну EnableWindow(hWnd,False) а потом наоборот.  

Нет, конечно.
В  основного окна, наследника CFrameWnd много детей, в том числе CSplitterWnd, CView, CFоrmView...
Не говоря уже о многочисленных ''внучатых'' диалогах...
В OnPaint() можно обойтись и простым ShowWindow(), но охота что-то ''покультурнее''.


----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 09:00 31-01-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Придумал способ как сделать типа невидимым модальный диалог
SetWindowRgn
идея думаю прозрачна.
Создаем модальный диалог и делаем его 1 на 1 или 0 на 0 пикселей размерами, он типа есть но его и нету не видно Вроде должно сработать.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 11:20 31-01-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Создаем модальный диалог и делаем его 1 на 1 или 0 на 0 пикселей размерами, он типа есть но его и нету не видно

Taк сделал в самом начале, но маленький квадратик все-таки видно.
А вот

Код:
void CDlg::OnPaint()  
{
CPaintDC dc(this); // device context for painting

ShowWindow(SW_HIDE);
}
 
срабатывает нормально.

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 11:34 31-01-2005
Tartrout



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
 
Еще одна идея -- отодвинуть его подальше, с экрана долой.

Всего записей: 316 | Зарегистр. 24-07-2002 | Отправлено: 12:59 31-01-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Tartrout

Цитата:
Еще одна идея -- отодвинуть его подальше, с экрана долой.

Это еще менее  ''культурно'' чем ShowWindow(SW_HIDE); в OnPaint().  

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 14:17 31-01-2005
segeich

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Не мудри  
ShIvADeSt тебе правильно советовал EnableWindow(FALSE) на главное окно. Этим ты и всех потомков заблокируешь.
Окна, которые не являются потомками главного, заблокируешь персонально.
 
Кстати, раз ты хочешь заблокировать меню и прочее, то чем тебя модальный диалог то не устраивает? Напиши там слова please wait и пусть себе висит
 

Всего записей: 112 | Зарегистр. 03-01-2003 | Отправлено: 01:29 01-02-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
segeich

Цитата:
Не мудри  

Лаконично и ясно...

Цитата:
Напиши там слова please wait и пусть себе висит

Если бы так, то зачем этот топик?...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 08:58 01-02-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Придумал продолжение способа, как сделать модальный диалог невидимым. Просто по другому посмотрел на проблему. Ведь невидимый диалог это не только тот у которого свойство Visible False но и тот, который просто не видно на экране. То есть если диалог переместить за пределы экрана, то будем иметь тот же результат, только это делается без проблем. Итак возможно просто переместить его за пределы, а можно вначале сделать его 1 на 1 пиксель и тоже переместить за экран при помощи SetWindowPos. Надеюсь это то что надо.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:56 02-02-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

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

Taк это, как раз, то о чем ''говорил'' неделю назад Tartrout...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 08:59 02-02-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83

Цитата:
Taк это, как раз, то о чем ''говорил'' неделю назад Tartrout...

Блин туплю. А мне все равно идея нравиться. )

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 09:45 02-02-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
 мне все равно идея нравиться

А чем не нравится ShowWindow(SW_HIDE) в OnPaint ?

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 14:15 02-02-2005
vserd

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Может наоборот, сделать его видимым и вывести в него что-то типа "подождите идет обработка..."? А то, видя такое поведение, как-то руки так и тянутся нажать Ctrl+alt+del и снять задачу как повисшую?  

Всего записей: 2065 | Зарегистр. 08-05-2002 | Отправлено: 15:49 02-02-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vserd

Цитата:
Может наоборот, сделать его видимым и вывести в него что-то типа "подождите идет обработка..."?  

Так в это время главная программа ''отдыхает'' и появляется GUI диагностики...
Так что проблем нет.

----------
Мы знаем: время растяжимо. Оно зависит от того,
Какого рода содержимым Вы заполняете его. (C. Маршак)

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 18:27 02-02-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83

Цитата:
Так в это время главная программа ''отдыхает'' и появляется GUI диагностики...  
Так что проблем нет.

Не понял, так вызывайте это ГУИ диагностики из главной программы, тогда оно будет модальным, и не епозволит переключиться в главное окно. Или здесь что то не так?

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:07 03-02-2005
mihas83



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Не понял, так вызывайте это ГУИ диагностики из главной программы, тогда оно будет модальным, и не епозволит переключиться в главное окно.  

это ГУИ - самостоятельная программа, которой предшествует ''черное'' окно смежников с батниками и т.д.
А я в своем невидимом диалоге рождаю 2 потока и ''работаю'' в них (ожидаю их результатов)...

Всего записей: 7855 | Зарегистр. 15-07-2003 | Отправлено: 09:51 03-02-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mihas83
Еще как вариант только под оси начиная с 2К, можно сделать невидимое окно при помощи  

Цитата:
 
begin
  SetWindowLong (Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  SetLayeredWindowAttributes (Handle, ColorToRGB(FColorKey), TrackBar1.Position , IWA_ALPHA);
 

если установить степень прозрачности 255 то окно невидимо.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:09 04-02-2005
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Как создать невидимый модальный диалог?


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru