Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с регионами [D7, WinXP]


grol ©   (2005-11-13 18:58:00) 

Добрый вечер. Возник такой вопрос: По Formcreat'у отображаю на форме какой-нибудь регион. Без разницы какой, ну например эллипс, т.е. форма ввиде эллипса. Забыл сказать на форме кнопка есть. В ней код создания еще одного региона (прямоугольник, но только размерами меньше, чем у самой формы) для отображения на форме. Так вот когда скомпилил прогу форма стала ввиде эллипса, нажимаю на кнопку --> форма меняет свой вид, эллипс пропадает, а прямоугольник появляется . А необходимо, чтоб эллипс комбинировался с прямоугольником. А как это сделать я не знаю, точнее не знаю нужной процедуры. Подскажите пожалуйста как это сделать. Спасибо заранее.


MBo   (2005-11-15 12:55:00) [1]

>не нужно разве делитнуть rgn?
Нет. После SetWindowRgn регионом распоряжается система.

Это видно, если попробовать убрать строку rgn := CreateRectRgn(0,0,0,0) - GetWindowRgn вернет ошибку.


злобная танька   (2005-11-15 09:46:00) [2]


> MBo ©   (15.11.05 09:32) [7]

работает. тоись первоначально у формы никакого региона и нету вообще. фигня какая то.

вопрос по DeleteObject:
а между строками
SetWindowRgn(Handle,rgn,True);
и
rgn := CreateRectRgn(0,0,0,0);
не нужно разве делитнуть rgn?


MBo   (2005-11-15 09:32:00) [3]

>злобная танька
А так?

rgn := CreateRoundRectRgn(0,0,700,400,100,100);
SetWindowRgn(Handle,rgn,True);
rgn := CreateRectRgn(0,0,0,0);
regionType := GetWindowRgn(Handle, rgn);
if (regionType <> ERROR) then
  ShowMessage('rgn contains window region');
DeleteObject(rgn);


злобная танька   (2005-11-15 09:15:00) [4]

Вот пример из MSDN переведен в меру способностей:

procedure TForm1.Button1Click(Sender: TObject);
var
 regionType: Integer;
 rgn: HRGN;
begin
 rgn := CreateRectRgn(0,0,0,0);
 regionType := GetWindowRgn(Handle, rgn);
 if (regionType <> ERROR) then
   ShowMessage('rgn contains window region');
 DeleteObject(rgn);
end;


не работает!
что не так?


wicked   (2005-11-15 02:01:00) [5]

> Grol ©   (14.11.05 21:43) [4]

> :) Как нестранно, но я уже этой функцией пытался возвратить
> регион формы,  у меня почему-то не получается. Смотрел эта
> процедура вообще не изменяет ту переменную в которую я хочу
> сохранить регион формы. :(((
> Не знаю что делать...

как ни странно - читать msdn.... там всё черным по белому написано - GetWindowRgn достает из окна копию региона и помещает её в тот хендл региона, который ей должен подсунуть программист.... хендл тот программист и должен создать, например, создав пустой регион - CreateRectRgn(0, 0, 0, 0)..... т.о. переменных она не меняет, а вот данные, которые лежат в памяти GDI - да....
и пример там дан, краткий и понятный....

любите хелп - оно рулёз..... (цы) непомнюктотоместный


Grol   (2005-11-14 21:43:00) [6]

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


злобная танька   (2005-11-13 21:46:00) [7]

по логике вещей если есть SetWindowRgn то значит есть и GetWindowRgn!
попробуй вызови эту функцию.. Если получится - полученный регион комбайнь со своим прямоугольником и делай Set...


grol   (2005-11-13 21:15:00) [8]

Это понятно, что есть такая процедура комбинирования, а вот меня интересует, как к уже существующему региону, отображенному на форме, добавить еще один регион. Пример:
//в бутоне

var
rectrg:HRGN;
begin
rectrg:=createrectrgn(0,0,width,heigth); //регион формы
//потом комбинирую с прямоугольником, про который я говорил с самого
//начала с помощью CombineRgn и отображаю
setwindowrgn(handle,rectrg,true);
//то у меня отображается всего лишь прямоугольник,а эллипса уже нет,
//а мне это не нужно
...
end;

Почему так происходит я догадываюсь, т.к. когда я создаю RectRg регион формы, то он не сохраняет, изменения, которые уже были сделаны.


MBo   (2005-11-13 19:35:00) [9]

>А необходимо, чтоб эллипс комбинировался с прямоугольником.
CombineRgn


Наверх

Титульная страница Поиск, карта сайта Написать письмо