FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 4. Отрисовка текста.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

Реклама:

биржа кафе

Курсы таможенных брокеров Москва. Курсы в Москве таможенный брокер.

 

В этом разделе мы научимся как "рисовать" текст в клиентской части окна. Мы также узнаем о контекстах устройств.

Теория:

Текст в Windows - это вид GUI объекта. Каждый символ создан из множества пикселей (точек), которые соединены в различные рисунки. Вот почему мы "рисуем" их, а не "пишем". Обычно вы рисуете текст в вашей клиентской области (на самом деле, вы можете рисовать за пределами клиентской области, но это другая история). Помещения текста на экран в Windows разительно отличается от того, как это делается в DOS'е. В DOS'е размерность экрана 80x25. Но в Windows, экран используется одновременно несколькими программами. Необходимо следовать определенным правилам, чтобы избежать того, чтобы программы рисовали поверх чужой части экрана. Windows обеспечивает это, ограничивая область рисования его клиентской частью. размер клиентской части окна совсем не константа. Пользователь может изменить его в любой момент, поэтому вы должны определять размеры вашей клиентской области динамически. Перед тем, как вы нарисуете что-нибудь на клиентской части, вы должны спросить разрешения у операционной системы. Действительно, теперь у вас нет абсолютного контроля над экраном, как это было в DOS'е. Вы должны спрашивать Windows, чтобы он позволил вам рисовать в вашей собственной клиентской области. Windows определит размер вашей клиентской области, фонт, цвета и другие графические атрибуты и пошлет хэндл контекста устройства (device context) программе. Тогда вы сможете использовать его как пропуск к рисованию.

Что такое контекст устройства? Это всего структура данных, использующаяся Windows внутренне. Контекст устройства сопоставлен определенному устройству, такому как принтер или видео-адаптер. Для видеодисплея, контекст устройства обычно сопоставлен определенному окну на экране.

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

Они существуют, чтобы помочь снизить загрузку из-за необходимости указывать эти атрибуты при каждом вызове функций GDI.

Когда программе нужно отрисовать что-нибудь, она должна получить хэндл контекста устройства. Как правило, есть несколько путей достигнуть этого.

• Вызовите BeginPaint в ответ на сообщение WM_PAINT.
• Вызовите GetDC в ответ на другие сообщения.
• Вызовите CreateDC, чтобы создать ваш собственный контекст устройства.

Вы должны помнить одну вещь. После того, как вы проделали с хэндлом контекста устройства все, что вам было нужно в рамках ответа на одно сообщение, вы должны освободить этот хэндл.

Нельзя делать так: получить хэндл, обрабатывая одно сообщение, и освободить его, обрабатывая другое.

Windows посылает сообщение WM_PAINT окну, чтобы уведомить его о том, что настало время для перерисовки клиентской области. Windows не сохраняет содержимое клиентской части окна. Взамен, когда происходит ситуация, служащая основанием для перерисовки окна, Windows помещает в очередь сообщений окна WM_PAINT.
Окно должно само перерисовать свою клиентскую область. Вы должны поместить всю информацию о том, как перерисовывать клиентскую область в секции WM_PAINT вашей процедуры окна, так чтобы она могла отрисовать всю клиентскую часть, когда будет получено сообщение WM_PAINT. Также вы должны представлять себе, что такое invalid rectangle. Windows определяет i.r. как наименьшую прямоугольную часть окна, которая должна быть перерисована. Когда Windows обнаруживает i.r. в клиентской области окна, оно посылает сообщение WM_PAINT этому окну. В ответ на сообщение, окно может получить структуру PAINTSTRUCT, которая среди прочего содержит координаты i.r.. Вы вызываете функцию Beginpaint в ответ на сообщение WM_PAINT, чтобы сделать неполноценный прямоугольник снова нормальным.
Если вы не обрабатываете сообщение WM_PAINT, то по крайней мере вам следует вызвать DefWindowProc или ValidateRect, иначе Windows будет слать вам WM_PAINT постоянно.

Ниже показаны шаги, которые вы должны выполнить, обрабатывая сообщение WM_PAINT:

• Получить хэндл контекста устройства с помощью BeginPaint.
• Отрисовать клиентскую область.
• Освободить хэндл функцией EndPaint.

Заметьте, что вы не обязаны думать о том, чтобы пометить неполноценные прямоугольники как нормальные, так как это делается автоматически при вызове Beginpaint.
Между связкой Beginpaint-Endpaint, вы можете вызвать любую другую графическую функцию, чтобы рисовать в вашей клиентской области. Практически все из них требуют хэндл контекста устройства.

Содержимое:

Мы напишем программу, отображающую текстовую строку "Win32 FreeBasic is great and easy!" в центре клиентской области.

Скопировать данный код в буфер обмена

Анализ:

Большая часть этого кода точно такая же, как и пример из Урока 3. Я объясню только важные изменения.

dim hDc as HDC ' хэндл контекста устройства
dim ps as PAINTSTRUCT ' структура PAINTSTRUCT
dim rect as RECT

Это несколько переменных, использующихся в нашей секции WM_PAINT. Переменная hdc используется для сохранения хэндла контекста устройства, возвращенного функцией BeginPaint. ps - это структура PAINTSTRUCT. Обычно вам не нужны значения этой структуры. Она передается функции BeginPaint и Windows заполняет ее подходящими значениями. Затем вы передаете ps функции EndPaint, когда заканчиваете отрисовку клиентской области. rect - это структура RECT, определенная
следующим образом:

type RECT
left as LONG
top as LONG
right as LONG
bottom as LONG
end type

Left и top - это координаты верхнего левого угла прямоугольника. Right и bottom - это координаты нижнего правого угла. Помните одну вещь: начала координатных осей находятся в левом верхнем углу клиентской области, поэтому точка y=10 НИЖЕ, чем точка y=0.

case WM_PAINT
hdc = BeginPaint(hWnd, @ps)
GetClientRect(hWnd, @rect)
DrawText _
( hdc, _
"Win32 assembly is great and easy!", _
-1, _
@rect, _
DT_SINGLELINE or DT_CENTER or DT_VCENTER)
EndPaint(hWnd, @ps)

В ответ на сообщение WM_PAINT, вы вызываете BeginPaint, передавая ей хэндл окна, в котором вы хотите рисовать структуру типа PAINTSTRUCT в качестве параметров. После успешного вызова, функция возвращает хэндл контекста устройства. После вы вызываете GetClientRect, чтобы получить размеры клиентской
области. размеры возвращаются в переменной rect, которую вы передаете функции DrawText как один из параметров. Синтаксис DrawText'а таков:

function DrawText _
(byval hDc as HDC, _
byval lpString as LPCSTR, _
byval nCount as integer, _
byval lpRect as LPRECT, _
byval uFormat as UINT) as integer

DrawText = это высокоуровневая Api функция вывода текста. Она берет на себя такие вещи как перенос слов, центровка и т.п., так что вы можете сконцентрироваться на строке, которую вы хотите нарисовать. Ее низкоуровневый брат, TextOut, будет описан в следующем Уроке. DrawText подгоняет строку под прямоугольник.
Она использует выбранный в настоящее время фонт, цвет и фон для отрисовки текста. Слова переносятся так, чтобы строка влезла в границы прямоугольника.
DrawText возвращает высоту выводимого текста в единицах устройства, в нашем случае в пикселях. Давайте посмотрим на ее параметры:

• hdc - хэндл контекста устройства
• lpString - указатель на строку, которую вы хотите нарисовать в прямоугольнике. Строка должна заканчиваться NULL'ом, или же вам придется указывать ее длину
в следующем параметре, nCount.
• nCount - количество символов для вывода. Если строка заканчивается NULL'ом, nCount должен быть равен -1. В противоположном случае, nCount должен содержать
количество символов в строке.
• lpRect - указатель на прямоугольник (структура типа RECT), в котором вы хотите рисовать строку. Заметьте, что прямоугольник ограничен, то есть вы не можете нарисовать строку за его пределами.
• uFormat - значение, определяющее как строка отображается в прямоугольнике. Мы используем три значения, скомбинированные оператором "or":

• DT_SINGLELINE указывает, что текст будет располагаться в одну линию
• DT_CENTER центрирует текст по горизонтали
• DT_VCENTER центрирует тест по вертикали. Должен использоваться вместе с DT_SINGLELINE.

После того, как вы отрисовали клиентскую область, вы должны вызвать функцию EndPaint, чтобы освободить хэндл контекста устройства .

Вот и все. Мы можем указать главные идеи:

• Вы вызываете связку BeginPaint-EndPaint в ответ на сообщение WM_PAINT. Делайте все, что вам нужно с клиентской областью между вызовами этих двух функций.
• Если вы хотите перерисовать вашу клиентскую область в ответе на другие сообщения, у вас есть два выбора:

• Используйте связку GetDC-ReleaseDC и делайте отрисовку между вызовами этих функций.
• Вызовите Invalidaterect или UpdateWindow, чтобы Windows послала сообщение WM_PAINT вашему окну.

[C] Iczelion, пер. Aquila.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686