Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2008, 06:40   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию SetMapMode и прочая чертовщина

Люди, помогите! Пытаюсь без особого вникания в граф.подсистему венды
нарисовать рисунок на канве, который потом распечатать.

Итак, взял форму, на неё поклал TImage и кнопку. В обработчик нажатия кнопы пытался забить различные кнопы отрисовки, но так и не понял, каким образом работает и SetMapMode, и SetViewportOrgEx, и SetViewportExtEx и SetWindowExtEx....

После длительных экспериментов выяснилось, что какие-то признаки линий рисуются в режимах MM_ISOTROPIC и MM_ANISOTROPIC, значения, передаваемые в SetViewportOrgEx и прочие хоть как-то влияют
на результат вывода лишь в режимах MM_ISOTROPIC и MM_ANISOTROPIC

кое как удалось реализовать одну из проблем!
обработчик теперь таков:

Код:
begin
  SetMapMode(image.canvas.handle, MM_ISOTROPIC);
//   showmessage('привет');

  image.Canvas.MoveTo(0, 0);
  image.Canvas.LineTo(2000, 1000);
  image.Canvas.LineTo(2000, 2000);
end;
*********************************** *******************************
* так вот. РЕЗУЛЬТАТ ВЫВОДА теперь напрямую зависит от того, *
* закомментирована ли строка с выводом "привета", или нет! *
*********************************** *******************************

Когда showmessage('привет') выводится, вызов SetMapMode НЕ срабатывает, и линии рисуются такой длины (в две тыщи пикселей), что на экране лишь часть.

Когда showmessage закомментирован, по всей видимости, вызов
срабатывает (?) и на экране в углу какие-то точки.

Почему вывод сообщения вообще влияет на вывод в канву? Что вообще
может "перебивать" ShowMessage?

ps SetMapMode(image.canvas.handle, MM_ISOTROPIC) возвращает 1

Последний раз редактировалось rpy3uH; 29.09.2008 в 11:11.
AnTe вне форума Ответить с цитированием
Старый 29.09.2008, 09:31   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Смешно. По сути вы никогда не должны думать что компилятор или транслятор перепутали чтолибо ( ну если у вас конечно не дельфи 1 или еще меньше ). При вызове ShowMessage главный поток ( выполнение кода ) останавливается и ждем отклика от этот диалога. Сам лично не юзал никогда SetMapMode ( да собственно и зачем ? ). И такие вещи я лично предпочитаю рисовать в том же PaintBox в OnPaint
BOBAH13 вне форума Ответить с цитированием
Старый 29.09.2008, 11:23   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

2AnTe: а без SetMapMode никак не обойтись? вообще-то не рекомендуется применять к VCL компонентам API функции.
rpy3uH вне форума Ответить с цитированием
Старый 29.09.2008, 12:28   #4
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Вообще, изначально стояла задача сделать предпросмотр.

То есть, нужно начертить на листе формата А4 таблицу, строго соблюдая ширину/высоту колонок, в ней текст.

При разработке, нужно чтобы пользователь видел на лист экране, как это будет выводиться на печать. Масштабировать и всё такое.

Рисую через canvas.moveto, canvas.lineto, canvas.textout

Иного пути, как изменить координаты порта вывода и окна для вывода, не нашёл

не использовал SetMapMode, задав вручную:

Код:
begin 
  SetViewportOrgEx(image.canvas.handle, 0, 0, nil);
  SetViewportExtEx(image.canvas.handle, 100, 100, nil);
  SetWindowExtEx(image.canvas.handle, 1000, 100000, nil);

  image.Canvas.MoveTo(0, 0);
  image.Canvas.LineTo(200, 100);
  image.Canvas.LineTo(200, 200);
end;
Изменение параметров в SetViewportOrgEx влияет на координаты начала вывода, всё нормально. А в SetViewportExtEx и SetWindowExtEx - какие числа не подставляй: всё бестолку

Последний раз редактировалось rpy3uH; 30.09.2008 в 13:30.
AnTe вне форума Ответить с цитированием
Старый 02.10.2008, 14:08   #5
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Нашёл ответ.
1. Сразу же после посылки ЛЮБОГО сообщения ЛЮБОМУ VCL контролу
масштабирование при печати ричтекста перестает работать... Связано
это, похоже, с обработкой сообщений VCL средствами --- любые оконные
операции (в том числе, получение Handle окна) перестраховываются и
лочат канву. Открывается она только после обработки всего стека
сообщений, поэтому, предположительно, результатом посылки EM_SETZOOM
можно будет воспользоваться "при следующем нажатии кнопки".

Источник тут http://www.delphikingdom.com/asp/ans...IDAnswer=21049

Наверное, именно это и имелось в виду в советах мне здесь?

Ну а как же выводить предпросмотр без применения winapi к vcl?

В метафайл рисовать, а его растягивать?

Последний раз редактировалось AnTe; 02.10.2008 в 14:25.
AnTe вне форума Ответить с цитированием
Старый 02.10.2008, 20:55   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от AnTe Посмотреть сообщение
Наверное, именно это и имелось в виду в советах мне здесь?
ну да, что-то наподобие... я когда-то копался и понял что с VCL через Win API лучше не работать...
Цитата:
Сообщение от AnTe Посмотреть сообщение
Ну а как же выводить предпросмотр без применения winapi к vcl?
а может компоненты есть какие-нибудь?

Последний раз редактировалось rpy3uH; 02.10.2008 в 20:58.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск