C>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку
Если действительно нужно скрывать модальное окно, то можно сделать так:
Добавь в свой класс диалога функцию DoModal(), перепиши в нее содержимое
CDialog::DoModal() из исходников MFC — (dlgcore.cpp), найди в этой функции
строки
// enter modal loop
DWORD dwFlags = MLF_SHOWONIDLE;
и своем классе замени их на
// enter modal loop
DWORD dwFlags = 0; // MLF_SHOWONIDLE;
Чтоб все компилилось нужно подключить afxpriv.h и определить макрос
#define DELETE_EXCEPTION(e) do { e->Delete(); } while (0)
Еще в свойствах ресурса этого диалога надо убрать галочку More Styles->VISIBLE
Здравствуйте IT, Вы писали:
IT>И в этом смысле, решение Odi$$ey'я мне представляется наиболее привлекательным.
IT>ShowWindow(SW_SHOWMINNOACTIVE) действительно работает безотказно, но окошко в таскбаре мне не нужно, как его можно убрать?
IT>Так как насчёт Q&A?
Итак, для MFC
1. В OnInitDialog помещаем след код
CWnd* wnd = new CWnd;
wnd->CreateEx(0,"#32770","Hidden Window",0,0,0,0,0,0,0);
SetParent(wnd);
ShowWindow(SW_SHOWMINNOACTIVE);
Для прятания самого окна также подойдет код Одиссея.
2. Для Апи немного отличается. Тут окошки прячутся почемуто не до конца с
ShowWindow(SW_SHOWMINNOACTIVE); — Нужно копать создание диалога в MFC и сравнивать.
Чтоб не показывался — убрать стиль WS_VISIBLE или Вызвать ShowWindow(SW_HIDE);
3. Для АПИ DialogBox
Подойдет все, что для CreateWindow
но Диаложек будет присутствовать в минимизированном виде на десктопе — нужно перехватить какоето сообщение (хучь таймер, хучь еще что) и сделать ShowWindow(SW_HIDE);
Здравствуйте Hollander, Вы писали:
H>ShowWindow(SW_SHOWMINNOACTIVE) перед выходом из OnInitDialog действует безотказно для всех окошек-диалогов.
H>Чтоб убрать из таскбара(Есть статья на эту тему) : H> Для диалога-аппликации необходимо в парент установить невидимое окно. H> Для обычного диалога убрать стиль WS_EX_APPWINDOW и WS_OVERLAPPED — по умолчанию создаются без отображения в таск бар.
H> WS_EX_TOOLWINDOW не помогает для диалога
Почитал я весь thread и нахожусь в полном недоумении: сабж — это нечто вроде спортивного интереса или как? Помню, мне нужно было засунуть в трей прогу, управляющую сидюком через клаву. Диалог все-равно нужен (настройка, информация, то-се...). Побился-побился с модальником, после чего сделал через CreateDialog и message pump. Никаких проблем с кнопкой в таскбаре, морганием окна, стилями и проч. И главное! Модальность (или немодальность) его мне совершенно безразлична — я не собираюсь дисэйблить родительское окно (десктоп)
Здравствуйте Clover, Вы писали:
C>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку
Можно попробовать такую последовательность: CreateWindow, ShowWindow и RunModalLoop
Здравствуйте Hollander, Вы писали:
H>В MFC у тебя и так вызывается CreateWindow. А проблем не было потому, что, скорее всего, главное окно не диалог было.
Продолжаю находиться в недоумении — откуда ты это взял. Во-первых, я написал ясно, что делал диалог, во-вторых, создавал я его посредством CreateDialog. Нету в MFC такого метода ни в одном классе. Следовательно писал я на API.
H>Могу кинуть пример на АПИ и убедишься сам.
Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API. Примеров на API мне кидать не надо, я тебе сам могу их кинуть. Вот прям сейчас и займусь — вот полный код проги, которая запускается и садит себя в трей:
Как видишь, никаких невидимых окон и модальных диалогов — обходимся одним диалогом, вот только немодальным.
А теперь посмотрим, как будет выглядеть данная концепция в преломлении MFC (масленица сейчас — праздник :-) ):
///////////////////////
// Trayed.h#include"TrayedDlg.h"class CTrayedApp : public CWinApp
{
public:
CTrayedApp();
//{{AFX_VIRTUAL(CTrayedApp)public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL
CTrayedDlg* m_pDlg;
//{{AFX_MSG(CTrayedApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
///////////////////////
// Trayed.cpp
BOOL CTrayedApp::InitInstance()
{
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL#else
Enable3dControlsStatic(); // Call this when linking to MFC statically#endif
m_pDlg = new CTrayedDlg;
m_pDlg->Create( CTrayedDlg::IDD );
m_pMainWnd = m_pDlg;
return TRUE; // закручиваем message loop
}
int CTrayedApp::ExitInstance()
{
delete m_pDlg;
return CWinApp::ExitInstance();
}
///////////////////////
// TrayedDlg.cpp
BOOL CTrayedDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE); // Set big icon
m_pni = new CNotifyIcon( m_hWnd, IDR_NI );
return TRUE; // return TRUE unless you set the focus to a control
}
void CTrayedDlg::OnOK()
{
PostQuitMessage(0);
CDialog::OnOK();
}
LRESULT CTrayedDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if( m_pni )
m_pni->Dispatch( m_hWnd, message, wParam, lParam );
return CDialog::WindowProc(message, wParam, lParam);
}
void CTrayedDlg::OnPop()
{
ShowWindow( IsWindowVisible() ? SW_HIDE : SW_SHOW );
}
void CTrayedDlg::OnQuit()
{
OnOK();
}
Теперь покажи мне — где здесь "В MFC у тебя и так вызывается CreateWindow"?
То, что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе. И для данной задачи совершенно нет необходимости корячиться через DoModal(), о чем я и имел честь сообщить всей честной компании в предыдущем послании.
Здравствуйте Clover, Вы писали:
C>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку
Естественно ! Окно то еще не создано. Оно создается внутри DoModal. Сделай в OnInitDialod вызов ShowWindow(SW_HIDE) или поэкспериментируй со стилем WS_VISIBLE.
Здравствуйте Hollander, Вы писали:
H>Здравствуйте Clover, Вы писали:
C>>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку
H>Естественно ! Окно то еще не создано. Оно создается внутри DoModal.
это да
H>Сделай в OnInitDialod вызов ShowWindow(SW_HIDE)
это не действиет, вернее отменяется по завершении OnInitDialog
H>или поэкспериментируй со стилем WS_VISIBLE.
а это действует только на немодальные
Можно еще в конце OnInitDialog слать себе сообщение, а в его обработчике вызывать ShowWindow(SW_HIDE), но тогда окно перед исчезновением успевает мыргнуть на экране.
Здравствуйте Clover, Вы писали:
C>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку :-(
Здравствуйте Odi$$ey, Вы писали:
H>>Естественно ! Окно то еще не создано. Оно создается внутри DoModal.
O$>это да
H>>Сделай в OnInitDialod вызов ShowWindow(SW_HIDE)
только что проверил на свежесгнерированном проекте — ShowWindow(SW_SHOWMINNOACTIVE)
Можно SW_SHOWMINIMIZED
O$>Можно еще в конце OnInitDialog слать себе сообщение, а в его обработчике вызывать ShowWindow(SW_HIDE), но тогда окно перед исчезновением успевает мыргнуть на экране.
Да же и не появляется ни на долю секунды. А чем ты сообщение шлешь, не PostMessage ? Тогда должно моргать, иначе это тоже самое, что вызвать напрямую функцию окна.
Здравствуйте Hollander, Вы писали:
H>Здравствуйте Odi$$ey, Вы писали:
H>>>только что проверил на свежесгнерированном проекте — ShowWindow(SW_SHOWMINNOACTIVE) H>>>Можно SW_SHOWMINIMIZED
O$>>хе-хе а плашечка-то на таскбаре осталась, щелкаешь по ней и вот он твой диалог.
H>Ну что ты пристал — диалог то спрятан. А на таскбаре виден — это пару стилей изменить. Уже был такой топик. Влом писать еще раз.
Че пристал, че пристал... Работа такая Довел бы свой способ до полного консенсуса, написали бы Q&A — "33 способа запустить модальный диалог со скрытым окном" , а то действительно, сколько-ж можно одно и тоже писать
H>>Ну что ты пристал — диалог то спрятан. А на таскбаре виден — это пару стилей изменить. Уже был такой топик. Влом писать еще раз.
O$>Че пристал, че пристал... Работа такая Довел бы свой способ до полного консенсуса, написали бы Q&A — "33 способа запустить модальный диалог со скрытым окном" , а то действительно, сколько-ж можно одно и тоже писать
O$>Здравствуйте Odi$$ey, Вы писали:
C>>>Как при загрузки программы скрыть главное окно приложения при условии,что оно диалоговое? Делаю ShowWindow перед DoModal и получаю ошибку
Здравствуйте Hollander, Вы писали:
H>>>Ну что ты пристал — диалог то спрятан. А на таскбаре виден — это пару стилей изменить. Уже был такой топик. Влом писать еще раз.
O$>>Че пристал, че пристал... Работа такая Довел бы свой способ до полного консенсуса, написали бы Q&A — "33 способа запустить модальный диалог со скрытым окном" , а то действительно, сколько-ж можно одно и тоже писать
H>Ну, 33 не получится, а 15-16 — вполне возможно...
Мне вот тут как раз понадобился хотя бы один. Так как насчёт Q&A?
Если нам не помогут, то мы тоже никого не пощадим.
O$>>>Че пристал, че пристал... Работа такая Довел бы свой способ до полного консенсуса, написали бы Q&A — "33 способа запустить модальный диалог со скрытым окном" , а то действительно, сколько-ж можно одно и тоже писать H>>Ну, 33 не получится, а 15-16 — вполне возможно...
IT>Мне вот тут как раз понадобился хотя бы один. Так как насчёт Q&A?
ShowWindow(SW_SHOWMINNOACTIVE) перед выходом из OnInitDialog действует безотказно для всех окошек-диалогов.
Если не нравится, можно сообщения поперехватывать WM_
Чтоб убрать из таскбара(Есть статья на эту тему) :
Для диалога-аппликации необходимо в парент установить невидимое окно.
Для обычного диалога убрать стиль WS_EX_APPWINDOW и WS_OVERLAPPED.
Можно добавить стиль WS_EX_TOOLWINDOW.
ShowWindow(SW_SHOWMINNOACTIVE) перед выходом из OnInitDialog действует безотказно для всех окошек-диалогов.
Чтоб убрать из таскбара(Есть статья на эту тему) :
Для диалога-аппликации необходимо в парент установить невидимое окно.
Для обычного диалога убрать стиль WS_EX_APPWINDOW и WS_OVERLAPPED — по умолчанию создаются без отображения в таск бар.
Здравствуйте IT, Вы писали:
IT>Здравствуйте Hollander, Вы писали:
H>>>>Ну что ты пристал — диалог то спрятан. А на таскбаре виден — это пару стилей изменить. Уже был такой топик. Влом писать еще раз.
O$>>>Че пристал, че пристал... Работа такая Довел бы свой способ до полного консенсуса, написали бы Q&A — "33 способа запустить модальный диалог со скрытым окном" , а то действительно, сколько-ж можно одно и тоже писать
H>>Ну, 33 не получится, а 15-16 — вполне возможно...
IT>Мне вот тут как раз понадобился хотя бы один. Так как насчёт Q&A?
В MFC у тебя и так вызывается CreateWindow. А проблем не было потому, что, скорее всего, главное окно не диалог было. Могу кинуть пример на АПИ и убедишься сам.
Вы писали: ИВ>Почитал я весь thread и нахожусь в полном недоумении: сабж — это нечто вроде спортивного интереса или как? Помню, мне нужно было засунуть в трей прогу, управляющую сидюком через клаву. Диалог все-равно нужен (настройка, информация, то-се...). Побился-побился с модальником, после чего сделал через CreateDialog и message pump. Никаких проблем с кнопкой в таскбаре, морганием окна, стилями и проч. И главное! Модальность (или немодальность) его мне совершенно безразлична — я не собираюсь дисэйблить родительское окно (десктоп)
Здравствуйте Игорь Вартанов, Вы писали:
ИВ>Почитал я весь thread и нахожусь в полном недоумении...
В данном случае мне нужен рабочий код и инструкция по шагам, а не советы. Самому разобраться — нет проблем, только я не хочу на это тратить больше 15 минут и ещё раз вникать в детали реализации DoModal из MFC.
И в этом смысле, решение Odi$$ey'я мне представляется наиболее привлекательным.
ShowWindow(SW_SHOWMINNOACTIVE) действительно работает безотказно, но окошко в таскбаре мне не нужно, как его можно убрать?
Так как насчёт Q&A?
Если нам не помогут, то мы тоже никого не пощадим.
H>>ShowWindow(SW_SHOW)
IT>Я так и знал.
H>>Я не понял, тебе это надо или нет ? H>> А то я, блин, все отложил, чтоб это все перепроверить...
IT>Надо, сегодня вечером буду это дело прикручивать.
Здравствуйте Игорь Вартанов, Вы писали:
H>>Могу кинуть пример на АПИ и убедишься сам.
Я заюзал твой пример.
1. Ресурс диалога ты не привел — какие стили — скорее всего VS_VISIBLE выключен, а если включен — почему твоя прога моргать не станет ?
2. Ты не показал код, откуда шлется WM_COMMAND с ID_POP — как проверить моргание ?
3. Кнопка в таскбаре у тебя будет видна, пока виден диалог, если ты не юзаешь стиль WS_EX_TOOLWINDOW — вот для исправления этого я и юзаю невидимое окно.
ИВ>Продолжаю находиться в недоумении — откуда ты это взял. Во-первых, я написал ясно, что делал диалог, во-вторых, создавал я его посредством CreateDialog. Нету в MFC такого метода ни в одном классе. Следовательно писал я на API.
Эта функция(не совсем — CreateDialogIndirect) вызывается примерно из DoModal. Модальный диалог в MFC на самом деле немодальный, но модальность организутся вручную. Можешь заглянуть в исходники или, на худой конец, в Call Stack.
ИВ>Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API. Примеров на API мне кидать не
А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...
Ты в примере привел примерно такой же код как и у меня, и что ты хотел этим сказать ? То что написал его на год раньше ?
ИВ> что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе.
Кудато тебя понесло не туда, причем здесь Визард ?
Немодальные диаложки — это моя страсть !
Здравствуйте Алекс, Вы писали:
А>Здравствуйте Hollander, Вы писали:
А>shr eax,8 — занимает 3 байта
Это в 8086 — shr eax,8 ?
Ты не обкурился ?
... а еще в 8086 конструкция shr xxx,n заменится на n shr xxx,1
А команда DIV займет в этом случае не меньше 100 тактов (а то и 180) — исключение — если число в регистре будет много меньше делителя.
Здравствуйте Dutchman, Вы писали:
D> 1. Ресурс диалога ты не привел — какие стили — скорее всего VS_VISIBLE выключен, а если включен — почему твоя прога моргать не станет ?
Выключен. Не станет.
D> 2. Ты не показал код, откуда шлется WM_COMMAND с ID_POP — как проверить моргание ?
См. CNotifyIcon
D> 3. Кнопка в таскбаре у тебя будет видна, пока виден диалог, если ты не юзаешь стиль WS_EX_TOOLWINDOW — вот для исправления этого я и юзаю невидимое окно.
Это на здоровье. Я, собственно, встрял лишь чтоб помочь IT отфильтровать поток о сабже. По имеющейся у меня информации он меня услышал. Больше меня ничего не интересует.
D>Эта функция(не совсем — CreateDialogIndirect) вызывается примерно из DoModal. Модальный диалог в MFC на самом деле немодальный, но модальность организутся вручную.
Cool.
Можешь заглянуть в исходники или, на худой конец, в Call Stack.
Ладно, как-нибудь взгляну.
D>А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...
Ты не в пример круче меня. Поздравляю.
D>Ты в примере привел примерно такой же код как и у меня, и что ты хотел этим сказать ? То что написал его на год раньше ?
См. сабж и мой исходник. Все, что я хотел сказать, это лишь что не нужно заставлять прятаться модальный диалог.
ИВ>> что в вижуале отсутствует мастер приложения на немодальном диалоге совершенно не означает, что его нельзя сделать в принципе.
D>Кудато тебя понесло не туда, причем здесь Визард ? D>Немодальные диаложки — это моя страсть !
ИВ>Дело в том, что я именно тот Игорь Вартанов, который пишет на MFC по очень большим праздникам, предпочитая все остальное время писать на API.
D>>А я тот самый Павел, который с детства писал на ассемблере, Си и, иногда, на Паскале для своих друзей. И в MSDN заглядываю тогда, когда мне влом порыться в исходниках...
ИВ>Ты не в пример круче меня. Поздравляю.
Да ладно, считается, что каждый последующий, загнувший пальцы, в два раза менее крут, чем предыдущий. Так что мне до тебя далеко, тот самый Игорь Вартанов, который пишет на АПИ и, по праздникам, на MFC.
ИВ>См. сабж и мой исходник. Все, что я хотел сказать, это лишь что не нужно заставлять прятаться модальный диалог.
Сабж начинался с MFC и там _нужно_ было прятать. Читайте внимательно. А то чз неколько дней можно мы перейдем не только на АПИ, но и на WTL, или, еще лучше, на QT(2).
Здравствуйте, Odi$$ey, Вы писали:
OE>что поделать, это единственный известный мне способ скрыть окно модального диалога при его запуске. OE>Кто знает другие — расскажите, мне тоже интересно.
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, kero, Вы писали:
OE>>>Кто знает другие — расскажите, мне тоже интересно. K>>Ну, вот еще способ (Win API).
OE>да вроде подсказали уже самый простой — Как спрятать окно ?
Выше я просто продублировал свой ответ в другом форуме, где ссылались на данную ветку.
Суть способа — ShowWindow(SW_HIDE) на первое WM_NCPAINT. (Кстати, заодно это и пример, когда наличие/отсутствие WS_VISIBLE в RC-файле модального DialogBox — действительно важно).
Вряд ли это сложнее подавления флага SWP_SHOWWINDOW на каждое WM_WINDOWPOSCHANGING
Впрочем, такое подавления тоже может быть применено "точечно", однако номер нужного из приходящих WM_WINDOWPOSCHANGING — не первый, и даже не постоянный.
А вообще, если исходный вопрос поставить правильно (а именно: "Когда модальный диалог начинает быть видимым?") — то решение приходит автоматически.