Невидимое окно
CApplDlg dlg;
m_pMainWnd = &dlg;
m_pMainWnd->ShowWindow(SW_HIDE);
dlg.DoModal();
выдаёт ошибку Assertion Failed в строке m_pMainWnd->ShowWindow(SW_HIDE);.
И ещё до кучи: перед думодалом пытаюсь запихнуть иконку в трей:
nf.uID = NULL;
nf.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nf.uCallbackMessage = WM_ICON;
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nf.hIcon = hIcon;
Shell_NotifyIcon(NIM_ADD, &nf);
иконка появляется, появляется окно, но при наведении мышки на появившуюся иконку она исчезает.
В чём тут дело?
nf.hWnd это то окно которому будет посылатся сообщение указанное в nf.uCallbackMessage, там у тя скорее всего хлам какойто (в nf.hWnd)
Думаю поэтому она исчезает, она же мытается в это время послать сообщение.
может еще nf.cbSize = sizeof(NOTIFYICONDATA);
ну да, в nf.m_hWnd ерунда какая-нибудь, но ведь пока окно не создастся что туда запихнуть? окна-то по сути нет, получается пока не создашь какое-нибудь окно иконку в трей по-нормальному не установить?
Перемести Sell_NotifyIcon() и ShowWindow() в код инициализации диалога. Зачок в трей установить можно и без создания окна, если опустить флаг NIF_MESSAGE.
Спасибо. С невидимостью разобрался, правда при помещении ShowWindow в OnInitDialog окно появляется, OnPaint похоже его всё равно потом перерисовывает, а если в OnPaint ShowWindow поставить, то всё путём. А с иконкой удаление флага не помогает, она появляется, но потом всё равно исчезает..
В коде инициализации диалога ShowWindow нужно вставлять после вызова соответствующего метода родительского класса: CDialog::OnInitDialog(). Если окно невидимо, то сообщение WM_PAINT окну вообще не посылается. Насчёт Shell_NotifyICon() я, кажется, немного ошибся: всё-таки без создания окна значок в трей засунуть не удастся.
Странно, но что-то не пашет если просто ShowWindow(SW_HIDE) вставить после CDialog::OnInitDialog(), а переменная m_pMainWnd недоступна.
А иконку я в InitDialog вставил, щас хоть она у меня одновременно с окном появляется, раньше после нажатия кнопки.