70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397

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

02.05.2023, 19:06. Показов 1798. Ответов 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
03.05.2023, 18:52
Добавил Me.Refresh и глюк исчез
0
70 / 62 / 19
Регистрация: 03.05.2013
Сообщений: 397
03.05.2023, 18:53  [ТС]
Цитата Сообщение от HackerVlad Посмотреть сообщение
А зачем залазить на заголовок формы вообще???
Это демонстрационный проект, в данном случае это не имеет значения.
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
03.05.2023, 19:12
Ну тут что-то с графикой как система обновляет графику

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

Добавлено через 10 минут
Я вот о чём подумал, все эти hdc с лёгкостью перезатираются, так работает графический драйвер наверное, лучше пользоваться более устойчивыми графическими объектами такими как Picture на форме
0
1407 / 866 / 93
Регистрация: 08.02.2017
Сообщений: 3,700
Записей в блоге: 2
03.05.2023, 19:50
Насчёт BitBit тоже идея была, сделать оконный скриншеттер с прокруткой, не знаю, реализуемой ли..
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,803
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru