Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters
Register

Reply
 
LinkBack Thread Tools
Old 08.08.2003, 13:47   #16
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

нет - скопировалось полностью
уже не нужно else так как переменная меняется в потоке и там же показывается диалог. Соответственно больше else не нужен!
Reply With Quote
Old 08.08.2003, 13:51   #17
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

мне тоже не особо по душе этот вариант, но первая идея
Да... и еще, там закрывающая } не скопировалась
Reply With Quote
Old 08.08.2003, 13:55   #18
nightmare
 
spawn's Avatar
 
Join Date: 05 2003
Location: Russia, Moscow
Age: 39
Posts: 279
Downloads: 0
Uploads: 0
Reputation: 20 | 3
Default

по моему лучше посмотреть в Help ... ))

там кстати говоря (хотя и не навижу MS MSDN) но на этот раз неплохо все описано ))
Reply With Quote
Old 08.08.2003, 14:03   #19
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

verjy Пусть Арам сам думает. Мы ему дали направление!


p.s. Вот, а мне MSDN нравится
Reply With Quote
Old 08.08.2003, 14:25   #20
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

ох уж этот мсдн! вот я вот наивно предполагал, что будет достаточно в OnInitDialog вызвать ShowWindow(SW_HIDE) и/или ModifyStyle(WS_VISIBLE, 0) - фигушки! потом пришло в голову в ресурсах диалога установить невидимость - тот же эффект. и главное, об этом ничего не сказано в столь дорогом нашим сердцам мсдн! (кстати, вариант с ShowWindow работает после того, как диалог впервые показался на экране.) и вот теперь приходится делать через такими кривыми способами

еще помнится баг есть с одним из стилей, кажется при установке slient edge или еще какого-то бордера на editbox - стиль надо устанавливать при создании, а через ModifyStyle[Ex] работать не будет. и об этом ни слова в документации.
Reply With Quote
Old 08.08.2003, 23:27   #21
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Все варианты 100% рабочие.
Просто надо правильно писать код

1. Window Extended Style WS_EX_TRANSPARENT по настоящему не делает окно прозрачным. Просто он копирует задний фон на DC окна, и стоит перемещать окно и естественно рисунок переместится вместе с ним, или после любого перемещения надо будет делать update всего окна. (Никогда не делайте invalidate такого окна, это все испортит, так как заднего фона уже нету).
минусы - грузит процессор.

2. Для прозрачности необязательно иметь .NET. Надо просто ставить extended style на WS_EX_LAYERED и вызвать функцию SetLayeredWindowAttributes. Минусы
- Работает только >= W2k.
- сильно грузит процессор.
Плюсы
- Можно получать полупрозрачные окна с 256 градациями прозрачности.
(Прозрачность относиться всем контролам, для которых Parent - это окно).

3. ShowWindow(SW_HIDE).
В WM_PAINT можно проверять, и ShowWindow(SW_HIDE) вызвать толко в том случае, если окно видно.
Минусы
- Как вы уже догадались, это можно делать только в отдельном thread- е или по timer-у. И еще, чтоб это работало, надо чтоб окно было видимым хотя бу один раз, то есть - неизбежное мерцание.

4. А зачем мучаться?????
Поставьте координаты на X=-10000, Y=-10000, а потом только показывайте modal, и все!
И никакого мерцания не будет!


Last edited by armeng; 09.08.2003 at 00:04.
Reply With Quote
Old 09.08.2003, 06:32   #22
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

да, прозрачность не подходит - видны заголовок и поля (последние становятся видимыми при попадании на них фокуса). кроме того, прозрачность и установка в позицию вне экрана оставляют окно на панели задач, а ShowWindow(SW_HIDE) этим недостатком не обладает.

Quote:
Originally posted by armeng
В WM_PAINT можно проверять, и ShowWindow(SW_HIDE) вызвать толко в том случае, если окно видно.
Минусы
- Как вы уже догадались, это можно делать только в отдельном thread- е или по timer-у.
почему?

spawn > насчет зависания приложения: оно наверное зависает, когда диалог модален относительно другого окна? в моем случае он является главным окном приложения, так что думаю это зависание мне не грозит

Quote:
И еще, чтоб это работало, надо чтоб окно было видимым хотя бу один раз, то есть - неизбежное мерцание.
интересно все-таки, почему не работает из OnInitDialog? я специально последовательно сделал SW_SHOW и SW_HIDE - все равно показывает!
Reply With Quote
Old 09.08.2003, 07:52   #23
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
насчет зависания приложения: оно наверное зависает, когда диалог модален относительно другого окна?
Вот именно, поэтому и нужен отдельный thread или timer или вызвать ShowWindow() при WM_ACTIVATE, но в этом случае окно будет уже видимым.

Quote:
в моем случае он является главным окном приложения
Я не понял, модальное главное окно???
И оно будет модальным относительно какого окна??? Desktop-а?
Таких чудес не бывает. System wide modal dialog-и существовали только в win3x.

Как я понял, ты хочешь делать невидимое приложение.
Для этого создаешь главное окно с координатами вне экрана, потом вызываешь ShowWindow() (чтоб убрать иконку на taskbar-e), в этом случае мерцания не будет. Кстати иконку на taskbar-e можно убрать и другими способами.
Но почему не запускать приложение как Сервис???
Или можно запускать совсем в другом WindowStation-е с другим desktop-ом.
Кстати Сервисы так и запускаются.
Reply With Quote
Old 09.08.2003, 09:25   #24
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

Quote:
Originally posted by armeng
Я не понял, модальное главное окно???
И оно будет модальным относительно какого окна??? Desktop-а?
Таких чудес не бывает.
бывает это то, что генерирует AppWizard в App::InitInstance при выборе dialog-based application

Quote:
Или можно запускать совсем в другом WindowStation-е с другим desktop-ом.
Кстати Сервисы так и запускаются.
приложение не совсем невидимое - оно ставит иконку в трей, поэтому должно запуститься на этом десктопе у иконки конечно должно быть окно, которое обработает сообщения от нее, но поскольку мне нужно было еще окно настроек, я решил именно его и сделать главным окном приложения, и не создавать лишнего окна (вот и выяснилось, какого вида приложение я делаю )
Reply With Quote
Old 09.08.2003, 10:15   #25
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

да...
Reply With Quote
Old 09.08.2003, 10:25   #26
Moderator
 
Join Date: 09 2002
Location: Armenia
Age: 41
Posts: 1,172
Downloads: 0
Uploads: 0
Reputation: 50 | 3
Default

(from W_z_rd)
Pardon, rebyata, s MFC ya v posldniy raz rabotal 3 goda nazad, mozhet chego-to zabil. Pochemu ShowWindow(SW_HIDE) nuzhno delat` na OnPaint(), a ne OnCreate(), kak obichno ?
Reply With Quote
Old 09.08.2003, 10:34   #27
Грустно...
 
Agregat's Avatar
 
Join Date: 08 2002
Location: Там, где всегда идут дожди
Age: 35
Posts: 21,717
Downloads: 2
Uploads: 0
Reputation: 250 | 7
Default

потому что это не работает...
Reply With Quote
Old 10.08.2003, 16:33   #28
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
бывает это то, что генерирует AppWizard в App::InitInstance при выборе dialog-based application
Да, там стоит dlg.DoModal().
И что, главное окно становиться модальным?
Если да, то относительно чего?

p.s. Для главного окна сколько хочешь вызывай DoModal(), всеравно оно модальным не станет, так как не существует то окно, относительно которого диалог должен быть модальным. См. definition DoModal():
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
т. е. если hWndParent == 0 (Это десктоп), никакого модала не жди.

Last edited by armeng; 10.08.2003 at 19:35.
Reply With Quote
Old 10.08.2003, 16:37   #29
Дошкольник
 
Join Date: 03 2003
Location: 2A
Age: 49
Posts: 104
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Quote:
вот и выяснилось, какого вида приложение я делаю
Вот и делай cервис.
Поставь interact with desktop и будет у тебя и иконка в трее, и окно настроек
Reply With Quote
Old 11.08.2003, 05:59   #30
The Reloaded
 
Aram Hambardzumyan's Avatar
 
Join Date: 01 2002
Location: behind the flesh and gelatinе of soft dull eyes
Posts: 3,387
Downloads: 4
Uploads: 0
Reputation: 146 | 4
Default

что ж, будем копать...
если есть еще идеи, пишите...
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 15:46.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.