Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Режим отображения на канве наследника TShape 
:(
    Опции темы
Tero
Дата 27.5.2014, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.5.2014

Репутация: нет
Всего: нет



Как изменить режим отображения на канве наследника TShape?
Хочу установить режим MM_HIMETRIC. Перекрыл в наследнике TShape (TMetricShape) метод Paint. Для смены режима отображения на канве MetricShape применил функцию SetMapMode, установил начало координат в левый нижний угол MetricShape. Но, насколько я понимаю, фигура рисуется на канве формы. Так можно подумать, если добавить объект на форму, увеличить его размеры и поместить в левый нижний угол формы. Тогда в границах объекта появится маленькая фигура, уменьшившуяся в соответствии с разрешением экрана и переходом от координам в пикселях к координатам в 0.01 мм.
Как добиться того, чтобы фигура находилась на канве MetricShape?
Код

unit uMetricShape;

interface

uses
  SysUtils, Classes, Controls, ExtCtrls, Windows;

type
  TMetricShape = class(TShape)
  private
    { Private declarations }
  protected
    { Protected declarations }
    procedure Paint; override;
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyComponents', [TMetricShape]);
end;

procedure TMetricShape.Paint;
var
  X, Y, W, H, S: Integer;
begin
  with Canvas do
  begin
{новый режим отобображения MM_HIMETRIC (0.001 м)}
    SetMapMode(handle,MM_HIMETRIC);
{установка начала координат в левый нижний угол}    
    SetViewPortOrgEx(Handle, 0, Self.Height, nil);
    Pen := Self.Pen;
    Brush := Self.Brush;
    X := Pen.Width div 2;
    Y := X;
    W := Width - Pen.Width + 1;
    H := Height - Pen.Width + 1;
    if Pen.Width = 0 then
    begin
      Dec(W);
      Dec(H);
    end;
    if W < H then S := W else S := H;
    if Self.Shape in [stSquare, stRoundSquare, stCircle] then
    begin
      Inc(X, (W - S) div 2);
      Inc(Y, (H - S) div 2);
      W := S;
      H := S;
    end;
    case Self.Shape of
      stRectangle, stSquare:
        Rectangle(X, Y, X + W, Y + H);
      stRoundRect, stRoundSquare:
        RoundRect(X, Y, X + W, Y + H, S div 4, S div 4);
      stCircle, stEllipse:
        Ellipse(X, Y, X + W, Y + H);
    end;

  end;
end;

end.

Вот MetricShape на форме
http://s1.ipicture.ru/uploads/20140527/thumb/szup4WWu.bmp

Буду весьма признателен всем откликнувшимся)

Это сообщение отредактировал(а) Tero - 28.5.2014, 10:57
PM MAIL   Вверх
Illusion Dolphin
Дата 28.5.2014, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

Как добиться того, чтобы фигура находилась на канве MetricShape?

Цитата

TMetricShape = class(TShape)

У Shape нет канфы и у наследника нету, значит никак. Это не оконный компонент, а раз нет окна то и канфу не к чему приделывать. 
И картинку ничего не понятно - залейте jpeg/png и нормальным размером - может что понятнее будет.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Tero
Дата 29.5.2014, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.5.2014

Репутация: нет
Всего: нет



Цитата

У Shape нет канфы и у наследника нету, значит никак. Это не оконный компонент, а раз нет окна то и канфу не к чему приделывать.

Но канва есть у предка TShape:
Код

  TGraphicControl = class(TControl)
  private
    FCanvas: TCanvas;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint; virtual;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

Или я что-то не понимаю?
Вот картинка:
http://s1.ipicture.ru/uploads/20140529/s64Rq2M1.jpg
Фигура появилась в поле MetricShape1 в тот момент, когда я переместил объект в левый нижний угол формы. Размеры фигуры малы из-за смены режима отображения с MM_TEXT на MM_HIMETRIC. Так как в MM_TEXT размеры и координаты вводятся в количестве точек и в 1 мм можно уместить около 2.5 точек, а в новом режиме размеры вводятся в 0.01 мм.
Ф
PM MAIL   Вверх
PointerToNil
Дата 29.5.2014, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



Цитата(Tero @  27.5.2014,  07:21 Найти цитируемый пост)
Как изменить режим отображения на канве наследника TShape?
ты это уже успешно делаешь
Цитата(Illusion Dolphin)
У Shape нет канфы
вообще-то есть, см. Controls.TGraphicControl.Create
Цитата
Как добиться того, чтобы фигура находилась на канве MetricShape?
фигура рисуется не на канве, а на DC (DeviceContext), который Windows передает в сообщении WM_PAINT окну формы, а оно пересылает его своим GraphicControl-ам, с тем же DC, затем этот DC присваивается свойству Canvas.Handle, откуда его вытаскивает уже метод Paint
Canvas и DC - по сути совсем разные вещи (Canvas просто хранит Pen и Brush, но зачем-то имеет свойство Handle - видимо, для унификации с WindowControl, но оно все равно постоянно перезаписывается - в общем, наворотили борландовцы)

кстати, вместо всего этого твоего своего собственного рисования ты мог бы просто вызвать inherited сразу после SetMapMode и SetViewPortOrgEx - на выходе будет то же самое

в общем, наверное, нужно так: SetViewPortOrgEx(Handle, Left, Top+Height, nil);


Это сообщение отредактировал(а) PointerToNil - 29.5.2014, 08:47
PM MAIL   Вверх
Tero
Дата 29.5.2014, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.5.2014

Репутация: нет
Всего: нет



Цитата(PointerToNil @ 29.5.2014,  08:08)
...в общем, наверное, нужно так: SetViewPortOrgEx(Handle, Left, Top+Height, nil);

Тем не менее, в методе Paint TShape при рисовании фигур никакой привязки к левому верхнему углу не делается.
Добавил Left и Top, фигура начинает ездить в поле TMetricShape, если перемещать объект за верхний и правый край формы.

Это сообщение отредактировал(а) Tero - 29.5.2014, 09:22
PM MAIL   Вверх
PointerToNil
Дата 29.5.2014, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



и правда, TWinControl.PaintControls вызывает для каждого дочернего MoveWindowOrg(DC, Left, Top), а там делается SetWindowOrgEx

msdn говорит, что нужно делать либо SetWindowOrgEx, либо SetViewportOrgEx, но не оба сразу, а у тебя получается, что оба будут вызываться
так что, видимо, либо WindowOrg нужно сбрасывать в 0, либо как-то иначе это учитывать
смотри, как именно у тебя "фигура начинает ездить" и скорректируй это
может, нужно вместо Left и Top прибавлять их же, но пересчитанные в metric?
PM MAIL   Вверх
Tero
Дата 29.5.2014, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.5.2014

Репутация: нет
Всего: нет



Цитата(PointerToNil @ 29.5.2014,  10:49)
и правда, TWinControl.PaintControls вызывает для каждого дочернего MoveWindowOrg(DC, Left, Top), а там делается SetWindowOrgEx

msdn говорит, что нужно делать либо SetWindowOrgEx, либо SetViewportOrgEx, но не оба сразу, а у тебя получается, что оба будут вызываться
так что, видимо, либо WindowOrg нужно сбрасывать в 0, либо как-то иначе это учитывать
смотри, как именно у тебя "фигура начинает ездить" и скорректируй это
может, нужно вместо Left и Top прибавлять их же, но пересчитанные в metric?

Благодарю за помощь. Но, по-моему, в результате всех этих манипуляций фигура будет рисоваться в пределах границ MetricShape, но на форме.

Это сообщение отредактировал(а) Tero - 29.5.2014, 12:07
PM MAIL   Вверх
PointerToNil
Дата 29.5.2014, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 3
Всего: 6



ну так а где вы хотели её рисовать-то? у GraphicControl-а нет своего окна

если бы я делал подобие графического редактора, то рисовал бы всё на одной канве (как вариант, паинтбокса внутри скроллбокса), а если так нужны отдельные объекты - наследовал бы их просто от TObject ну или, для облегчения сериализации - TPersistent/TComponent
PM MAIL   Вверх
Tero
Дата 29.5.2014, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 27.5.2014

Репутация: нет
Всего: нет



Цитата(PointerToNil @ 29.5.2014,  12:44)
ну так а где вы хотели её рисовать-то? у GraphicControl-а нет своего окна

если бы я делал подобие графического редактора, то рисовал бы всё на одной канве (как вариант, паинтбокса внутри скроллбокса), а если так нужны отдельные объекты - наследовал бы их просто от TObject ну или, для облегчения сериализации - TPersistent/TComponent

А где рисуются линии и фигуры в PaintBox? Он, как и Tshape, не является оконным компонетолм. И у них общий предок.

Это сообщение отредактировал(а) Tero - 29.5.2014, 19:00
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1226 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.