Как сделать инверсию экрана в delphi

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

В приложении Delphi автоматически создается глобальный объект Screen (экран) типа TScreen, свойства которого определяются из информации Windows о мониторе, на котором запускается приложение. Вы можете в любом приложении использовать, например, такие параметры объекта Screen, как Height — высота экрана и Width — его ширина. Так как вы используете в процессе проектирования один тип монитора, а приложение в дальнейшем может работать на мониторе другого типа, то не исключено, например, что ваша форма не поместится на экране или наоборот — будет слишком маленького размера для данного монитора. Чтобы избежать этих неприятностей, можно автоматически масштабировать свою форму, вводя, например, в обработчик ее события OnCreate код:

Этот код задает размеры формы равными половине соответствующих размеров экрана.

Разрешающую способность экрана можно определить, воспользовавшись свойством PixelsPerInch, указывающим количество пикселей экрана на дюйм в вертикальном направлении. Это справедливо именно для вертикального направления, поскольку во многих мониторах коэффициенты масштабирования по горизонтали и вертикали различаются.

Screen имеет свойство Forms[I], содержащее список форм, отображаемых в данный момент на экране, и свойство FormCount, отражающее количество таких форм. Вы можете использовать это свойство, например, для того, чтобы гарантировать, что на данном типе монитора размеры ни одной формы не превысят размеров экрана. Соответствующий код может выглядеть так:

Размеры форм, превышающие размер экрана, урезаются этим кодом.

В приведенных примерах надо, конечно, предусмотреть, чтобы при изменении размеров формы адекватно изменялось и расположение компонентов на ее поверхности.

Еще одно полезное свойство объекта Screen — Fonts (шрифты). Это свойство типа TStrings содержит список шрифтов, доступных на данном компьютере (свойство только для чтения). Его можно использовать в приложении, чтобы проверять, имеется ли на компьютере тот или иной шрифт, используемый в приложении. Если нет — то можно или дать пользователю соответствующее предупреждение, или сменить шрифт в приложении на один из доступных, или дать пользователю возможность самому выбрать соответствующий шрифт. Например, вы можете поместить в вашем приложении компонент списка TComboBox и при событии формы OnCreate загрузить его доступными шрифтами с помощью операторов:

Тогда в нужный момент пользователь может выбрать подходящий шрифт из списка. Пример использования свойства Screen.Fonts приведен в разделе 3.1.

В Delphi 5 в тип TScreen введено два новых свойства: HintFont и MenuFont типа TFont. Они хранят установленные в Windows шрифты отображения ярлычков и разделов меню.

При успешном или аварийном окончании длинных операций курсор в любом случае возвращается в значение по умолчанию. Если в приложении в какие-то отрезки времени используется отличный от crDefault глобальный вид курсора, то приведенный код можно изменить, чтобы по окончании длинных операций восстановить прежнее глобальное значение:

С помощью Screen можно получить доступ к активной в текущий момент форме вашего приложения через свойство ActiveForm. Если в данный момент пользователь переключился с вашего приложения на какое-то другое и, следовательно, ни одна форма вашего приложения не активна, то ActiveForm указывает на форму, которая станет активной, когда пользователь вернется к вашему приложению. В момент переключения фокуса с одной вашей формы на другую, генерируется событие OnActiveFormChange.

Аналогично с помощью свойства ActiveControl можно получить доступ к активному в данный момент оконному компоненту на активной форме. При смене фокуса генерируется событие OnActiveControlChange.

Как можно быстро изменять цвет произвольной точки экрана? Ведь ВинАпи функции прежде, чем сделать это, высчитывают какие-то координаты или ещё что-то, а потом меняют цвет точки (setpixel(), например). Но именно изменение цвета пиксела, как? Может где-то в памяти хранится текущий массив точек экрана (возможно, в видео памяти), как манипулировать этим массивом?

38.4k 10 10 золотых знаков 43 43 серебряных знака 80 80 бронзовых знаков

1,251 2 2 золотых знака 19 19 серебряных знаков 54 54 бронзовых знака

Не уверен, но возможно вам помогут аппаратные оверлеи.

А для чего это нужно кстати? Если нужно изменить только один пиксель, то достаточно SetPixel(), а если нужно изменить какую-то прямоугольную область - можно скопировать ее в память (memory DC), ассоциировать с DIB-section, к которому уже можно обращаться уже как к массиву пикселей, а потом скопировать эту область обратно.

high-dpi-ide-comparison-by-jim

В Delphi, C ++ Builder и RAD Studio 11.0 Alexandria есть очень интересное улучшение: теперь среда IDE полностью поддерживает масштабирование с высоким разрешением на экранах с высоким разрешением. Это означает, что если вы используете Windows и у вас есть дисплей 4K или аналогичный с высоким разрешением, IDE будет отображать на вашем экране четкое и четкое изображение. Фактически, если у вас есть два экрана с разными масштабами, у вас могут быть разные окна IDE на этих нескольких дисплеях, и каждое будет отображаться идеально, четко и ясно на каждом мониторе. Эта поддержка масштабирования с высоким разрешением DPI использует собственную поддержку VCL для масштабирования perMonitorv2, которую мы представили пару выпусков назад, а также нашу собственную коллекцию изображений и компоненты списка виртуальных изображений. Другими словами, мы используем те же инструменты, которые предоставляем вам.

Давайте углубимся в то, как IDE сегодня ведет себя как на экранах с высоким, так и с низким разрешением, сделаем несколько интересных заметок о том, как это было реализовано, и, в частности, рассмотрим проектирование форм VCL.

Сравнение высокого разрешения

Лучший способ увидеть разницу в среде IDE — это использовать ее. Использование IDE на дисплее с высоким разрешением похоже на ночь и день — есть некоторые вещи, о которых скриншоты передают только наполовину, и то, как выглядит и ощущается RAD Studio 11, является одним из них. Лично это потрясающая разница.

high-dpi-ide-comparison-by-jim

Слева старая IDE без поддержки DPI в 10.4.2. Он рисует в низком разрешении, поэтому при увеличении становится размытым.
Справа — новая IDE с поддержкой высокого разрешения в v11. Он четкий и ясный независимо от масштаба.

Вы можете видеть, что на изображении справа в v11.0 Alexandria текст и значки четкие, независимо от размера дисплея, на котором размещена IDE.

Фон — почему именно высокий DPI?

2x the pixel density

Типичный масштаб, установленный в Windows сегодня, составляет 200%. Это вдвое больше плотности пикселей, что на самом деле означает, что для каждого пикселя в прошлом теперь есть четыре пикселя (он разделен на два по вертикали и горизонтали). Я пишу это на мониторе 4K, который имеет высоту 2160 пикселей. Это в 2 раза больше 1080, вертикальное разрешение, которое до высокого разрешения я использовал годами. Чтобы все выглядело на экране одинакового физического размера, мне нужно масштабировать на 2.

IDE использует стили для рисования своих светлых, темных и туманных тем, а стили VCL также поддерживают масштабирование с высоким разрешением .

Дизайнеры форм с высоким разрешением

В то время как поддержка высокого разрешения VCL в значительной степени зависит от включения поддержки perMonitorv2 на странице Application> Manifest параметров вашего проекта и перекомпиляции, а также обновления изображений (дополнительная информация ниже) и обновления любого пользовательского рисунка или жестко заданных констант пикселей для использования ScaleValue перегрузкичтобы получить новую точку, значение, прямоугольник и т. д. для формы с высоким разрешением, это не так просто. У нас была одна конкретная область, не относящаяся к клиентским приложениям, над которой нам нужно было работать, и именно она потребовала большей части наших усилий по разработке. Фактически, исследование и создание прототипа лучшего подхода — одна из причин, по которой до версии 11 потребовалось реализовать высокий DPI в среде IDE после того, как мы представили поддержку самого VCL в 10.3. Эта область — конструктор форм VCL. Мы придумали решение, которое, как мы надеемся, удовлетворит все потребности.

Вы можете масштабировать конструктор форм VCL до любого DPI (любого масштаба). Это выполняется с использованием той же технологии масштабирования, которую VCL использует при масштабировании во время выполнения, то есть когда приложение запущено и ему необходимо настроить его размер и макет для соответствия дисплей, который он включен. Этот параметр находится в Инструменты> Параметры> Пользовательский интерфейс> Конструктор форм> Высокое разрешение. Когда вы его измените, вам нужно будет закрыть и снова открыть конструктор форм, чтобы получить эффект.

По умолчанию, когда вы открываете форму, она создается с разрешением 96 точек на дюйм, то есть 100%. Это означает, что если ваша IDE установлена ​​на 200%, форма будет казаться меньше, чем элементы управления вокруг нее. Одним из ключевых моментов является то, что при масштабировании формы меняются свойства Left, Height и т. Д. — это точно так же, как когда вы запускаете приложение, и оно масштабируется; эти значения умножаются на масштаб экрана. Проектирование на 100% по умолчанию означает, что форма вообще не масштабируется: открытие формы не изменяет значения, хранящиеся в DFM, по сравнению с ее открытием, скажем, в 10.4.2. Если вы устанавливаете v11 и замечаете, что ваши формы выглядят маленькими, вот почему: мы сделали поведение по умолчанию, чтобы не изменять форму.

vcl-form-designer-high-dpi-default-low-dpi-8659876-2

IDE масштабируется до 200%, но содержимое конструктора форм составляет 100%. Вы можете видеть, что кнопки и текст составляют половину размера окна IDE справа.
Скорее всего, мы настроим масштабирование подписи дизайнера форм в будущем выпуске — в настоящее время масштабируется только фактическое созданное содержимое вашей формы.

Наконец, вы можете установить конкретный масштаб, который вы используете для проектирования форм. Это может быть любой масштаб — 125%, 300%, что угодно.

vcl-form-designer-high-dpi-really-high-dpi-8302581-2

Вы можете выбрать любой масштаб для проектирования, и это рекомендуется, чтобы все члены вашей команды работали с одним и тем же DPI. Ради демонстрации, здесь дизайнер настроен на больший, чем (1,5x) масштаб, используемый экраном и самой IDE, и вы можете видеть, что текст и кнопки больше, чем у IDE! Вы вряд ли выберете это на практике, но это показывает, как вы можете довольно хорошо выбрать любой масштаб.

Windows и поэтому VCL использует целочисленные координаты для своих размеров и местоположений. Это означает, что любое масштабирование любого приложения не всегда может быть точным. На практике это нормально при масштабировании один раз (например, когда приложение запущено, и оно масштабируется от координат низкого разрешения, с которыми оно было разработано). Это также хорошо масштабируется несколько раз, например, при переходе с одного монитора на другой. после запуска. Это имеет большее значение при многократном масштабировании (и это одна из причин, по которой у нас нет функции, позволяющей проектировать в любом масштабе, но уменьшать масштаб до 100% при сохранении). Так что можно проектировать с высоким DPI в любом масштабе, и работать даже в более низком масштабе — VCL будет правильно масштабировать ваше приложение — но важно избегать масштабирования снова и снова, что будет происходить, если каждый раз, когда вы открываете форму в дизайнере, она открывается с другим DPI. Следовательно,

FireMonkey Designer

Конструктор FireMonkey намного проще. Он просто масштабируется в соответствии с собственным масштабом IDE, так же, как если бы вы масштабировали приложение FMX в коде. FireMonkey использует координаты с плавающей запятой и не имеет тех же технических соображений, что и приложения VCL. В версии 11 мы также изменили FireMonkey в Windows, чтобы использовать систему координат, основанную на единицах устройства, а не в пикселях, что означает, что формы Windows FMX могут масштабироваться в соответствии с масштабом отображения лучше, чем в прошлом, в том числе с более высоким качеством рендеринга.

Технические изменения

Поставщики компонентов не нуждаются в каких-либо изменениях значков, которые они поставляют вместе со своими компонентами, поскольку мы поддерживаем значки компонентов с высоким разрешением в формате PNG с 10.2.2 . Поставщики подключаемых модулей или надстроек имеют новые API-интерфейсы в ToolsAPI для добавления изображений во внутреннюю коллекцию изображений с высоким разрешением среды IDE (они выходят за рамки данной статьи, но проверьте ToolsAPI.pas на наличие TGraphicArray: каждая из этих новых перегрузок позволяет добавлять несколько размеров изображение в коллекцию изображений, поддерживающих списки изображений IDE.)

Внутренне, и это не повлияет ни на одного разработчика, но может быть интересно узнать: каждая форма IDE имеет свой собственный список изображений . Это требуется для поддержки высокого разрешения, так как это масштабируемая форма, а две формы на двух разных экранах могут масштабироваться по-разному, поэтому список изображений нельзя использовать в нескольких формах или элементах управления в нескольких формах, потому что изображения могут быть подходящего размера для одна форма, но неправильная для другой. Фактически, в прошлом в IDE в любом случае было несколько списков изображений в старом стиле, часто по одному на форму; но в прошлом, поскольку списки изображений в старом стиле хранят свои собственные изображения, это также означало, что многие изображения дублировались. Красный значок удаления X мог быть в нескольких списках изображений, и это затрудняло обновление значков.

В IDE теперь есть единая центральная коллекция изображений . Он содержит все изображения, используемые в среде IDE (кроме значков компонентов, которые хранятся отдельно). Несколько списков изображений в среде IDE подключаются к этой коллекции изображений. В рамках этой работы мы использовали программное обеспечение и человеческий глаз для исключения дубликатов значков, поэтому в коллекции изображений есть по одной копии каждого из них. Это значительно упростило обновление значков. В коллекции изображений теперь есть поле комментария для каждого значка, которое можно использовать для хранения любой информации, которую вы хотите: мы используем его для хранения заметок о том, где и как используется значок.

Мы надеемся, что это понимание примененного нами подхода может быть полезно для вас при обновлении вашего собственного программного обеспечения до высокого разрешения. У нас также есть исчерпывающая документация по изображениям с высоким разрешением здесь .

Прочие изменения

Последнее небольшое изменение, которое мы внесли, — это некоторые значки IDE. Большинство значков были заменены версиями с высоким разрешением (мульти-разрешением), поэтому они могут отображаться четко в любом масштабе. Однако мы также переработали некоторые значки для ключевых частей продукта.

The new Run with Debugging icon. It looks more like a Run symbol, and has a bug being squashed underneath. Step Over — such a simple design! But I think a very elegant way of showing the concept

high-dpi-crisp-editor-and-consolas-font-procedure-9799954-2

Кроме того, мы перешли на Consolas в качестве шрифта по умолчанию для редактора. Consolas — очень похожий на Delphi шрифт, то есть он будет для вас естественным, если в прошлом вы использовали старый стандартный шрифт Courier New (который вы все еще можете использовать). Мы также устанавливаем несколько программных шрифтов: Fira Code, Monoid, Source Code Pro и так далее.

IDE с высоким разрешением

RAD Studio 11.0 предлагает долгожданный и очень большой пересмотр среды IDE: полная поддержка высокого разрешения. Четкая и четкая визуализация на всех экранах, поддержка создания форм в нескольких масштабах и четкий текст с новым, но знакомым шрифтом в редакторе — это одно из самых больших изменений и улучшений, которые мы сделали.

Python GUI Development

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today

Свойство объектов Canvas

    1. Обзор
    2. Из данной статьи Вы узнаете о том, какие возможности есть в Delphi для создания приложений, использующих графику; как использовать компоненты для отображения картинок; какие средства есть в Delphi для оформления программы. Кроме того, познакомитесь с важным свойством Canvas, которое предоставляет доступ к графическому образу объекта на экране.
    3. Графические компоненты
    4. В стандартную библиотеку визуальных компонент Delphi входит несколько объектов, с помощью которых можно придать своей программе совершенно оригинальный вид. Это - TImage (TDBImage), TShape, TBevel.

    TImage позволяет поместить графическое изображение в любое место на форме. Этот объект очень прост в использовании - выберите его на странице Additional и поместите в нужное место формы. Собственно картинку можно загрузить во время дизайна в редакторе свойства Picture (Инспектор Объектов). Картинка должна храниться в файле в формате BMP ( bitmap), WMF (Windows Meta File ) или ICO ( icon ). (TDBImage отображает картинку, хранящуюся в таблице в поле типа BLOB. При этом доступен только формат BMP.)

    Как известно, форматов хранения изображений гораздо больше трех вышеназванных (например, наиболее известны PCX, GIF, TIFF, JPEG). Для включения в программу изображений в этих форматах нужно либо перевести их в формат BMP, либо найти библиотеки третьих фирм, в которых есть аналог TImage, “понимающий” данные форматы (есть как VBX объекты, так и “родные” объекты для Delphi).

    При проектировании следует помнить, что изображение, помещенное на форму во время дизайна, включается в файл .DPR и затем прикомпилируется к EXE файлу. Поэтому такой EXE файл может получиться достаточно большой. Как альтернативу можно рассмотреть загрузку картинки во время выполнения программы, для этого у свойства Picture (которое является объектом со своим набором свойств и методов) есть специальный метод LoadFromFile. Это делается, например, так:

    if OpenDialog1.Execute then

    Важными являются свойства объекта Center и Stretch - оба имеют булевский тип. Если Center установлено в True, то центр изображения будет совмещаться с центром объекта TImage. Если Stretch установлено в True, то изображение будет сжиматься или растягиваться таким образом, чтобы заполнить весь объект TImage.

    TShape - простейшие графические объекты на форме типа круг, квадрат и т.п. Вид объекта указывается в свойстве Shape. Свойство Pen определяет цвет и вид границы объекта. Brush задает цвет и вид заполнения объекта. Эти свойства можно менять как во время дизайна, так и во время выполнения программы.

    TBevel - объект для украшения программы, может принимать вид рамки или линии. Объект предоставляет меньше возможностей по сравнению с TPanel, но не занимает ресурсов. Внешний вид указывается с помощью свойств Shape и Style.

    Brush - кисть, является объектом со своим набором свойств:

    Bitmap - картинка размером строго 8x8, используется для заполнения (заливки) области на экране.

    Color - цвет заливки.

    Style - предопределенный стиль заливки; это свойство конкурирует со свойством Bitmap - какое свойство Вы определили последним, то и будет определять вид заливки.

    Handle - данное свойство дает возможность использовать кисть в прямых вызовах процедур Windows API .

    ClipRect - (только чтение) прямоугольник, на котором происходит графический вывод.

    CopyMode - свойство определяет, каким образом будет происходить копирование (метод CopyRect) на данную канву изображения из другого места: один к одному, с инверсией изображения и др.

    Font - шрифт, которым выводится текст (метод TextOut).

    Handle - данное свойство используется для прямых вызовов Windows API.

    Pen - карандаш, определяет вид линий; как и кисть (Brush) является объектом с набором свойств:

    Color - цвет линии

    Handle - для прямых вызовов Windows API

    Mode - режим вывода: простая линия, с инвертированием, с

    выполнением исключающего или и др.

    Style - стиль вывода: линия, пунктир и др.

    Width - ширина линии в точках

    PenPos - текущая позиция карандаша, карандаш рекомендуется перемещать с помощью метода MoveTo, а не прямой установкой данного свойства.

    Pixels - двухмерный массив элементов изображения (pixel), с его помощью Вы получаете доступ к каждой отдельной точке изображения (см. пример к данному уроку).

    Методы для рисования простейшей графики - Arc, Chord, LineTo, Pie, Polygon, PolyLine, Rectangle, RoundRect . При прорисовке линий в этих методах используются карандаш (Pen) канвы, а для заполнения внутренних областей - кисть (Brush).

    Методы для вывода картинок на канву - Draw и StretchDraw , В качестве параметров указываются прямоугольник и графический объект для вывода (это может быть TBitmap, TIcon или TMetafile). StretchDraw отличается тем, что растягивает или сжимает картинку так, чтобы она заполнила весь указанный прямоугольник (см. пример к данному уроку).

    Методы для вывода текста - TextOut и TextRect. При выводе текста используется шрифт (Font) канвы. При использовании TextRect текст выводится только внутри указанного прямоугольника. Длину и высоту текста можно узнать с помощью функций TextWidth и TextHeight.

    В первом примере (проект SHAPE.DPR, рис.1) показано, как во время выполнения программы можно изменять свойства объекта TShape. Изменение цвета объекта (событие OnChange для ColorGrid1):

    Во втором примере (проект PIXELS.DPR, рис.2) показано, как осуществить доступ к отдельной точке на изображении (на канве). По нажатию кнопки “Fill” всем точкам изображения присваивается свой цвет:

    procedure TForm1.Button1Click(Sender: TObject);

    for i:=1 to Width do begin

    for j:=1 to Height do

    В третьей программе (проект DRAW.DPR, рис.3) приведен пример использования методов, выводящих изображение - Draw и StretchDraw:

    Прорисовка изображений происходит в обработчике события OnPaint для формы:

    Читайте также: