Форум: "Основная";
Текущий архив: 2003.06.30;
Скачать: [xml.tar.bz2];
ВнизПодскажите можно ли создать окно произвольной формы? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c