Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65

Как скопировать изображение из одного DC в другое?

13.12.2016, 15:28. Показов 1286. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой. Создал два CompitableDC:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'Первый контекст
Public mDC As Long 
Public mBMP As Long, iBMP As Long 
Public iBG As StdPicture, hBG As Long
 
mDC = CreateCompatibleDC(Test.hdc)
mBMP = CreateCompatibleBitmap(Test.hdc, 3000, 3000)
iBMP = SelectObject(mDC, mBMP)
 
'Второй контекст
Set iBG = LoadPicture(App.Path + "\bg.jpg") 
hBG = CreateCompatibleDC(Test.hdc)
SelectObject hBG, iBG.Handle
'Копирую
BitBlt mDC, 0, 0, 2000, 2000, hBG, 0, 0, SRCCOPY
BitBlt Test.hdc, 0, 0, 1024, 768, mDC, 0, 0, SRCCOPY
Но код не работает!!! В чем проблема?!
Мне необходимо скопировать рисунок из одного контекста в другой.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.12.2016, 15:28
Ответы с готовыми решениями:

Скопировать вложение из одного Rich поля в другое. как?
Задача такая в документах есть Rich поля "$file" в них хранятся файлы. Мне нужно взять файл из этого поля и скопировать в другой документ...

Как скопировать файл из одного места в другое с последующей заменой
Копирую файл таким образом IO.File.Copy("Path", "Path2") Если файл уже существует, то программа выдает ошибку Как копировать файл с...

Помогите скопировать 1 файл из одного места в другое
Ситуация такая есть ВБ проект который работает с базой аксес мдб. Мне нужно, чтобы после закрытия формы он копировал эту базу с машины на...

15
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
13.12.2016, 18:17
проверяй все этапы копирования через picturebox(тем же bitblt выводи в dc ), по очереди, увидишь где затык.

Добавлено через 22 минуты
Цитата Сообщение от Don Leno Посмотреть сообщение
Set iBG = LoadPicture(App.Path + "\bg.jpg")
hBG = CreateCompatibleDC(Test.hdc)
SelectObject hBG, iBG.Handle
по идее нужный тебе контекст можно получить так GetDc(IBG)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.12.2016, 21:33
Весь код давай, вместе с декларациями, а лучше проект приложи. Непонятно что за Test.hdc.
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 21:47  [ТС]
В том то и дело что тестил. В hBG изображение есть, но в mDC оно не копируется! Не пойму почему?
Трик вот проект как ты просил, надеюсь поможешь.
Вложения
Тип файла: rar Parallax.rar (193.5 Кб, 9 просмотров)
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 21:57  [ТС]
Расскоментировав вот эти две строки в процедуре InitGraph
Visual Basic
1
2
    'bgBMP = CreateCompatibleBitmap(Test.hdc, 3000, 3000)
    'ibgBMP = SelectObject(bgDC, bgBMP)
в своем проекте и все стало работать!!!
Хм...странно вчера весь вечер бился, даже с этими строками ничего не работало(?!)..Что сейчас изменилось? Проект даже перезапускал...
Всем спасибо все работает
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.12.2016, 22:02
А зачем закомментил это:
Visual Basic
1
2
    'bgBMP = CreateCompatibleBitmap(Test.hdc, 3000, 3000)
    'ibgBMP = SelectObject(bgDC, bgBMP)
?
Ты рисуешь на рисунок выбранный в DC, если ты комментируешь эти строки то куду он будет рисовать в этой строке:
Visual Basic
1
BitBlt bgDC, 0, 0, 2000, 2000, hBG, 0, 0, SRCCOPY
?
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 22:24  [ТС]
Трик глюк вот в чем: сейчас подредактировал чтобы проверить как скопирует с другого слоя и снова черный экран и копирование не прошло. Закрыл проект запустил по новой и сразу все заработало?!! В чем проблема?!
Вот сам вставь в цикл эту строку заместо mDc и hBG
Visual Basic
1
    BitBlt dsDC, 500, 500, 15, 11, hDS, 0, 0, SRCCOPY
Добавлено через 7 минут
Мне кажется что то надо выгружать, удалять, очищать. Потому как глянул в диспетчер задач VB6.exe - 250 880 Кб!!! Что то здесь не так.

Добавлено через 5 минут

Не по теме:

Трик, кстати не в курсе почему форум вбстрит не открывается?! Пробовал в мозиле и яндекс браузере не грузит(((

0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.12.2016, 22:27
LoadGraph - идет создание контекстов и выбор пикчеров в них, но не вижу очистку и удаление.

Не по теме:

Цитата Сообщение от Don Leno Посмотреть сообщение
Трик, кстати не в курсе почему форум вбстрит не открывается?! Пробовал в мозиле и яндекс браузере не грузит(((
HDD у хостера накрылся.


----
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 22:42  [ТС]
Хм... и вправду...спасибо)))) Как же я так проглядел))) Пойду программить!! Если что в эту тему снова напишу)))

Добавлено через 5 минут
Не помогло!!! Глюк с копированием остался, а вот в диспетчере терь все в порядке)))

Добавлено через 2 минуты
перезапускал проект - бесполезно(((

Добавлено через 5 минут
Интересно что строки кода, которые заработали прежде

Visual Basic
1
2
BitBlt bgDC, 0, 0, 2000, 2000, hBG, 500, 500, SRCCOPY
BitBlt dsDC, 500, 500, 15, 11, hDS, 0, 0, SRCCOPY
Так и работают без сбоев, но как написал код для нового копирования не хочет и все!!!
Visual Basic
1
2
BitBlt bsDC, 500, 500, 19, 21, hBS, 0, 0, SRCCOPY
BitBlt Test.hdc, 0, 0, 1024, 768, bsDC, 0, 0, SRCCOPY
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.12.2016, 22:43
Скинь проект который не работает
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 22:47  [ТС]
Вот смотри
Вложения
Тип файла: rar Parallax.rar (193.5 Кб, 11 просмотров)
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
13.12.2016, 22:48  [ТС]
Там должна по середине экрана звездочка отрисоваться, но копирования не происходит(((
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
13.12.2016, 22:57
Цитата Сообщение от Don Leno Посмотреть сообщение
Там должна по середине экрана звездочка отрисоваться, но копирования не происходит(((
Рисует. Но ты так и не поправил очистку ресурсов:
Visual Basic
1
2
3
4
5
    SelectObject hBG, iBG.Handle
    SelectObject hDS, iDS.Handle
    SelectObject hBS, iBS.Handle
    SelectObject hPL, iPL.Handle
    SelectObject hSH, iSH.Handle
Ты должен делать что-то типа того:
Visual Basic
1
2
3
oIBG = SelectObject (hBG, iBG.Handle)
oIDS = SelectObject (hDS, iDS.Handle)
...
При удалении:
Visual Basic
1
2
3
4
SelectObject hBG, oIBG
DeleteDc hBg
SelectObject hDS, oIDS 
DeleteDc hDS
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
14.12.2016, 15:20  [ТС]
Сделал очистку как должно быть, но все равно не работает! Ладно завтра снова все просмотрю и отпишусь авось снова заработает))))

Добавлено через 16 часов 9 минут
tThe trick, пришел сегодня с работы, запустил проект и ничего не изменяя стартанул его - в итоге ничего не работало. Но bgDC и dsDc рисует как и вчера. Позже закрыл проект и запустил снова - первый раз все заработало, но после того как я стартанул его вновь (не внося изменений!) он перестал работать. То есть проект срабатывает лишь при первом запуске и то не всегда((( Вообще не пойму что происходит, помоги разобраться!

Добавлено через 5 минут
Поставил цвет формы с черного на стандартный серый, и после пробного перезапуска проекта:
Стартанул первый раз - все работает полет нормальный)))
Остановил и стартанул снова - ФОН формы не черный!!! (Значит не идет отрисовка на dc формы), а серый как я и поставил его стандартно.
Следовательно BitBlt не срабатывает во второй раз, вопросы: почему и как это исправить?!
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
14.12.2016, 16:11
Нужно проверять все возвращаемые значения и анализировать
0
0 / 0 / 0
Регистрация: 23.03.2015
Сообщений: 65
15.12.2016, 15:55  [ТС]
Лан, пойду код копать))) Главное выявили проблемы))) Спасибо трик за помощь)))

Добавлено через 1 час 19 минут
Нашел в чем причина)))
Не создается Компитабельный битмап для bsBMP и все последующие после него. Значения на 0!

Добавлено через 7 минут
При первом запуске создает контексты, битмапы и селектит для 4: mDC, bgDC, dsDC и bsDC. После повторного старта создает только для 3: mDC, bgDC, dsDC. У остальных контексты создаются, а битмапы нет!

Добавлено через 12 минут
Нашел!!!!
Проблема в размере создаваемого компитабельного (Compitable) битмапа. Суть в том, что я в проекте создаю 6 битмапов с размером 3000*3000 пикселей.
После поставил для 3 битмапов по 3000 размер, а для оставшихся 3-х по 1000. И все заработало - битмапы создаются и селектятся!!
В итоге: получается при создании компитабельных битмапов в сумме их размер не должен превышать какого-то числа! Но вопрос какого и как подсчитать размер для этих битмапов? Чтобы в реалтайм отслеживать размер и видеть будет ли превышен или нет...
Жду помощи по найденой ошибке))))

Добавлено через 21 час 31 минуту
Вопрос - как узнать размер bitmap в памяти?!

Добавлено через 4 минуты
Искал в нете, нашел такое уравнение:
Размер = Высота*Ширина*КоличествоБайтНаКаждыйПикс ель
Я знаю что есть такая структура:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct tagBITMAPINFOHEADER {
      DWORD biSize;
      DWORD biWidth;
      DWORD biHeight;
      WORD biPlanes;
      WORD biBitCount;
      DWORD biCompression;
      DWORD biSizeImage;
      DWORD biXPelsPerMeter;
      DWORD biYPelsPerMeter;
      DWORD biClrUsed;
      DWORD biClrImportant;
  } BITMAPINFOHEADER;
чтобы посчитать необходимо:
size = bihHeight*biWidth*biBitCount ??
Как получить эту структуру BITMAPINFOHEADER для bitmap в памяти?!
biBitCount возвращает значение в битах, а для уравнения нужно в байтах.
То есть необходимо biBitCount/8??!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2016, 15:55
Помогаю со студенческими работами здесь

Работа в PowerShell (скопировать файл из одного места в другое)
Здравствуйте! Начали работать в PowerShell, преподаватель задал выполнить следующее: В зависимости от запроса в интерактивном режиме...

При нажатии на кнопку скопировать текст из одного текстового поля в другое
при нажатии на кнопку скопировать текст из одного текстового поля в другое. на странице html расположены два текстовых поля, и...

Скопировать изображение из одного PictureBox-а в другой
Добрый день, в одном пикчербоксе есть изображение. Надо скопировать его в другой пикчербокс. Пробовал варианты: PictureBox p =...

Подскажите, как сделать в html, чтобы изображение накладывалось на другое изображение?
Нужно, чтобы изображение накладывалось на другое изображение, а другое изображение растягивалось по заданной мною ширине. Спасибо, я...

Как поместить одно изображение на другое?
Я бы и вручную это сделал, но думаю, что в C# есть какие - нибудь средства, чтобы делать это проще. Вот ,например, нужно мне открыть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru