Вопросец по функции BitBlt

Тема в разделе "WASM.BEGINNERS", создана пользователем Delphi, 11 ноя 2006.

  1. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Здравствуйте.

    Задача такая: Как мне скопировать фон под моим окном?

    Первое, что приходить в голову, это перебрать посредством EnumWindows, все видимые окна и применить для них BitBlt, а потом по частям составить картинку.
    Как вы считаете это оптимально или есть более простое решение?

    Ответы принимаются на Паскаля и Си.:))
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Фон в твоём понимание включает другие окна?
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Delphi
    Скопировать до создания окна. Свернуть окно, и скопировать.
     
  4. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Нет я имел в виду другое.

    Например открыты окна тоталкомандера и еще какие-либо, а сверху моя прога. так вот как моей проге получить ту часть экрана котороя находится под окном моей проги.

    перемещать и скрывать окно нельзя :)
    то есть окно должно казаться дырявым но только без исп регионов
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Скопировать фон под окном и сделать его "дырявым" - разные вещи. Может, прозрачность поможет для второго случая?
     
  6. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    В общем нужно написать скринмейт, только без регионов
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Delphi
    Вариант с перебором окон и копированием через BitBlt Точно работать не будет. Проще всего свернуть окно, как уже советовал Pavia, но часто так делать нельзя - окно будет мигать. Почему нельзя использовать прозрачность и регионы?
     
  8. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Давайте по пунктам разбираться:))
    1. Вот описание BitBlt из хедера
    BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth,
    int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop);

    hdcSrc это хэндл окна которое я хочу скопировать. Теперь такая ситуация открыт тотал и запущена моя прога. В своей проге я использую BitBlt и передаю hdcSrc =GetDC(хэндл_тотала);
    и в итоге на выходе bitblt мы имееи фотку экрана с моей прогой. :)) тогда какой смысл указывать хэндл источника окна для копирования
    То есть хотя и и передел хэндл окна тотала все равно скопировался почти весь экран (без панели задач)

    2. Хочу написать скринмейт. для этого есть 4 способа:
    ПЕРВЫЙ. копирование фона как в мультиках (как раз то о чем я спрашиваю)
    ВТОРОЙ. регионы - это я уже умею
    ТРЕТИЙ. и ЧЕТВЕРТЫЙ сильно сложны...

    Пожалуйста обьясните мне смысл этого параметра hdcSrc, если он в нем есть
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Delphi:
    >Давайте по пунктам разбираться:)) [...]
    >hdcSrc это хэндл окна которое я хочу скопировать.

    1) hdcSrc - это НЕ хэндл окна, если хотите разобраться :)

    2) И Вы уж все-таки определитесь, что хотите скопировать: ФОН или ОКНО :)

    3) Пример решения для частного случая.

    Если Win>=2k и среди видимых окон, прикрытых окном вашей проги, нет WS_EX_LAYERED-окон, то чтобы получить "фон под окном" вашей проги -
    назначаете WS_EX_LAYERED окну проги, + BitBlt с флагом SRCCOPY (но без флага CAPTUREBLT!) ректангла окна проги как части экрана (а не самого окна проги!).

    У меня есть набросок (незаконченный, но вполне рабочий) учебной утилитки как раз на эту тему, сгодится как тренажер:

    http://www.geocities.com/xmemor/2lz/printlayered.zip
     
  10. kropalik

    kropalik New Member

    Публикаций:
    0
    Регистрация:
    27 апр 2005
    Сообщения:
    155
    Адрес:
    msk
    а зачем вообще чтото копировать ?
    в смысле зачем создавать свое окно ?
    Код (Text):
    1. hdc=GetWindowDC(NULL);
    2. // тут рисуем что хотим прямо
    3. // поверх (почти) всех окон
    4. ReleaseDC(NULL,hdc);
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kropalik
    И это нужно перерисовывать несколько раз в секунду, а то может свернуться/развернуться другое окно или просто обновиться десктоп и картинка исчезнет.
     
  12. Delphi

    Delphi New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    26
    Адрес:
    Russia
    Спасибо Kero за дельный совет:)