Как сделать окно нестандартное формы (например круговое)? |
Здравствуйте, гость ( Вход | Регистрация )
Here You Can Support Our Work and .:LavTeaM:. Services |
Как сделать окно нестандартное формы (например круговое)? |
1.03.2003 - 07:19
Сообщение
#1
|
|
The Faithful one Группа: Пользователи Пользователь №: 31 Сообщений: 93 Регистрация: 28.02.2003 Из: Toril --> Forgotten Realms --> Waterdeep Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
Пожалуй, одним из самых распространенных вопросов
о программировании на Delphi сейчас является создане непрямоугольных форм. Сейчас мы попробуем рассмотреть, как это можно сделать... Это - не самая сложная проблема, а потому мы объединим ее еще с одной - перетаскиванием окна не только за заголовок (caption), но за любую точку формы. Итак, создаем обычный проект (New), и вносим туда слеующие изменения: 1. Проверяем юниты, использующиеся в проекте - там обязательно должны быть следующие: Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; 2. В раздел private необходимо добавить следующие строки: rgn : HRGN; //используется для задания региона, который будет занят формой. procedure WMNCHitTest(var Message : TWMNCHitTest); message WM_NCHITTEST; //используется при проверке - "Где сидит мышь" - для 2-ой части задания. 3. Дважды кликаем на форме, вызывая обработчик события (On Create). 4. Обрабатываем это событие (добавляем следующий код): rgn := CreateEllipticRgn(0, 0, Width, Height); SetWindowRgn(Handle, rgn, True); end; //Мы выделили программе ее круг, т.е. указали вид окна. // Вместо Width и Height МОЖНО (но не обязательно) использовать свои числа... 5. Задаем новую процедуру - чтобы перемещать окно за любую точку формы: Т.к. процедура наполовину самопальная , то приведу весь ее код: procedure TForm1.WMNCHitTest(var Message : TWMNCHitTest); begin if PtInRegion(rgn, Message.XPos, Message.YPos) then Message.Result := HTCAPTION else Message.Result := HTNOWHERE; end; 6. Для того, чтобы после закрытия программы весь регион отошел обратно к Windows, при закрытии программы его необходимо уничтожить- Кликаем на форме и в ObjecInspector'е выбираем процедуру - OnDestroy. 7. Добавляем в эту процедуру одну строчку: DeleteObject(rgn); |
|
|
Текстовая версия | Сейчас: 28.03.2024 - 22:49 |