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

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

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

Можно. Флак VISIBLE убери в шаблоне диалога.
...
Рейтинг: 0 / 0
Invisible CDialog
    #33480197
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты не DoModal вызывай а ShowWindow, сделай его главным, и цикл обработки сообщений запусти. ( CApplication::Run() или как там ).
Короче, сделай себе SDI приложение визардом, и возьми оттуда код,
который в InitInstance и ExitInstance, только всю лабуду на счет документов и доктемплейтов выкидывай. Она тебе не нужна.
...
Рейтинг: 0 / 0
Invisible CDialog
    #33480199
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и еще есть способ, совсем "для тупых". Взять нагенерить то же SDI приложение, но главное окно не показывать (ShowWindow не делать),
и сделать твой диалог CreateDialog-ом. А на Destrow диалога вызывать PostQuitMessage.
...
Рейтинг: 0 / 0
Invisible CDialog
    #33480361
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу и еще есть способ, совсем "для тупых". Взять нагенерить то же SDI приложение, но главное окно не показывать (ShowWindow не делать),
и сделать твой диалог CreateDialog-ом. А на Destrow диалога вызывать PostQuitMessage.
спасибо за советы MasterZiv , сегодня буду пробывать
...
Рейтинг: 0 / 0
Invisible CDialog
    #33483529
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для уточнения : Делает принудительно видимым диалог MFC-шная функция CDialog::DomModal(). (и правильно делает, кстати).
...
Рейтинг: 0 / 0
Invisible CDialog
    #33599864
А между тем решение есть и очень простое.
Правильно ли там ДуМодал делает визибле окно или нет - это по-моему решать прогаммисту.
Решение.
Заходим в код 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
Invisible CDialog
    #33600370
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
Invisible CDialog
    #33600871
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да гость я, гость.А между тем решение есть и очень простое.
Правильно ли там ДуМодал делает визибле окно или нет - это по-моему решать прогаммисту.


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


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