| « Поставить закладку » « Сделать стартовой » | |||
|
|||
| Статьи:: Delphi :: Графика в Delphi :: Рабочий стол и DELPHI
Рабочий стол и DELPHIРабочий стол и DELPHI В сегодняшнем разделе графики я решил познакомить тебя с издевательством над десктопом. Если говорить точнее, мы сегодня научимся на нём рисовать и запоминать его содержимое. Как всегда, я постараюсь всё хорошенечко растолковать и показать. Надеюсь, что тебе понравится сегодняшнее занятие. Для издевательств нам понадобиться форма с двумя кнопками и одной картинкой. Создай новый проект и поставь на него две пимпы TButton и один штука TImage. Приступим? Для первой кнопки напишем в событии OnClick : procedure TForm1.Button1Click(Sender: TObject); var ScreenDC:HDC; begin ScreenDC := GetDC(0); Rectangle(ScreenDC, 10, 10, 200, 200); ReleaseDC(0,ScreenDC); end; С помощью этой процедуры я рисую прямо на десктопе. Во время рисования, мне насрать на все запущенные приложения. Если они попадаются под руку, то рисование происходит поверх них. Теперь о содержимом. Я объявляю переменную ScreenDC типа HDC. HDC - это контекст рисования в windows, и работает почти так же, как и TCanvas (чуть позже ты увидешь связь). С помощью функции GetDC(0) я возвращаю контекст окна указанного в скобках. Но в этих скобках стоит 0 (ноль), а это значит, что мне нужен глобальный контекст, то есть самого десктопа. Далее, я вызываю функцию Rectangle, она похожа на ту, что мы использовали раньше TCanvas.Rectangle. Есть только одно отличие - первый параметр теперь, это контекст устройства, а затем идут координаты прямоугольника. Это связано с тем, что раньше мы рисовали через объект TCanvas, а сейчас будем рисовать средствами GDI Windows. Скажу по секрету :) TCanvas.Rectangle всего лишь вызывает Rectangle из Windows API и подставляет нужный контекст устройства и размеры. Сейчас мы сами сделаем это, без помощь TCanvas. После рисования, я освобождаю больше не нужный мне контекст через функцию ReleaseDC. Такие вещи обязательно надо освобождать, чтобы не засорять память. Если ты захочешь рисовать не на десктопе, а внутри определённого окна, то в этой процедуре нужно поправить только первую строчку. А именно, в качестве параметра GetDC передавать указатель на окно. Сразу возникает вопрос: "Как узнать указатель окна чужой проги?". Для этого можно воспользоваться функцией FindWindow (с ней мы уже знакомились в предыдущих номерах). Сейчас можно запустить прогу и посмотреть на результат, а мы я пока перейду ко второй пимпе. Для неё мы напишем следующий текст: procedure TForm1.Button2Click(Sender: TObject);
var
Canvas:TCanvas;
ScreenDC:HDC;
begin
ScreenDC := GetDC(0);
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image1.Canvas.Copyrect(Rect(0,0,Image1.Width,Image1.Height),
Canvas, Rect(0,0,Screen.Width,Screen.Height));
ReleaseDC(0,ScreenDC);
Canvas.Free;
end;
Сразу скажу, что здесь я получаю копию десктопа. Первая строка такая же, как и в предыдущей процедуре. Я точно также получаю контекст десктопа. Потом я создаю новую переменную Canvas типа ТCanvas (знакомый нам контекст рисования). Потом я связываю их между собой с помощью простого присваивания в Canvas.Handle:=ScreenDC. Теперь мой TCanvas указывает на декстоп, и я могу рисовать на нём, привычными нам методами. Далее, я получаю копию экрана и записываю её в картинку TImage с помощью функции Copyrect у контекста рисования картинки (Image1.Canvas.Copyrect). Эта функция выглядит так: procedure CopyRect( Dest: TRect; //Размеры получаемого изображения Canvas: TCanvas;//Контекст, из которого будет копироваться Source: TRect//Размеры исходного изображения ); CopyRect производит копирование изображения и одновременное масштабирование из размеров Source в Dest. В качестве первого параметра идут размеры получаемого изображения. Размеры передаются в виде переменной типа TRect. TRect - это простая запись, которая содержит четыре параметра: TRect = record Left, Top, Right, Bottom: Integer; end; С этим типом мы ещё не знакомы. Если хорошенько рассмотреть, то можно заметить сходство с объявлением объектов. Это так. Записи - это маленькие объекты, но не имеющие методов (процедур и функций), а только параметры любого типа. Все параметры общедоступны и внутри записи нельзя использовать директивы private, protected или public. Для получения такого типа и использую функцию Rect которая создаёт TRect. В качестве параметров выступают соответствующие размеры Rect(0, 0, Image1.Width, Image1.Height). Второй параметр - контекст рисования Canvas, который у нас ассоциирован с контекстом десктопа. Из него и будет происходить копирование. Третий параметр - размеры исходного изображения. И в самом конце, я освобождаю контекст рисования десктопа ReleaseDC(0,ScreenDC); и Canvas.Free. Запусти прогу и посмотри на результат. Если что-то ещё осталось непонятным, то после этого всё станет на свои места. Попробуй поиграть с этой прогой, это поможет тебе получше вникнуть во всё происходящее в ней. А я прощаюсь до следующего номера. Удачи!!! Рубрика: Графика в Delphi
Trac + Subversion @ Ubuntu: Revisited.
Задача: Установить на только что инсталлированный Ubuntu последнюю версию Trac, создать репозитории для нескольких проектов и настроить окружение соответственно. Структура проектов должна быть полностью корректной, установка максимально быстрой при минимальном количестве пакетов. Авторизация в репозитории и окружения Trac может быть общей, но позволяющей индивидуальную настройку для каждого проекта. Также, установка должна быть максимально независима от версий.
Подробнее... |
Рубрика: Ubuntu
| Добавлено: 30.08.2008
[g]Vim в режиме Python: Рекомпиляция в Windows.
Редактор Vim наиболее известен среди разработчиков в системах Unix — конкурент emacs, что-то вроде консольного IDE — этот редактор при должной сноровке и настройке (мне кажется, сноровке несколько меньшей и настройке более очевидной чем в emacs, но у последнего также есть мощная мультифункциональность — выбор за программистом) способен убыстрить и упростить многие процессы на этапах разработки не в ущерб таким удобствам как, например, авто-дополнение и навигация по проекту.
Подробнее... |
Рубрика: Статьи
| Добавлено: 30.08.2008
Java + JSON. Пути к дружбе.
Спешу поделиться результатами небольшого исследования, оказавшегося необходимым для текущего проекта. Рассматривается возможность связки Java и JSON, её преимущества и недостатки. Я расскажу о практической части, о теории больше поведают нижеприведённые ссылки (англ.).
Подробнее... |
Рубрика: Технология JAVA
| Добавлено: 30.08.2008
Остальные статьи:
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения
Windows 7: под покровом тайны
Apache mod_ndb - MySQL кластер с доступом через HTTP и Ajax
Поиск уязвимостей в программах с помощью анализаторов кода
Как появилась библиотека VivaCore
Это сложно
ASP.NET и немного поисковой оптимизации
Protocol buffers: библиотека обмена данными для C++, Java, Python от Google |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|