| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 13.12.2003
Сообщения: 66
![]() |
Не могу спрятать окно :-[
Делаю программку основанную на диалоговом окне (хоть в VС++.Net, хоть в VC++6.0), хочу, чтобы окно появлялось скрытым. Удалял в rc файле свойство WS_VISIBLE, запускал в OnInitDialog() ShowWindow(SW_HIDE), много чего еще перепробовал, ничего не помогает, оно появляется хоть ты тресни. Своими силами не справился, подскажите, что все-таки надо сделать.
|
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115
![]() ![]() |
Дело в том, что независимо от того, что ты делаешь в 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. |
|
|
|
|
# 3 |
|
Junior Member
Регистрация: 13.12.2003
Сообщения: 66
![]() |
ZETTOX спасибо за подсказку. Но, неужели нет более простого способа без всяких введений новых переменных? Для того чтобы окно просто не отображалось при запуске это для меня слишком дорого :-)
Конечно можно сделать так: Код:
void CKBDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
static int i=0;
if(i<5)if(i++<5)
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
Может есть какие-нибудь способы попроще? или хотя бы покомпактнее. Последний раз редактировалось GnuS; 26.01.2005 в 04:17. |
|
|
|
|
# 4 |
|
Junior Member
Регистрация: 08.07.2004
Адрес: Воронеж
Сообщения: 115
![]() ![]() |
Не знаю, видимо, другого способа нет. Этот способ описывался на codeproject.com, там обычно только дельные статьи. Да и куда уж компактнее. Если не хочешь глобальную переменную - занеси данные в USERDATA окна, через SetWindowLong().
ЗЫ. CDialog::OnWindowPosChanging(lpwndpos); надо делать в конце CKBDlg::OnWindowPosChanging().
__________________
Каждая мечта тебе дается вместе с силами, необходимыми для ее осуществления. Однако тебе, возможно, придется ради этого потрудиться. Ричард Бах |
|
|