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

Непонятное поведение BitBlt на разных виндах 7

02.05.2023, 19:06. Показов 1494. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:

Создавать окно поверх формы, которое будет копировать её контекст, при этом пропуская события мыши и клавы.


Идентичный код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Private Sub Form_Load()
 
    Hwndr = Me.hWnd
    HDCR = GetDC(Hwndr)
    
    GetWindowRect Hwndr, rct
    GetClientRect Hwndr, InnerRct
    
    ResultWidth = Abs(InnerRct.right - InnerRct.Left)
    ResultHeight = Abs(InnerRct.bottom - InnerRct.Top)
    
    With bi24BitInfo.bmiHeader
    .biBitCount = 24
    .biCompression = BI_RGB
    .biPlanes = 1
    .biSize = Len(bi24BitInfo.bmiHeader)
    .biWidth = ResultWidth
    .biHeight = ResultHeight
    End With
    
    BackHDC = CreateCompatibleDC(HDCR)
    Back = CreateDIBSection(BackHDC, bi24BitInfo, DIB_RGB_COLORS, ByVal 0&, ByVal 0&, ByVal 0&)
    SelectObject BackHDC, Back
    
    MWND = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "EmptyWndClass", (WS_POPUP + SS_OWNERDRAW), rct.Left, rct.Top, ResultWidth, ResultHeight, Hwndr, 0, HDCR, cs)
    mdc = GetDC(MWND)
    
    SetWindowPos MWND, Hwndr, rct.Left, rct.Top, 0, 0, (SWP_NOSIZE + SWP_NOACTIVATE + SWP_SHOWWINDOW)
 
End Sub
 
 
Private Sub Form_Unload(Cancel As Integer)
 
    ReleaseDC Hwndr, HDCR
    
    DeleteDC BackHDC
    DeleteObject Back
    
    DestroyWindow MWND
 
End Sub
 
Private Sub LabelTest_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 
    BitBlt BackHDC, 0, 0, Abs(rct.right - rct.Left), Abs(rct.bottom - rct.Top), HDCR, 0, 0, SRCCOPY
 
    BitBlt mdc, 20, 0, Abs(rct.right - rct.Left), Abs(rct.bottom - rct.Top), BackHDC, 0, 0, SRCCOPY
    
End Sub
Должно просто копировать контекст, но на некоторых 7 как будто пропечатывает на родной контекст формы, вместо контекста окна. в приложении видео, где видна разница.

На разных системах ведёт себя по-разному, причём на 8-ке и 10-ке всё нормально, а вот на семёрках работает по-разному. Тестил как на виртуалках так и на железках. Может я неправильно пишу чего?
Вложения
Тип файла: mp4 bitblt bug.mp4 (1.66 Мб, 28 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2023, 19:06
Ответы с готовыми решениями:

Один и тот же дистрибутив Windows 10 на разных компьютерах, непонятное поведение
Как говорил один генерал в солдатском госпитале из старого анекдота: «вопросы, жалобы есть? жалоб нет, но есть просьба ... Какая просьба...

проблема работы асп с базами на разных виндах...
подключение в обоих виндах (2000Сервер и 2003Сервер) идёт одинаково... Подключение: 1) Драйвер МДВ 2) Имя и описание: ED1M 3) Путь:...

Непонятное поведение поведение TIM6 на STM32f4discovery
Вводные данные: SYSCLK=168Мгц; AHB Pressotir=1; APB1 Pressotir=4; TIM6_Pessotir=3; Т.о. частота тактирования на таймере=42Мгц ...

29
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:51  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вон The Trick сказал сделать слоёную форму, пробовали?
Мне нужно именно окно. Стиль WS_EX_LAYERED пробовал применять и менять alphablend - безрезультатно.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Насколько я помню поведение события MouseMove в разных операционных системах ведёт себя по разному, сталкивался как-то
Это неважно, можно повесить отрисовку на любой другой event, эффект будет тот же.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:52
Добавил Me.Refresh и глюк исчез
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:53  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
А зачем залазить на заголовок формы вообще???
Это демонстрационный проект, в данном случае это не имеет значения.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:54
Вот решение

Visual Basic
1
2
3
4
5
Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Me.Refresh
    BitBlt BackHDC, 0, 0, Abs(rct.right - rct.Left), Abs(rct.bottom - rct.Top), HDCR, 0, 0, SRCCOPY
    BitBlt mdc, 20, 0, Abs(rct.right - rct.Left), Abs(rct.bottom - rct.Top), BackHDC, 0, 0, SRCCOPY
End Sub
Добавлено через 14 секунд
И никаких глюков больше
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:56  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Добавил Me.Refresh и глюк исчез
Да замечал такой момент, но так не должно быть. BitBlt вообще не затрагивает контекст формы(по крайней мере в коде), однако на деле мы видим обратное.

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот решение
Это не решение, мне не нужно обновлять контекст формы. И кстати даже при таком положении возникает flicker.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 19:12
Ну тут что-то с графикой как система обновляет графику

Добавлено через 5 минут
Лучше через DirectX рисовать

Добавлено через 10 минут
Я вот о чём подумал, все эти hdc с лёгкостью перезатираются, так работает графический драйвер наверное, лучше пользоваться более устойчивыми графическими объектами такими как Picture на форме
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,537
Записей в блоге: 1
03.05.2023, 19:50
Насчёт BitBit тоже идея была, сделать оконный скриншеттер с прокруткой, не знаю, реализуемой ли..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 20:29
Цитата Сообщение от testuser2 Посмотреть сообщение
BitBit
BitBlt а не BitBit

Скриншоты с экрана легко делаются можно и в файл JPG сохранять сразу.
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
19.05.2023, 12:40  [ТС]
Ответ найден. Всему причиной введённая в висте служба композиции рабочего стола. До висты все окна рисовали своё содержимое на одном контексте(рабочего стола) дабы не нагружать пямять, начиная с висты появилась служба композиции рабочего стола и система оконного отображения Aero, в которой все окна отрисовывают свое содержимое независимо от рабочего стола каждое в своём контексте. После семёрки эта служба включена по умолчанию и не может быть отключена, вот и ответ. Спасибо всем кто принимал участие в обсуждении!
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
19.05.2023, 12:50
Я же тестировал в XP там нету Windows Aero и так же не работало. Плюс VB6 у меня запускается с галочкой "Отключить композицию рабочего стола" то есть Windows Aero в VB6 у меня тоже вырубается (чтобы не глючил GUI в формах) то есть при чём тут Windows Aero вообще...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2023, 12:50
Помогаю со студенческими работами здесь

Непонятное поведение
Всем привет! В книге "Прата - Язык программирования C++. Лекции и управжения 2011" нашёл вот такой пример: const free_throws...

Непонятное поведение
Касперский обнаружил немного мусора. После загрузки компьютер работает нормально, но со временем начинает подтормаживать. То ли железоЮ то...

Непонятное поведение ОС
Здрасте! Купил новый комп, а он загружается через раз (чаще через несколько раз), выключается долго, и один раз не вышел из спячки. ...

Непонятное поведение
Всем привет) Задача: выбрать файл и , если это картинка, вывести изображение в окне браузера (причем размер должен быть не более 300px...

Непонятное поведение функции
Есть некоторый метод класса: int mustAttack(Chess &chess, Player& p1, Player& p2, int atackerName, int chessid) { if (chess.alive)...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Первый деплой
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