Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прозрачная область на форме [D5, WinXP]


Страницы:   1 2

Леший ©   (2005-04-23 16:30:00) 

Подскажите, как можно на форме сделать прозрачную область/области, или хотя бы "дыру" в форме, но чтобы она ловила события мыши?


Deka   (2005-05-06 09:59:00) [1]

Да! Совсем забыл сказать, что BorderStyle у Form1 надо поставить в bsToolWindow. Иначе придется подкорректировать смещения в процедуре копирования.


Deka   (2005-05-06 09:56:00) [2]

Ok, Леший, вот мой код...
Сперва сделай в дельфи новый проект, потом брось на форму TIMage, ну а дальше думаю разберешься...

procedure TForm1.FormCreate(Sender: TObject);
var
 ScreenDC: HDC;
begin
 TmpBmp:= TBitmap.Create;
 ScreenDC:= GetDC(0);
 try
   TmpBmp.Width:= GetSystemMetrics(SM_CXSCREEN);
   TmpBmp.Height:= GetSystemMetrics(SM_CYSCREEN);

   BitBlt(TmpBmp.Canvas.Handle, 0, 0, TmpBmp.Width, TmpBmp.Height, ScreenDC, 0, 0, SRCCOPY);
 finally
   ReleaseDC(0, ScreenDC);
 end;

 Image1.Picture.Bitmap.Width:= Image1.Width;
 Image1.Picture.Bitmap.Height:= Image1.Height;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 TmpBmp.Free;
end;

// Второй способ
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
const
 SC_DRAGMOVE: Longint = $F012;
begin
 if Button <> mbRight then
 begin
   ReleaseCapture;
   SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
 end;
end;

type
 PRect = ^TRect;

procedure TForm1.WMMoving(var M: TMessage);
begin
 Caption:= IntToStr(Form1.Left) + ' / ' + IntToStr(Form1.Top);
 // Теперь скопируем картинку
 BitBlt(Image1.Picture.Bitmap.Canvas.Handle, 0, 0, Image1.Width, Image1.Height,
        TmpBmp.Canvas.Handle,
        PRect(M.LParam)^.Left + GetSystemMetrics(SM_CXBORDER) + Image1.Left + 2,
        PRect(M.LParam)^.Top + 20 + Image1.Top + 1,
        SRCCOPY);
 Image1.Refresh;
end;

procedure TForm1.Image1Click(Sender: TObject);
begin
 ShowMessage('Это дырка обрабатывающая события...');
end;

P.S. Осталось пару проблем, но главное сделано ;)


GrayFace   (2005-05-05 16:47:00) [3]

Леший   (03.05.05 17:57) [26]
Пример полупрозрачного окна: http://www.grayface.chat.ru/trans.rar


Леший   (2005-05-05 15:35:00) [4]

У меня не выходит.


Deka   (2005-05-05 11:50:00) [5]

При перемещении. Даже быстром ;)


Леший   (2005-05-05 01:10:00) [6]

В смысле "в динамике"?


Deka   (2005-05-04 12:27:00) [7]

У меня пока не получилось отлавливать изменение экрана, но и особо этим не занимался. Думаю что надо просто отлавливать событие активации формы. Сейчас попробую. А так все работает. Все красиво и в динамике ;)


Леший   (2005-05-03 17:57:00) [8]

Немного  отсутствовал - праздники-с, с чем всех и поздравляю.

2 Deka

Все-то ничего, но не выходит у меня перерисовывать форму при перемещении, да и при восстановлении из панели задач после перетасовки окон фигня выходит, но об этом уже говорилось.


Deka   (2005-05-03 13:41:00) [9]

Немножко модифицировал - теперь стало получше.


Deka   (2005-04-30 18:52:00) [10]

Готово. Есть форма с прозрачной квадратной областью посередине, которая может реагировать на любые стандартные для TImage события. Работает. Есть шероховатости, но это не главное. А главное в том, что никаких регионов!


Deka   (2005-04-30 18:05:00) [11]

Щас попробую сделать простенький пример с квадратной дыркой... ;)


Deka   (2005-04-30 18:04:00) [12]

Да текста то нет. Тебе придется самому все накропать. А идея в [15]. Буду вопросы - спрашивай.


Леший   (2005-04-30 15:32:00) [13]

Отчего же, хочу. Высылай.


Deka   (2005-04-30 10:21:00) [14]

2 Леший
Так чего? Как я написал попробовать не хочешь?


Ученик   (2005-04-29 22:36:00) [15]

>Deka ©   (26.04.05 11:31) [15]
??????????


Леший   (2005-04-28 20:28:00) [16]

Да-то да, а как проблему решить?


Чапаев   (2005-04-28 12:10:00) [17]

> [16]
Ну, про wm_NCmousemove я ничего не говорил...

> дырка все равно не есть форма
Да.


Леший   (2005-04-28 02:36:00) [18]

2 Чапаев

Думаю целесообразнее при WM_NCMOUSEMOVE возвращать ввод системе. Однако, столкнудся с тем, что не могу захватить ввод, даже при прописывании SetCapture( ) в OnCreate. Видимо выходит что при комбинации регионов форма образуется их пересечением, т.е. дырка все равно не есть форма. Но тогда не ясно почему то что осталось формой не хочет ловить весь ввод.


Deka   (2005-04-26 11:31:00) [19]

А для чего нужна работа со всеми этими регионами?
Ученик, у тебя во время работы с окном рабочий стол меняется? Ну в смысле ты другие программы запускаешь? Если нет, то можно при старте скопировать рабочий стол в Bitmap, потом показать обычную прямоугольную форму на которой в TImage отрисовывать круг вырезанный из сохраненного в Bitmap рабочего стола. При перемещении из Bitmap вырезается и помещается в TImage круг с другими координатами. Получится "прозрачность". Будет видно рабочий стол, регионы будут не нужны и форма всегда получит события от мышки. Правда если открыть другое приложение (или другим способом изменить картинку на экране), то его в дырке видно не будет, пока не пересохранишь рабочий стол.
Вот такой вот вариант.


Чапаев   (2005-04-26 09:55:00) [20]

> Я правильно ловлю мысль?
Ахха. WM_MOUSEMOVE перехватывай.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо