Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.30;
Скачать: CL | DM;

Вниз

Подскажите можно ли создать окно произвольной формы?   Найти похожие ветки 

 
Tayfun   (2003-06-17 16:49) [0]

Можно ли с помощью BMP файла создать окно произвольной формы?


 
PaRL.   (2003-06-17 16:55) [1]

Нельзя. Но монжно покопаться в faq и посмотреть.


 
Spawn ©   (2003-06-17 17:31) [2]

Можно)


 
Spawn ©   (2003-06-17 17:35) [3]

Как создать непрямоугольную форму

Дело в том, что задать внешний вид формы можно, вызвав всего лишь одну функцию SetWindowsRgn.


--------------------------------------------------------------------------------
SetWindowsRgn(Form1.Handle, True);
--------------------------------------------------------------------------------

Документация утверждает, что регион, это "прямоугольник, многоугольник, эллипс или комбинация двух или более фигур из приведённого списка". Регионы используются для "заливки, отсечения (то, что по английски называется clipping)" и других, не менее полезных операций.

Для создания регионов существуют такие функции (с очевидным назначением), как CreateRectRgn, CreateEllipticRgn, CreatePolygonRgn и несколько других. Объединять регионы между собой можно при помощи функции CombineRgn.


--------------------------------------------------------------------------------
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;
Этот способ работает, конечно, небыстро, но он работает.


--------------------------------------------------------------------------------
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, то есть эмулирует ситуацию, когда пользователь нажимает левую кнопку мыши на заголовке формы.


 
Spawn ©   (2003-06-17 18:30) [4]

Точнее говоря SetWindowRgn вызывается так:
SetWindowRgn(Handle,HRGN,True);



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

Текущий архив: 2003.06.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
3-97516
alxx
2003-06-04 15:30
2003.06.30
Связанные MS SQL Сервера.


3-97542
Valet
2003-06-06 16:07
2003.06.30
При попытке Refresh таблицы получаю ошибку.


14-97837
Dr. Death
2003-06-11 00:32
2003.06.30
RUS-OFFICE .ORG Project


14-97844
asafr
2003-06-10 16:15
2003.06.30
Общее направление в разделе


4-97926
lb0
2003-04-21 07:44
2003.06.30
WH_DEBUG. Обработка параметров этой callback функции.