![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Yuriy |
|
|||
|
Unregistered |
Подскажите, PLS, как стандартной Form'e придать желаемые очертиния - к примеру сделать ее круглой или как вырезать ее по текстуре взятой из .BMP ?
|
|||
|
||||
| Song |
|
|||
![]() Sysman.ru ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1095 Регистрация: 2.6.2002 Репутация: 2 Всего: 4 |
Работа с регионами. Здесь не так просто объяснить. Поищите пример по слову SetWindowRgn
-------------------- Прежде чем сказать "Невозможно", подумай, прав ли ты |
|||
|
||||
| Spawn |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 278 Регистрация: 3.6.2002 Репутация: нет Всего: нет |
Вот!
Как создать непрямоугольную форму Немного о непрямоугольных формах... Кажется, весь мир сошёл с ума по таким формам; фидошные эхи пестрят вопросами на эту тему (наряду с вопросом как поместить иконку на панель задач (туда, где часы):) Есть ли сложности при создании непрямоугольной формы? Нет... Почти... Дело в том, что задать внешний вид формы можно, вызвав всего лишь одну функцию SetWindowsRgn. -------------------------------------------------------------------------------- SetWindowsRgn(Form1.Handle, True); // Второй параметр всегда равен True -------------------------------------------------------------------------------- Правда, перед этим потребуется создать подходящий регион. Большинство из тех, кто работает на Дельфи, не знают, что такое регион, главным образом потому, что эта штука не нашла своего отражения в VCL. Документация утверждает, что регион, это "прямоугольник, многоугольник, эллипс или комбинация двух или более фигур из приведённого списка". Регионы используются для "заливки, отсечения (то, что по английски называется clipping)" и других, не менее полезных операций. Для создания регионов существуют такие функции (с очевидным назначением), как CreateRectRgn, CreateEllipticRgn, CreatePolygonRgn и несколько других. Объединять регионы между собой можно при помощи функции CombineRgn. На этом теоретическая часть могла бы быть закончена, если бы не одно "но"... Это "но" я процитирую отдельно... Но ведь чаще всего непрямоугольную форму требуется построить на базе растровой картинки, задав для неё прозрачный цвет! Как быть? Это правда. Насколько мне известно, Windows не умеет этого делать, то есть в ней нет функции CreateBitmapRgn. Тем не менее, можно создавать и такие регионы. Для этого необходимо пробежаться по всей картинке сверху вниз, в каждой строчке найти непрозрачные области и сделать из них прямоугольные регионы (эти прямоугольники будут высотой в 1 пиксель). Затем мы объединяем эти регионы — и, вуаля — вот он, искомый регион! Готов поспорить, вы думаете, что это слишком сложно... -------------------------------------------------------------------------------- function BitmapToRegion(Bitmap: TBitmap; TransColor: TColor): HRGN; var X, Y: Integer; XStart: Integer; begin Result := 0; with Bitmap do for Y := 0 to Height - 1 do begin X := 0; while X < Width do begin // Пропускаем прозрачные точки while (X < Width) and (Canvas.Pixels[X, Y] = TransColor) do Inc(X); if X >= Width then Break; XStart := X; // Пропускаем непрозрачные точки while (X < Width) and (Canvas.Pixels[X, Y] <> TransColor) do Inc(X); // Создаём новый прямоугольный регион и добавляем его к // региону всей картинки if Result = 0 then Result := CreateRectRgn(XStart, Y, X, Y + 1) else CombineRgn(Result, Result, CreateRectRgn(XStart, Y, X, Y + 1), RGN_OR); end; end; end; Этот способ работает, конечно, небыстро, но он работает. Дабы облегчить вам труд понимания и набивания, я написал демонстрационную программу (5262), создающую непрямоугольную форму на базе любого файла Region.bmp, который лежит в её каталоге. По умолчанию с программой поставляется картинка, которую вы видите справа. Задать прозрачный цвет или выйти из программы можно через всплывающее меню (для самых понятливых объясняю: потребуется щёлкнуть на форме правой кнопкой мыши Помимо всего прочего, пример демонстрирует, как таскать форму левой кнопкой мыши (в смысле, не только за заголовок окна). Для этого нам потребуется создать свою собственную процедуру обработки события WM_LBUTTONDOWN, которое форма получает всякий раз, когда на ней нажимают левую кнопку мыши. Вот как эта процедура выглядит в описании формы: -------------------------------------------------------------------------------- type TFormMain = class(TForm) private { Private declarations } procedure WMLButtonDown(var Msg: TMessage); message WM_LBUTTONDOWN; public { Public declarations } end; -------------------------------------------------------------------------------- Строчка, которую нужно будет добавить, выделена красным цветом. В разделе реализации эта функция выглядит так: -------------------------------------------------------------------------------- procedure TFormMain.WMLButtonDown(var Msg: TMessage); begin Perform(WM_NCLBUTTONDOWN, HTCAPTION, Msg.LParam); end; -------------------------------------------------------------------------------- Форма посылает самой себе сообщение WM_NCLBUTTONDOWN с wParam равным HTCAPTION, то есть эмулирует ситуацию, когда пользователь нажимает левую кнопку мыши на заголовке формы. |
|||
|
||||
| Yuriy |
|
|||
|
Unregistered |
А подскажите еще одну вещь: что значит третий праметр в SetWindowRgn
bRedraw:LongBool ? И еще, если сделать так: MyRgn:=CreateRoundRectRgn(0,0,200,200,200,200); SetWindowRgn(Handle,MyRgn,True); А как можна потом востановить форму в нормальное состояние - прямоугольную изменяющую свои размеры ? |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Если не охото возиться на www.torry.net куча компонент для "делания" круглоугольных форм
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |