В каком месте кода надо прятать окно приложения при старте?
Приложение - на основе диалога. Требуется, чтобы при старте приложения его окно исчезало с экрана и пряталось в SysTray. Сделать значок в SysTray можно из OnInitDialog(). А вот убрать окно с экрана никак не получается. Я для этого использую this->ShowWindow(SW_HIDE), но в OnInitDialog() функция еще не работает, а в других местах - уже поздно. Подскажите, please!
Вот еще одно доказательство того чот МФЦ шляпа!
В Win API есть такая функция:
BOOL ShowWindow(
HWND hWnd, // handle to window
int nCmdShow // show state
);
Parameters
hWnd
[in] Handle to the window.
nCmdShow
[in] Specifies how the window is to be shown. This parameter is ignored the first time an application calls ShowWindow, if the program that launched the application provides a STARTUPINFO structure. Otherwise, the first time ShowWindow is called, the value should be the value obtained by the WinMain function in its nCmdShow parameter. In subsequent calls, this parameter can be one of the following values.
Value Meaning
SW_FORCEMINIMIZE Windows 2000 or later: Minimizes a window, even if the thread that owns the window is hung. This flag should only be used when minimizing windows from a different thread.
SW_HIDE Hides the window and activates another window.
SW_MAXIMIZE Maximizes the specified window.
SW_MINIMIZE Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE Activates and displays the window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when restoring a minimized window.
SW_SHOW Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT Sets the show state based on the SW_ value specified in the STARTUPINFO structure passed to the CreateProcess function by the program that started the application.
SW_SHOWMAXIMIZED Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE Displays the window as a minimized window. This value is similar to SW_SHOWMINIMIZED, except the window is not activated.
SW_SHOWNA Displays the window in its current size and position.
This value is similar to SW_SHOW, except the window is not activated.
SW_SHOWNOACTIVATE Displays a window in its most recent size and position.
This value is similar to SW_SHOWNORMAL, except the window is not actived.
SW_SHOWNORMAL Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position. An application should specify this flag when displaying the window for the first time.
С уважением, Дмитрий
Да нет, не получится: проблема не в функции, а в том, где ее вызвать. В OnInitDialog функция ShowWindow, что API-шная, что MFC-шная бесполезна: окна-то еще нет...
С уважением, Дмитрий
Вот кусок моего кода на чистом апи:
void mwin_c::init(HINSTANCE hInst)
{
width = 640;
height= 480;
WNDCLASS wcl;
wcl.cbClsExtra = 0;
wcl.cbWndExtra = 0;
wcl.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
wcl.hCursor = LoadCursor(NULL,IDC_CROSS);
wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wcl.hInstance = hInst;
wcl.lpfnWndProc = WndProc;
wcl.lpszClassName = CLASSNAME;
wcl.lpszMenuName = NULL;
wcl.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
RegisterClass(&wcl);
hwnd = CreateWindow(CLASSNAME,WINDOWNAME,
WS_POPUP|WS_VISIBLE,
0,0,width,height,
NULL,
NULL,
hInst,
NULL);
if(!hwnd)
return;
ShowWindow(hwnd,SW_SHOWNORMAL);
//ShowWindow(hwnd,SW_HIDE);
}
Да нет, не получится: проблема не в функции, а в том, где ее вызвать. В OnInitDialog функция ShowWindow, что API-шная, что MFC-шная бесполезна: окна-то еще нет...
С уважением, Дмитрий
А зачем показывать окно, чтоб потом прятать?
А зачем показывать окно, чтоб потом прятать?
Ну, может, я не совсем точно выразился: мне надо, чтобы окно с самого начала было бы спрятанным.
Ну, может, я не совсем точно выразился: мне надо, чтобы окно с самого начала было бы спрятанным.
Сам же себе и ответил :)
Сними галочку Visible в свойствах своего диалога.
ShowWindow(m_hWnd, SW_HIDE | SW_MINIMIZE);
Но возник следующий вопрос: при этом приложение убирается в Таскбар. А как убрать его еще и из Таскбара?
Сними галочку Visible в свойствах своего диалога.
Не помогает. Никакой реакции.
Зачем ты или поставил?
Так работает. По крайней мере, приложение стало сворачиваться. Понимаю, что ShowWindow(m_hWnd, SW_HIDE); должно быть достаточно, и у меня это работает в других местах кода (например, если подвязать к какой-нибудь кнопке), но в OnInitDialog() - хоть тресни!
Так работает. По крайней мере, приложение стало сворачиваться. Понимаю, что ShowWindow(m_hWnd, SW_HIDE); должно быть достаточно, и у меня это работает в других местах кода (например, если подвязать к какой-нибудь кнопке), но в OnInitDialog() - хоть тресни!
Ты как диалог вызываешь?
OnInitDialog() инициализирует, и вы не можете там еще прятать окно, так как оно не прошло все стадии редрава и т.д.
Есть один плоский вариант, как уже говорилось убрать галочку видимости диалога, а потом по таймеру через 1-3 секунды сделать ему
ShowWindow(m_hWnd, SW_HIDE);
Удачи VitSoft
http://www.dev.vitgroup.com
Ну а как Вы хотите спрятать, то что еще не создалось ???
Так и я про то же.
Попробую через галочку с таймером. Спасибо!
Так и я про то же.
Попробую через галочку с таймером. Спасибо!
Ага... Вы еще девочку-секретаршу наймите, чтоб она пальчиками окно прятала при его создании :D :D :D
Зачем создавать невидимый диалог? Похоже на идиотизм...
Но если нужно такое извращение, тогда извращаться нужно до конца:
1. Объявляем метод DoModal() в классе MyDialog (или как он там у тебя называется). Это можно сделать из ClassWizard-а.
2. Копируем реализацию этого метода из файла ...\MFC\SRC\DLGCORE.CPP и вставляем в наш MyDialog.cpp в реализацию нашего метода DoModal().
3. Находим строчку
DWORD dwFlags = MLF_SHOWONIDLE;
и заменяем её на
DWORD dwFlags = 0;
4. Подключаем необходимые заголовочники и решаем, что сделать с макросом DELETE_EXCEPTION. Оставляю это вам, как домашнее задание.
5. В редакторе ресурсов снимаем галку 'Visible' в свойствах диалога.
6. Компилим и ...вуаля... полный изврат - невидимый диалог.
А теперь ответте: на кой он нужен?
Понимаю, что изврат. Сердце кровью обливается. Но Как по-нормальному-то сделать?
Функция существует такая OnPaint()!!!
там в конце и пишишь ShowWindow(SW_HIDE);
И никакого гемороя!
Функция существует такая OnPaint()!!!
там в конце и пишишь ShowWindow(SW_HIDE);
И никакого гемороя!
Надеюсь, ты это несерьезно?! :D
Это ведь не первое апреля, а первое января... :D
А вот метод с DoModal() - это не шутка, это действительно работает.
Надеюсь, ты это несерьезно?! :D
Это ведь не первое апреля, а первое января... :D
А вот метод с DoModal() - это не шутка, это действительно работает.
А в чем проблема?
А какой диалог спрятать нужно? Главное окно?
в классе объявляешь переменную bool show_window = false;(например).
Когда окно надо показать show_window = true;
когда спрятать show_window = false;
а в OnPaint()
if(!show_window)
ShowWindow(SW_HIDE);
else ShowWindow(SW_SHOW);
Вот исходники - диалог исезает на десять секунд после нажатия на кнопку!
А в чем проблема?
А какой диалог спрятать нужно? Главное окно?
в классе объявляешь переменную bool show_window = false;(например).
Когда окно надо показать show_window = true;
когда спрятать show_window = false;
а в OnPaint()
if(!show_window)
ShowWindow(SW_HIDE);
else ShowWindow(SW_SHOW);
Вот исходники - диалог исезает на десять секунд после нажатия на кнопку!
Ну, во-первых, функции OnPaint нет (она не является ф-цией стандартных библиотек или API, она не является методом-членом класса CDialog, CWindow и т.п.), во всяком случае пока её не объявят (как обработкик WM_PAINT).
Во-вторых, это неправильный и неэстетичный подход. Это почти то-же самое, что вещать сокрытие окна на таймер. Расходуется память под лишнюю переменную, лишний раз отправляется и обрабатывается сообщение WM_SHOWWINDOW при каждой попытке прорисовки окна. Это похоже на постоянную отправку самому себе посылки, чтоб не занимать пересылаемыми вещами места в шкафу. :D
Ну, во-первых, функции OnPaint нет (она не является ф-цией стандартных библиотек или API, она не является методом-членом класса CDialog, CWindow и т.п.), во всяком случае пока её не объявят (как обработкик WM_PAINT).
Во-вторых, это неправильный и неэстетичный подход. Это почти то-же самое, что вещать сокрытие окна на таймер. Расходуется память под лишнюю переменную, лишний раз отправляется и обрабатывается сообщение WM_SHOWWINDOW при каждой попытке прорисовки окна. Это похоже на постоянную отправку самому себе посылки, чтоб не занимать пересылаемыми вещами места в шкафу. :D
Если я правильно понял - программа будет работать с SysTray! => окно быдет перерисовываться не один раз!
и WM_SHOWWINDOW получать столько же!
А переменная bool занимает 1 byte!
Плюс окно не мигает при загрузке.
Если я правильно понял - программа будет работать с SysTray! => окно быдет перерисовываться не один раз!
и WM_SHOWWINDOW получать столько же!
А переменная bool занимает 1 byte!
Плюс окно не мигает при загрузке.
Я так и не понял, для чего нужен такой диалог, почему именно диалог?
Тип bool, действительно, предполагаетодин байт, вот только с учетом выравнивания это уже 4 байта.
Будет или не будет мигать этозависит от того, где вставить ShowWindow(SW_HIDE)в обработчике WM_PAINT.
Только я не понимаю, зачем использовать такие извраты, чем не подходит концептуально правильный подход с DoModal() ?
Я так и не понял, для чего нужен такой диалог, почему именно диалог?
Тип bool, действительно, предполагаетодин байт, вот только с учетом выравнивания это уже 4 байта.
Будет или не будет мигать этозависит от того, где вставить ShowWindow(SW_HIDE)в обработчике WM_PAINT.
Только я не понимаю, зачем использовать такие извраты, чем не подходит концептуально правильный подход с DoModal() ?
Я не понимаю зачем его вообще создавать?
Чтобы потом спрятать?Смысл?
Я такие приложения делал так:
создавал невидимое окно (размеры 0 на 0, не вызывал ShowWindow), оно при WM_CERATE создавало TrayIcon, занималось обработкой сообщений от иконки, от меню (создавало необходимые диалоги и пр.), и при WM_DESTROY удаляло иконку из трея.
вот и вся фишка. Удачи!
Приложение - на основе диалога. Требуется, чтобы при старте приложения его окно исчезало с экрана и пряталось в SysTray. Сделать значок в SysTray можно из OnInitDialog(). А вот убрать окно с экрана никак не получается. Я для этого использую this->ShowWindow(SW_HIDE), но в OnInitDialog() функция еще не работает, а в других местах - уже поздно. Подскажите, please!
Проблема не в том чтобы прятать, а в том чтобы не показать, и решать ее надо соответственно.
Не в *Dlg а в классе *App. Убираешь DoModal и получаешь результат. Но зачем тебе MFC если у тебя не будет окна а только трей. Под API это надо делать.
Проблема не в том чтобы прятать, а в том чтобы не показать, и решать ее надо соответственно.
Не в *Dlg а в классе *App. Убираешь DoModal и получаешь результат. Но зачем тебе MFC если у тебя не будет окна а только трей. Под API это надо делать.
Ну такой ответ, вообще, никуда не годиться...
Что значит убрать DoModal()? Ты б хотя бы тогда обавил, что в этом случае надо организовать цикл обработки сообщений...
Что значит "под API надо делать"? Прям, волшебное слово "API". MFC - это враппер API, а не что-то инородное... Так что ты подразумевал?
Ну такой ответ, вообще, никуда не годиться...
Что значит убрать DoModal()? Ты б хотя бы тогда обавил, что в этом случае надо организовать цикл обработки сообщений...
Что значит "под API надо делать"? Прям, волшебное слово "API". MFC - это враппер API, а не что-то инородное... Так что ты подразумевал?
На счет DoModal() - когда ты создаешь проект при помощи визарда (в данном случае я так понял что диалог), создаются два (AboutDlg я не считаю) класса ProectDlg и ProectApp (Proect - условно). Во ProectApp в одном из его методов (вот только названиие забыл а компилятора под рукой нет но их там всего два) создается объект класса ProectDlg:
ProectDlg dlg;
if(dlg.DoModal == IDOK)
... // и так далее
удаляешь эти строки, создаешь свой класс который имеет цикл обработки сообщений но не выводит ничего на экран (отнаследуй от какого-нибудь подходящего класса в MFC, но лучше конечно написать свой класс для твоих целей).
А насчет API ты конечно прав MFC - это надстройка и конечно она не чем не мешает написать подобную программу, но:
- в MFC проект намного больше;
- в API проекте все на виду и тебе не надо искать обходные пути чтобы даже работать с циклом обработки сообщений.
А так как у тебя не будет окна программы то и приемущества от MFC резко сокращаются.
Меня бы это убедило.
Где-нибудь потом, по приходящему событию оно у меня появлялось. Это если ты будешь писать в WinApi. :cool: