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

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

02.05.2023, 19:06. Показов 1484. Ответов 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
02.05.2023, 19:31
Сделай лучше слоеную форму (WS_EX_LAYERED)

Добавлено через 5 минут
Ну и для современных винд нужно использовать MagnificationAPI чтобы то что под окном отображалось нормально. Тут в готовых решениях есть пример стеклянной формы, вот там есть уже пример готовый.
1
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
02.05.2023, 19:38  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Сделай лучше слоеную форму (WS_EX_LAYERED)
Нужно именно свое окно, чтобы контролировать процесс отрисовки. Короче надо именно так. Главный вопрос почему на одних виндах нормально пашет, а на других - нет?

Цитата Сообщение от The trick Посмотреть сообщение
Ну и для современных винд нужно использовать MagnificationAPI чтобы то что под окном отображалось нормально
Под окном нормально всё отображается, если смесить созданное окно - то видно, что отрисовка формы работает нормально.
Короче странно это очень, много лет этим кодом пользовался - всё пахало, возможно это какая-то конфигурация библиотек gdi не такая? Уже голову сломал...
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
02.05.2023, 19:45
Цитата Сообщение от CRIDEL Посмотреть сообщение
Под окном нормально всё отображается, если смесить созданное окно - то видно, что отрисовка формы работает нормально.
Короче странно это очень, много лет этим кодом пользовался - всё пахало, возможно это какая-то конфигурация библиотек gdi не такая? Уже голову сломал...
Еще раз, в современных ос там по-другому работает, даже слоеные окна уже не так работают. Ты бы еще проект приложил, чтобы не создавать его за тебя.
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
02.05.2023, 19:55  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Еще раз, в современных ос там по-другому работает
Так в современных(8,10,11) этот код как раз пашет, не работает только на семёрках причём не всех, на некоторых тоже работает(процентов на 20).

Цитата Сообщение от The trick Посмотреть сообщение
Ты бы еще проект приложил
Так этот код независимый, только декларации в других модулях. Сейчас выковыряю и выложу.
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
02.05.2023, 20:19  [ТС]
Вот пример. В норме должно быть простое смещение вверх на высоту рамки и вправо на 20 пикселей. В случае проблемной семёрки - смещение как бы зацикливается.
Вложения
Тип файла: rar BitBlt_testProject.rar (548.5 Кб, 21 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
02.05.2023, 23:26
Цитата Сообщение от CRIDEL Посмотреть сообщение
BitBlt_testProject.rar (548.5 Кб, 5 просм
Что это такое ну!?
Миниатюры
Непонятное поведение BitBlt на разных виндах 7  
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
02.05.2023, 23:29
Уже давно по моему все знают что надо прикладывать ZIP-архивы, а не RAR у меня даже Total Commander не читает, хотя другие RAR читает...

Добавлено через 41 секунду
Почитай вот тут статью: https://click-or-die.ru/2018/1... e%3D2557.7

Добавлено через 49 секунд
Я в шоке с людей, честно, я уже давно RAR не прикладываю из уважения к людям обычным у которых нет WinRAR

Добавлено через 17 секунд
а ZIP открывается везде без сторонних программ
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 16:19  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
а ZIP открывается везде без сторонних программ
Вот zip
Вложения
Тип файла: zip BitBlt_testProject.zip (548.1 Кб, 6 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 16:37
Скачал, теперь всё успешно.

Добавлено через 47 секунд
Кстати приложенный вами ZIP даже меньше по размеру чем RAR

Добавлено через 49 секунд
Какой смысл тогда вообще от этого RAR если он даже в размере стал проигрывать теперь...

Добавлено через 1 минуту
Ну да, у меня тоже глючит отрисовка.

Добавлено через 2 минуты
Просто поставил AutoRedraw = True на форме и перестало глючить.

Добавлено через 40 секунд
и BorderStyle = 0

Добавлено через 2 минуты
Хотя я не понял, что должна делать эта программа вообще.
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 17:09  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Хотя я не понял, что должна делать эта программа вообще.
Цитата Сообщение от CRIDEL Посмотреть сообщение
В норме должно быть простое смещение вверх на высоту рамки и вправо на 20 пикселей. В случае проблемной семёрки - смещение как бы зацикливается
Задача создавать окно при помощи CreateWindowEx, которое будет находится над целевой формой и копировать её контекст(когда мне нужно, в данном примере - это событие перемещения мыши над лейблом), и при этом пропускать события мыши и клавиатуры.

Этот код работает на большинстве систем, но на некоторых 7-ках копирование происходит как будто с контекста десктопа а не контекста формы(почему и как этого избежать - главные вопросы) что и вызывает зацикливание смещения на 20 пикселей, которое по идее должно быть статичным:

Visual Basic
1
BitBlt mdc, 20, 0, Abs(rct.right - rct.Left), Abs(rct.bottom - rct.Top), BackHDC, 0, 0, SRCCOPY
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:16
Цитата Сообщение от CRIDEL Посмотреть сообщение
Этот код работает на большинстве систем
В семёрке у меня не работает, но в Xp ещё не проверял
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:18
Вот у меня в семёрке (64 бит)
Миниатюры
Непонятное поведение BitBlt на разных виндах 7  
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:19
Сразу видно неправильно что сделано и эти глюки залазят на заголовок окна формы, ну так точно не должно быть.

Добавлено через 47 секунд
Ладно, посмотрю как хрюша себя поведёт
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:23
Поведение в XP ни чем не отличается от семёрки, с чего вы взяли что оно должно корректно работать хоть в какой-то системе... Уже на двух системах глючит, что я проверил!
Миниатюры
Непонятное поведение BitBlt на разных виндах 7  
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:24
Ещё это залезание на заголовок формы мне ужасно не нравится просто...
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:25  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
Вот у меня в семёрке (64 бит)
Вот так не должно быть по логике кода. Должно просто статично смещаться. Вот на моей семёрке.
Миниатюры
Непонятное поведение BitBlt на разных виндах 7  
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:25
Цитата Сообщение от CRIDEL Посмотреть сообщение
Этот код работает на большинстве систем
Назовите мне хоть одну систему в которой этот код работает
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:27  [ТС]
Какой-то косяк с контекстом, неправильно работает либо CreateWindowEx либо BitBlt.

Добавлено через 59 секунд
Цитата Сообщение от HackerVlad Посмотреть сообщение
Назовите мне хоть одну систему в которой этот код работает
На 8,10,11 - работает без проблем, и на некоторых семёрках также.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
03.05.2023, 18:33
А зачем залазить на заголовок формы вообще???

Добавлено через 2 минуты
Цитата Сообщение от The trick Посмотреть сообщение
Сделай лучше слоеную форму (WS_EX_LAYERED)
Вон The Trick сказал сделать слоёную форму, пробовали?

Добавлено через 2 минуты
Насколько я помню поведение события MouseMove в разных операционных системах ведёт себя по разному, сталкивался как-то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2023, 18:33
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru