Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В каком месте кода надо прятать окно приложения при старте?

321
23 декабря 2002 года
Doomych
124 / / 20.01.2000
Приложение - на основе диалога. Требуется, чтобы при старте приложения его окно исчезало с экрана и пряталось в SysTray. Сделать значок в SysTray можно из OnInitDialog(). А вот убрать окно с экрана никак не получается. Я для этого использую this->ShowWindow(SW_HIDE), но в OnInitDialog() функция еще не работает, а в других местах - уже поздно. Подскажите, please!
409
24 декабря 2002 года
Ramzes
163 / / 20.09.2000
Цитата:
Originally posted by Doomych
Приложение - на основе диалога. Требуется, чтобы при старте приложения его окно исчезало с экрана и пряталось в 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.

321
24 декабря 2002 года
Doomych
124 / / 20.01.2000
Да нет, не получится: проблема не в функции, а в том, где ее вызвать. В OnInitDialog функция ShowWindow, что API-шная, что MFC-шная бесполезна: окна-то еще нет...

С уважением, Дмитрий
409
24 декабря 2002 года
Ramzes
163 / / 20.09.2000
Цитата:
Originally posted by Doomych
Да нет, не получится: проблема не в функции, а в том, где ее вызвать. В 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);
}

3
24 декабря 2002 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
Да нет, не получится: проблема не в функции, а в том, где ее вызвать. В OnInitDialog функция ShowWindow, что API-шная, что MFC-шная бесполезна: окна-то еще нет...

С уважением, Дмитрий



А зачем показывать окно, чтоб потом прятать?

321
24 декабря 2002 года
Doomych
124 / / 20.01.2000
Цитата:
Originally posted by Green

А зачем показывать окно, чтоб потом прятать?



Ну, может, я не совсем точно выразился: мне надо, чтобы окно с самого начала было бы спрятанным.

577
24 декабря 2002 года
Mozhay
81 / / 20.09.2000
Цитата:
Originally posted by Doomych


Ну, может, я не совсем точно выразился: мне надо, чтобы окно с самого начала было бы спрятанным.



Сам же себе и ответил :)
Сними галочку Visible в свойствах своего диалога.

321
26 декабря 2002 года
Doomych
124 / / 20.01.2000
Помогло следующее:
ShowWindow(m_hWnd, SW_HIDE | SW_MINIMIZE);

Но возник следующий вопрос: при этом приложение убирается в Таскбар. А как убрать его еще и из Таскбара?

Цитата:

Сними галочку Visible в свойствах своего диалога.



Не помогает. Никакой реакции.

409
26 декабря 2002 года
Ramzes
163 / / 20.09.2000
ShowWindow(m_hWnd, SW_HIDE);//!!!

Зачем ты или поставил?
321
27 декабря 2002 года
Doomych
124 / / 20.01.2000
Цитата:
Зачем ты или поставил?


Так работает. По крайней мере, приложение стало сворачиваться. Понимаю, что ShowWindow(m_hWnd, SW_HIDE); должно быть достаточно, и у меня это работает в других местах кода (например, если подвязать к какой-нибудь кнопке), но в OnInitDialog() - хоть тресни!

409
27 декабря 2002 года
Ramzes
163 / / 20.09.2000
Цитата:
Originally posted by Doomych

Так работает. По крайней мере, приложение стало сворачиваться. Понимаю, что ShowWindow(m_hWnd, SW_HIDE); должно быть достаточно, и у меня это работает в других местах кода (например, если подвязать к какой-нибудь кнопке), но в OnInitDialog() - хоть тресни!



Ты как диалог вызываешь?

2.1K
27 декабря 2002 года
VitSoft
18 / / 15.11.2002
Ну а как Вы хотите спрятать, то что еще не создалось ???
OnInitDialog() инициализирует, и вы не можете там еще прятать окно, так как оно не прошло все стадии редрава и т.д.

Есть один плоский вариант, как уже говорилось убрать галочку видимости диалога, а потом по таймеру через 1-3 секунды сделать ему

ShowWindow(m_hWnd, SW_HIDE);

Удачи VitSoft
http://www.dev.vitgroup.com
321
27 декабря 2002 года
Doomych
124 / / 20.01.2000
Цитата:
Originally posted by VitSoft
Ну а как Вы хотите спрятать, то что еще не создалось ???



Так и я про то же.

Попробую через галочку с таймером. Спасибо!

3
27 декабря 2002 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych


Так и я про то же.

Попробую через галочку с таймером. Спасибо!



Ага... Вы еще девочку-секретаршу наймите, чтоб она пальчиками окно прятала при его создании :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. Компилим и ...вуаля... полный изврат - невидимый диалог.

А теперь ответте: на кой он нужен?

321
27 декабря 2002 года
Doomych
124 / / 20.01.2000
Понимаю, что изврат. Сердце кровью обливается. Но Как по-нормальному-то сделать?
2.1K
02 января 2003 года
sHeVa
11 / / 27.11.2002
Цитата:
Originally posted by Doomych
Понимаю, что изврат. Сердце кровью обливается. Но Как по-нормальному-то сделать?


Функция существует такая OnPaint()!!!
там в конце и пишишь ShowWindow(SW_HIDE);
И никакого гемороя!

3
02 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sHeVa

Функция существует такая OnPaint()!!!
там в конце и пишишь ShowWindow(SW_HIDE);
И никакого гемороя!



Надеюсь, ты это несерьезно?! :D
Это ведь не первое апреля, а первое января... :D

А вот метод с DoModal() - это не шутка, это действительно работает.

2.1K
03 января 2003 года
sHeVa
11 / / 27.11.2002
Цитата:
Originally posted by Green


Надеюсь, ты это несерьезно?! :D
Это ведь не первое апреля, а первое января... :D

А вот метод с DoModal() - это не шутка, это действительно работает.


А в чем проблема?
А какой диалог спрятать нужно? Главное окно?
в классе объявляешь переменную bool show_window = false;(например).
Когда окно надо показать show_window = true;
когда спрятать show_window = false;
а в OnPaint()
if(!show_window)
ShowWindow(SW_HIDE);
else ShowWindow(SW_SHOW);

Вот исходники - диалог исезает на десять секунд после нажатия на кнопку!

3
04 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sHeVa

А в чем проблема?
А какой диалог спрятать нужно? Главное окно?
в классе объявляешь переменную 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

321
05 января 2003 года
Doomych
124 / / 20.01.2000
Как временный выход из положения, я все-таки сворачиваю окно по таймеру (в принципе, хватает 0.001 сек.), но таймер срабатывает только 1 раз, после чего убивается. В результате после старта приложения окно мигает и сворачивается.
2.1K
05 января 2003 года
sHeVa
11 / / 27.11.2002
Цитата:
Originally posted by Green


Ну, во-первых, функции OnPaint нет (она не является ф-цией стандартных библиотек или API, она не является методом-членом класса CDialog, CWindow и т.п.), во всяком случае пока её не объявят (как обработкик WM_PAINT).

Во-вторых, это неправильный и неэстетичный подход. Это почти то-же самое, что вещать сокрытие окна на таймер. Расходуется память под лишнюю переменную, лишний раз отправляется и обрабатывается сообщение WM_SHOWWINDOW при каждой попытке прорисовки окна. Это похоже на постоянную отправку самому себе посылки, чтоб не занимать пересылаемыми вещами места в шкафу. :D



Если я правильно понял - программа будет работать с SysTray! => окно быдет перерисовываться не один раз!
и WM_SHOWWINDOW получать столько же!
А переменная bool занимает 1 byte!
Плюс окно не мигает при загрузке.

3
06 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by sHeVa


Если я правильно понял - программа будет работать с SysTray! => окно быдет перерисовываться не один раз!
и WM_SHOWWINDOW получать столько же!
А переменная bool занимает 1 byte!
Плюс окно не мигает при загрузке.



Я так и не понял, для чего нужен такой диалог, почему именно диалог?
Тип bool, действительно, предполагаетодин байт, вот только с учетом выравнивания это уже 4 байта.
Будет или не будет мигать этозависит от того, где вставить ShowWindow(SW_HIDE)в обработчике WM_PAINT.
Только я не понимаю, зачем использовать такие извраты, чем не подходит концептуально правильный подход с DoModal() ?

2.1K
07 января 2003 года
sHeVa
11 / / 27.11.2002
Цитата:
Originally posted by Green


Я так и не понял, для чего нужен такой диалог, почему именно диалог?
Тип bool, действительно, предполагаетодин байт, вот только с учетом выравнивания это уже 4 байта.
Будет или не будет мигать этозависит от того, где вставить ShowWindow(SW_HIDE)в обработчике WM_PAINT.
Только я не понимаю, зачем использовать такие извраты, чем не подходит концептуально правильный подход с DoModal() ?


Я не понимаю зачем его вообще создавать?
Чтобы потом спрятать?Смысл?

380
08 января 2003 года
Arestov
285 / / 20.09.2000
Как я понимаю тебе надо создать прогу которая "сидит в часах" при страте, а при каких-то действиях в контекстном меню, выводить диалог?

Я такие приложения делал так:
создавал невидимое окно (размеры 0 на 0, не вызывал ShowWindow), оно при WM_CERATE создавало TrayIcon, занималось обработкой сообщений от иконки, от меню (создавало необходимые диалоги и пр.), и при WM_DESTROY удаляло иконку из трея.

вот и вся фишка. Удачи!
2.5K
08 января 2003 года
Alex(GIE)
10 / / 08.01.2003
Цитата:
Originally posted by Doomych
Приложение - на основе диалога. Требуется, чтобы при старте приложения его окно исчезало с экрана и пряталось в SysTray. Сделать значок в SysTray можно из OnInitDialog(). А вот убрать окно с экрана никак не получается. Я для этого использую this->ShowWindow(SW_HIDE), но в OnInitDialog() функция еще не работает, а в других местах - уже поздно. Подскажите, please!



Проблема не в том чтобы прятать, а в том чтобы не показать, и решать ее надо соответственно.
Не в *Dlg а в классе *App. Убираешь DoModal и получаешь результат. Но зачем тебе MFC если у тебя не будет окна а только трей. Под API это надо делать.

3
08 января 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Alex(GIE)


Проблема не в том чтобы прятать, а в том чтобы не показать, и решать ее надо соответственно.
Не в *Dlg а в классе *App. Убираешь DoModal и получаешь результат. Но зачем тебе MFC если у тебя не будет окна а только трей. Под API это надо делать.



Ну такой ответ, вообще, никуда не годиться...
Что значит убрать DoModal()? Ты б хотя бы тогда обавил, что в этом случае надо организовать цикл обработки сообщений...
Что значит "под API надо делать"? Прям, волшебное слово "API". MFC - это враппер API, а не что-то инородное... Так что ты подразумевал?

2.5K
09 января 2003 года
Alex(GIE)
10 / / 08.01.2003
Цитата:
Originally posted by Green


Ну такой ответ, вообще, никуда не годиться...
Что значит убрать DoModal()? Ты б хотя бы тогда обавил, что в этом случае надо организовать цикл обработки сообщений...
Что значит "под API надо делать"? Прям, волшебное слово "API". MFC - это враппер API, а не что-то инородное... Так что ты подразумевал?



На счет DoModal() - когда ты создаешь проект при помощи визарда (в данном случае я так понял что диалог), создаются два (AboutDlg я не считаю) класса ProectDlg и ProectApp (Proect - условно). Во ProectApp в одном из его методов (вот только названиие забыл а компилятора под рукой нет но их там всего два) создается объект класса ProectDlg:
ProectDlg dlg;
if(dlg.DoModal == IDOK)
... // и так далее
удаляешь эти строки, создаешь свой класс который имеет цикл обработки сообщений но не выводит ничего на экран (отнаследуй от какого-нибудь подходящего класса в MFC, но лучше конечно написать свой класс для твоих целей).
А насчет API ты конечно прав MFC - это надстройка и конечно она не чем не мешает написать подобную программу, но:
- в MFC проект намного больше;
- в API проекте все на виду и тебе не надо искать обходные пути чтобы даже работать с циклом обработки сообщений.
А так как у тебя не будет окна программы то и приемущества от MFC резко сокращаются.
Меня бы это убедило.

473
10 января 2003 года
Azazell
49 / / 20.12.1999
ну если мне когда то и надо было создать невидимое окно, то я просто не вызывал ShowWindow.
Где-нибудь потом, по приходящему событию оно у меня появлялось. Это если ты будешь писать в WinApi. :cool:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог