Последние записи
- Экранная лупа (линза)
- Функция выбора вариантов (choice) на CMD/BAT
- Поиск значения и вставка текста
- Быстрый доступ к пикселям
- Количество сотых долей секунды, прошедших с начала дня (CMD, BAT)
- Как по даблклику крутить значения ячейки по кругу (Microsoft Office Excel)?
- Запустить батник в свернутом окне
- Как получить доступ к массиву пикселов DIB
- Модуль числа |a| без условных операций на CMD
- Как копировать текст из блока в буфер обмена?
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
26th
Мар
Экранная лупа (линза)
Posted by obzor under Lazarus, Free Pascal
Делал линзу которая перемещается совместно с курсором, центр окна позиция курсора,
т.е окно которое выше уровня рабочего стола, в windows7 работало хорошо,
в Windows10 не хочет
Сделать скрин области экрана под окном линзы мне так и не удалось. А в Windows7 это было возможно. Посему окно линзы с согласно позиции курсора уже не по перемещать.
На счет сделать под окном даже не знаю. Можно, конечно, временно скрыть окно, но тогда линза будет мигать. Либо запоминать состояние экрана под окном в буфер, и его линзировать, но тогда динамические изменения не будут отображены.
P.S. Я, кажется, понял, как вы делали линзу. Раньше (Win 7) если окно имеет любую степень прозрачности, то скриншот делался так, будто бы этого окна и вовсе нет на экране. То есть даже если добавить 1 единицу прозрачности окну (что визуально фактически оставляет окно непрозрачным), мы уже могли спокойно считывать пиксели под окном). А в Win 10 теперь на скриншот попадает полупрозрачное окно, перекрывая задний фон.
да, так и есть. Достаточно было сделать это окно со степенью прозрачности.
Теперь это не прокатывает
Идея простая: сохраняем скриншот под нашим окном, используя это изображение в качестве кэша заднего фона. При перемещении линзы по экрану сдвигаем данный скриншот. Работает, но изменения под линзой не будут отображены (что в большинстве случаев не критично).
Вот функция скриншота заданной области экрана:
function ScreenShot(Left, Top, Width, Height: Integer): TBitmap;
var
ScreenDC: HDC;
begin
Result := nil;
if (Width <= 0) or (Height <= 0) then Exit;
Result := TBitmap.Create;
try
// Устанавливаем размер
Result.SetSize(Width, Height);
// Можно явно задать цветовой режим, но обычно не обязательно
Result.PixelFormat := pf24bit;
ScreenDC := GetDC(0); // контекст всего экрана
if ScreenDC = 0 then
begin
Result.Free;
Result := nil;
Exit;
end;
try
// Копируем область экрана напрямую в Canvas.Handle битмапа
if not BitBlt(Result.Canvas.Handle, 0, 0, Width, Height,
ScreenDC, Left, Top, SRCCOPY) then
begin
Result.Free;
Result := nil;
Exit;
end;
finally
ReleaseDC(0, ScreenDC);
end;
except
Result.Free;
raise;
end;
end;
Полный код проекта во вложении.
Управление линзой:
1. Перемещение: обычной мышкой.
2. Изменение масштаба: колесико мышки.
3. Размеры линзы: кнопки +, -.
4. Обновить задний фон: F5 (да, приходится принудительно обновлять, алгоритм прост: временно скрываем линзу, делаем новый скриншот и опять показываем линзу).
5. Закрыть линзу: Esc.
EXE также прикрепил во вложение.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)

