Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Invisible CDialog / 11 сообщений из 11, страница 1 из 1
12.01.2006, 16:18
    #33479505
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
Бьюсь над проблемой в MFC CDialog based проекте надо, чтобы диалог при старте проги не отображался, но пока решить эту задачу не получается, приходиться прибегать к разным ухищрениям. Интересует следующее: можно ли это сделать так, чтобы окно не было видно с самого начала работы программы, а не дожидаться первой отрисовки, чтобы его скрыть?
...
Рейтинг: 0 / 0
12.01.2006, 18:45
    #33479909
KALAKOM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
А если в редакторе ресурсов в свойствах диалога поставить Visible = False.
...
Рейтинг: 0 / 0
12.01.2006, 19:05
    #33479951
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
KALAKOMА если в редакторе ресурсов в свойствах диалога поставить Visible = False.
нет, первым делом попробовал (наивный), а так же в OnInitDialog() ShowWindow(SW_HIDE)
и много другого уже не помню даже всего
сейчас остановился на том, что убираю окно за пределы рабочего стола, после первой отрисовки оно начинает "хватать" команду ShowWindow(SW_HIDE) и загоняю в трей, но это криво как-то
...
Рейтинг: 0 / 0
12.01.2006, 23:45
    #33480194
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
CerebrumБьюсь над проблемой в MFC CDialog based проекте надо,
чтобы диалог при старте проги не отображался,

О, большааая проблема !!

Интересует следующее: можно ли это сделать так, чтобы окно не было видно с самого начала работы программы,

Можно. Флак VISIBLE убери в шаблоне диалога.
...
Рейтинг: 0 / 0
12.01.2006, 23:49
    #33480197
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
А ты не DoModal вызывай а ShowWindow, сделай его главным, и цикл обработки сообщений запусти. ( CApplication::Run() или как там ).
Короче, сделай себе SDI приложение визардом, и возьми оттуда код,
который в InitInstance и ExitInstance, только всю лабуду на счет документов и доктемплейтов выкидывай. Она тебе не нужна.
...
Рейтинг: 0 / 0
12.01.2006, 23:52
    #33480199
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
Ну и еще есть способ, совсем "для тупых". Взять нагенерить то же SDI приложение, но главное окно не показывать (ShowWindow не делать),
и сделать твой диалог CreateDialog-ом. А на Destrow диалога вызывать PostQuitMessage.
...
Рейтинг: 0 / 0
13.01.2006, 08:01
    #33480361
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
MasterZivНу и еще есть способ, совсем "для тупых". Взять нагенерить то же SDI приложение, но главное окно не показывать (ShowWindow не делать),
и сделать твой диалог CreateDialog-ом. А на Destrow диалога вызывать PostQuitMessage.
спасибо за советы MasterZiv , сегодня буду пробывать
...
Рейтинг: 0 / 0
15.01.2006, 15:14
    #33483529
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
Для уточнения : Делает принудительно видимым диалог MFC-шная функция CDialog::DomModal(). (и правильно делает, кстати).
...
Рейтинг: 0 / 0
14.03.2006, 15:55
    #33599864
Invisible CDialog
А между тем решение есть и очень простое.
Правильно ли там ДуМодал делает визибле окно или нет - это по-моему решать прогаммисту.
Решение.
Заходим в код MFC-код ф-ии CDialog::DoModal(). Эта ф-я виртуальная, а значит
её вполне законно можно перегрузить. Копируем все содержимое ф-ии CDialog::DoModal() и вставляем его в CMyDialog::DoModal(). И внутри меняем только одну вешь. Вместо оригинального кода
...
// enter modal loop
DWORD dwFlags = MLF_SHOWONIDLE;
if (GetStyle() & DS_NOIDLEMSG)
dwFlags |= MLF_NOIDLEMSG;
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
...
Пишем
...
// enter modal loop
DWORD dwFlags = 0; //!!! <---------
if (GetStyle() & DS_NOIDLEMSG)
dwFlags |= MLF_NOIDLEMSG;
VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
...
А вместо
DELETE_EXCEPTION(e);
пишем
e->Delete();
И надо вначале сделать инклюд #include <afxpriv.h>
Ну и естественно что в ресурсе диалога в его свойстве Visible надо задать FALSE.

Есть и другой вариант. Проще. Ничего перегружать не надо.
CMyDialog dlg;
dlg.Create(IDC_DIALOG_RESOURCE, 0);
int RetCode = dlg.RunModalLoop(0); //<--тут мы попадаем в модальный цикл
if(RetCode == IDOK)
{
}
else
{
}
...
В этом случае в ресурсе диалоге поле Visible тоже должно быть выставлено в FALSE

//кто ищет, тот найдет :)
...
Рейтинг: 0 / 0
14.03.2006, 17:57
    #33600370
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
Спасибо
...
Рейтинг: 0 / 0
14.03.2006, 22:52
    #33600871
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Invisible CDialog
Да гость я, гость.А между тем решение есть и очень простое.
Правильно ли там ДуМодал делает визибле окно или нет - это по-моему решать прогаммисту.


Есть решение еще круче -- ничего не перегружать, а переопределить саму CDialog::DoModal() в своей программе. В MFC.dll при этом будет другая, но ты всегда будешь звать свою.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Invisible CDialog / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]