IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Не могу спрятать окно :-[ (https://www.imho.ws/showthread.php?t=78380)

GnuS 25.01.2005 04:18

Не могу спрятать окно :-[
 
Делаю программку основанную на диалоговом окне (хоть в VС++.Net, хоть в VC++6.0), хочу, чтобы окно появлялось скрытым. Удалял в rc файле свойство WS_VISIBLE, запускал в OnInitDialog() ShowWindow(SW_HIDE), много чего еще перепробовал, ничего не помогает, оно появляется хоть ты тресни. Своими силами не справился, подскажите, что все-таки надо сделать.

Scary Zet 25.01.2005 22:12

Дело в том, что независимо от того, что ты делаешь в 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);

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

С уважением.

GnuS 26.01.2005 02:55

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

Конечно можно сделать так:
Код:

void CKBDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
        CDialog::OnWindowPosChanging(lpwndpos);

        static int i=0;
        if(i<5)if(i++<5)
                lpwndpos->flags &= ~SWP_SHOWWINDOW;
}

(методом научного тыка установил, что до появления окна эта процедура выполняется 4 раз)

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

Scary Zet 26.01.2005 15:08

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

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

GnuS 27.01.2005 02:52

С помощью USERDATA это то что надо.


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

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