Здравствуйте, Alex Fedotov, Вы писали:
O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.
AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.
Точно? А как тогда работают различные утилиты для управления десктопами? Пункт "отправить окно в десктоп XXX" там никто не отменял...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Alex Fedotov, Вы писали:
O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.
AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.
А как это эмулируют проги-мультидесктопы ? Я сам десктопы не ковырял просто.
Лучше так:
1. создаешь compatible dc, инициализируешь — смотри код, как писали выше.
2. А теперь внимание:
SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0);
SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0);
и содержимое окна рисуется в наш DC (без наложения других окон).
3. забираешь bitmap у нашего DC.
P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
В MSDN написано
For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.
Но как я помню, само окно не обязано рассматривать wparam как контекст устройства и тем более туда писать. Оно получает свой контекст из BeginPaint. Тем не менее попробую — интересно, вдруг и правда работает.
WinZip скрыт за окном вижал студии. Без сообщений копируется кусок картинки экрана "над" винзипом
С сообщениями делается ровно то же. Any suggestions?
SG>Лучше так: SG>1. создаешь compatible dc, инициализируешь — смотри код, как писали выше. SG>2. А теперь внимание: SG>SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0); SG>SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0); SG>и содержимое окна рисуется в наш DC (без наложения других окон). SG>3. забираешь bitmap у нашего DC.
SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
Здравствуйте, Andrew S, Вы писали:
AS>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
Скорее всего, это результат использования CreateCompatibleBitmap.
Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Еще раз. При использовании BitBlt все работает. Сохраняется часть экрана над WinZip.
Вы код то посмотрите — я его привел... Для разнообразия :/
AS>>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
К>Скорее всего, это результат использования CreateCompatibleBitmap. К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Чушь. В файл сохраняется битмапа с цветностью экрана... Вобщем, видимо, не стоит думать, что мы тут умнее Фень Юаня. Было бы можно проще — он бы так и сделал. К>Сделай для разнообразия CreateBitmap с TrueColor.
К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Читать постинги надо и пользоваться MSDN Когда не читают — это действительно классические грабли :/
Because memory device contexts allow both color and monochrome bitmaps, the format of the bitmap returned by the CreateCompatibleBitmap function differs when the specified device context is a memory device context. However, a compatible bitmap that was created for a nonmemory device context always possesses the same color format and uses the same color palette as the specified device context.
Аноним, представься А еще желательно видеть конкретные ссылки на топики MSDN где ЭТО подробно описано. Точнее не само это, как это ПРАВИЛЬНО сделать, а не то, что предлагает m$ Tom>>сабж
1. Создаём компатибле HDC на память.
2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап.
3. Делаем BitBlt из HDC формы в наш, который на памяти.
4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.
Здравствуйте, Tom, Вы писали:
Tom>1. Создаём компатибле HDC на память. Tom>2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап. Tom>3. Делаем BitBlt из HDC формы в наш, который на памяти. Tom>4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.
Tom>PS: Проверял правда только на NT
И еще добавь: для окна, ничем сверху не перекрытого.
См. остальные сообщения этой ветки. Тут уже много сказано.
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:
OP>Можно сделать так. OP>Находим главное окно аппликации. OP>Заставляем его всплыть. На сайте про это много постов. OP>Далее грабим. И все.
Встречный вопрос: а если требуется "грабануть" не главное окно аппликации, а дочернее окно / контрол ? (Их то не заставишь вспыть!)
Можно конечно заставить всплыть родительское окно для требуемого дочернего...
Кроме того — проблема с перекрыванием нашего окна каким-либо TopLevel окном остаётся.
И даже если проверять, сохранять, изменять, и восстанавливать аттрибут TopLevel у нашего окна (что не есть красивое решение, имхо), всё равно остаётся проблема в случае с частично видимым (или полностью невидимым) окном — не думаю, что двигать /(показывать и прятать) искомое окно — это выход.
Так что не проходит.
OP>Вместо всплывания можно создать десктоп еще один и засунуть окно туда. А потом десктоп грохнуть. OP>В MSDN есть примерчик с десктопами.
Pls obysnite 4ego en prawelno delay pri otkritom oktne wse normalno beretza nujnii pixel a wot kogda sakrito okno todrugim ili swernuto ne pomogart hoty wrode kak WM_PAINT posilay moemu oknu , wesi topik pro4ital no ne kak ne ponyl w 4em sagwoska