imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 25.01.2005, 04:18     # 1
GnuS
Junior Member
 
Регистрация: 13.12.2003
Сообщения: 66

GnuS Путь к славе только начался
Не могу спрятать окно :-[

Делаю программку основанную на диалоговом окне (хоть в VС++.Net, хоть в VC++6.0), хочу, чтобы окно появлялось скрытым. Удалял в rc файле свойство WS_VISIBLE, запускал в OnInitDialog() ShowWindow(SW_HIDE), много чего еще перепробовал, ничего не помогает, оно появляется хоть ты тресни. Своими силами не справился, подскажите, что все-таки надо сделать.
GnuS вне форума  
Старый 25.01.2005, 22:12     # 2
Scary Zet
Junior Member
 
Аватар для Scary Zet
 
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115

Scary Zet Нимб уже пробиваетсяScary Zet Нимб уже пробивается
Lightbulb

Дело в том, что независимо от того, что ты делаешь в WM_INITDIALOG, ОС после завершения обработчика этого сообщения всё равно сделает ShowWindow(hdlg, SW_SHOW);

Тебе надо отвечать на сообщение WM_WINDOWPOSCHANGING, в обработчике сообщений. lParam хранит указатель на структуру WINDOWPOS, в которой есть поле flags. Изменяя flags, можно влиять на то, как окно будет отображено.

Схема такая. Заведи некоторого рода глобальную переменную (например, bool visible = false), которая будет хранить булевское значение, видно ли окно или нет. Изначально окно не видно.

В ответе на сообщение WM_WINDOWPOSCHANGING пишешь:
WINDOWPOS *wp = (WINDOWPOS *)lParam;
if(!visible)
wp->flags &= ~SWP_SHOWWINDOW;

Если надо отобразить окно, в неком месте проги всталяешь следующее:
visible = true;
ShowWindow(hdlg, SW_SHOW);

Думаю, смысл вышенаписанного примерно понятен.

С уважением.
__________________

Каждая мечта тебе дается вместе с силами, необходимыми для ее осуществления. Однако тебе, возможно, придется ради этого потрудиться.

Ричард Бах

Последний раз редактировалось ZETTOX; 25.01.2005 в 22:15.
Scary Zet вне форума  
Старый 26.01.2005, 02:55     # 3
GnuS
Junior Member
 
Регистрация: 13.12.2003
Сообщения: 66

GnuS Путь к славе только начался
ZETTOX спасибо за подсказку. Но, неужели нет более простого способа без всяких введений новых переменных? Для того чтобы окно просто не отображалось при запуске это для меня слишком дорого :-)

Конечно можно сделать так:
Код:
void CKBDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
	CDialog::OnWindowPosChanging(lpwndpos);

	static int i=0;
	if(i<5)if(i++<5)
		lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
(методом научного тыка установил, что до появления окна эта процедура выполняется 4 раз)

Может есть какие-нибудь способы попроще? или хотя бы покомпактнее.

Последний раз редактировалось GnuS; 26.01.2005 в 04:17.
GnuS вне форума  
Старый 26.01.2005, 15:08     # 4
Scary Zet
Junior Member
 
Аватар для Scary Zet
 
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115

Scary Zet Нимб уже пробиваетсяScary Zet Нимб уже пробивается
Не знаю, видимо, другого способа нет. Этот способ описывался на codeproject.com, там обычно только дельные статьи. Да и куда уж компактнее. Если не хочешь глобальную переменную - занеси данные в USERDATA окна, через SetWindowLong().

ЗЫ. CDialog::OnWindowPosChanging(lpwndpos); надо делать в конце CKBDlg::OnWindowPosChanging().
__________________

Каждая мечта тебе дается вместе с силами, необходимыми для ее осуществления. Однако тебе, возможно, придется ради этого потрудиться.

Ричард Бах
Scary Zet вне форума  
Старый 27.01.2005, 02:52     # 5
GnuS
Junior Member
 
Регистрация: 13.12.2003
Сообщения: 66

GnuS Путь к славе только начался
С помощью USERDATA это то что надо.
GnuS вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 11:57.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.