Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Вниз

Уменьшенная копия региона   Найти похожие ветки 

 
Дмитрий_05   (2005-09-11 17:28) [0]

У меня есть регион, как бы мне сделать уменьшенную его копию? Например на 20 пикселей меньше по ширине и высоте... Разбирался с ExtCreateRegion и XForm, что-то ничего не понял... Может ктонибудь подскажет?


 
Дмитрий_05   (2005-09-11 20:42) [1]

???


 
Дмитрий_05   (2005-09-12 18:21) [2]

У меня регион произвольной формы, т.е. ето не эллипс, не круг и т.д. Есть ли функция которая берет этот регион и немного уменьшает?


 
Джо ©   (2005-09-12 18:40) [3]

Так ты все еще не разобрался с XForm? В MSDN вроде все хорошо описано.
Ну, вот маленький пример, чтобы начать (проверку ошибок делай сам):

procedure TForm6.Button1Click(Sender: TObject);
var
 Rgn1,Rgn2: HRGN;
 Sz: Cardinal;
 RgnData: PRgnData;
 XForm: TXForm;
begin
 Rgn1 := CreateEllipticRgn(0,0,100,150);
 Image1.Canvas.Brush.Color := clBlue;
 PaintRgn(Image1.Canvas.Handle,Rgn1);

 // get data size for store region data
 Sz := GetRegionData(Rgn1,0,nil);
 GetMem(RgnData,Sz);
 try
   // get actual data
   GetRegionData(Rgn1,Sz,RgnData);
   // масштабируем
   XForm.eM11 := 0.5;
   XForm.eM22 := 0.5;
   Rgn2 := ExtCreateRegion(@XForm,Sz,RgnData^);
   // малюем получившийся регион
   Image1.Canvas.Brush.Color := clRed;
   PaintRgn(Image1.Canvas.Handle,Rgn2);

 finally
   FreeMem (RgnData);
 end;

 DeleteObject(Rgn1);
 DeleteObject(Rgn2);
end;


Масштабируем первоначальный регион в 0.5 раз по горизонтали и 0.5 по вертикали (члены eM11, eM22 структуры XFORM отвечают за scaling). По остальным типам преобразования (вращение и т.п.) смотри описание структуры XFORM в MSDN, там в табличном виде все хорошо расписано.


 
Джо ©   (2005-09-12 18:44) [4]


> Разбирался с ExtCreateRegion и XForm, что-то ничего не понял...

А что именно не понял, если не секрет?


 
Дмитрий_05   (2005-09-12 19:05) [5]

на английском все... а в английском я не очень силен... а можно сделать регион не "в" 0.5, а "на" 20 меньше?


 
Джо ©   (2005-09-12 19:16) [6]


>  [5] Дмитрий_05   (12.09.05 19:05)
> а можно сделать регион не "в" 0.5, а "на" 20 меньше?

Смотря что иметь под этим в виду.

> на английском все... а в английском я не очень силен...

Эта, учи, брат. Думаю, что слова scaling, rotation, offset выучить не сложно. А вообще-то, по сабжу, тут все сводится к афинным преобразованиям. Посмотри курс геометрии.


 
Дмитрий_05   (2005-09-12 19:22) [7]

размер )))


 
Дмитрий_05   (2005-09-12 19:22) [8]

высоту и ширину на 20 уменьшить )))


 
Джо ©   (2005-09-12 19:24) [9]

Тут тогда нужно определиться, что имееть в виду под "шириной и высотой" произвольного региона. Ширина и высота она, как-никак у прямоуголников только бывает.


 
Джо ©   (2005-09-12 19:27) [10]

Если иметь в виду ширину и высоту описывающего прямоугольника, то начинай "плясать" от функции GetRgnBox.


 
Дмитрий_05   (2005-09-12 23:37) [11]

Что-то не получается "плясать" ))) Функцией GetRgnBox мы узнаем прямоугольник описывающий регион, грубо говоря высоту и ширину... Я их и так знал... А как уменьшить высоту и ширину? Какойнибудь SetRgnBox функции я ненашел...


 
Джо ©   (2005-09-13 01:20) [12]


>  [11] Дмитрий_05   (12.09.05 23:37)

Как уменьшить регион в N раз, я написал в [3]. Вы, надеюсь, 3 класс школы закончили? ;) Ибо далее следуют сложнейшие математические выкладки, которые может понять только 4-классник:

X + M,
X - первоначальное значение,
M - число, на которое увеличивается X

мы должны найти некое N, удовлетворяющее условию
X*N = X+M.

Несложно увидеть, что
N = (X+M)/X.

Нужно, например, отрезок в 100 пикселей увеличить на 10 пикселей. Это будет то же самое, что отрезок в 100 пикселей увеличить в 1.1 раза((100+10)/100). Следовательно, следует подставить этот коэффициент в соответствующие поля структуры XFORM, отвечающие за scaling.
Не может быть, чтобы это было настолько сложно для понимания.


 
Дмитрий_05   (2005-09-13 05:46) [13]

Джо спасибо! ))) Я хотел так сделать, но почему-то думал что есть другой способ...)))



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.10.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.005 c
1-1126697212
kolos_rus
2005-09-14 15:26
2005.10.02
Как определить объект на котором установлен фокус?


1-1126095440
Дмитрий_05
2005-09-07 16:17
2005.10.02
Непонятки со свойством Anchors


1-1125990584
Гена
2005-09-06 11:09
2005.10.02
Отключение системного меню


1-1126516063
IfBeginThenEnd
2005-09-12 13:07
2005.10.02
Назначить главную форму в ран-тайме...


1-1126346249
kblc
2005-09-10 13:57
2005.10.02
Методы com





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский