Главная страница
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.47 MB
Время: 0.014 c
4-97932
Illusion
2003-04-27 13:57
2003.06.30
UpdateLayeredWindow


7-97898
Intell
2003-04-20 20:25
2003.06.30
Как создать ярлык для своего приложения?


1-97613
NailMan
2003-06-19 13:45
2003.06.30
Что лучше и быстрее


3-97556
Silla
2003-06-04 16:24
2003.06.30
Ado-Access


1-97663
MakNik
2003-06-17 11:57
2003.06.30
Инсталяция