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

Вниз

Как создать моргающий прямоугольник вокруг любого окна?   Найти похожие ветки 

 
Cosinus ©   (2005-05-31 16:47) [0]

Я опишу как это пытаюсь сделать я и какие проблеммы при этом вылезают. Может вообще не туда полез.
1) Ищу окно, получаю его Handle
2) Далее использую следующую процедуру...
procedure FrameWindow(wHnd: HWND);
var
 Rect: TRect;
 DC: hDC;
 OldPen, Pen: hPen;
 OldBrush, Brush: hBrush;
 X2, Y2: Integer;
begin
 GetWindowRect(wHnd, Rect);
 DC := GetWindowDC(wHnd);
 SetROP2(DC, R2_NOT);
 Pen := CreatePen(PS_InsideFrame, 4, 0);
 OldPen := SelectObject(DC, Pen);
 Brush := GetStockObject(Null_Brush);
 OldBrush := SelectObject(DC, Brush);
 X2 := Rect.Right - Rect.Left;
 Y2 := Rect.Bottom - Rect.Top;
 Rectangle(DC, 0, 0, X2, Y2);
 SelectObject(DC, OldBrush);
 SelectObject(DC, OldPen);
 ReleaseDC(wHnd, DC);
 DeleteObject(Pen);
end;

Все замечательно отрабатывает, но так как мне нужно не просто нарисовать прямоугольник, а поморгать им, то вызов этой процедуры я засовываю в цикл (сейчас точного кода под рукой нет, но что то вроде)

for i:=1 to 5 do
begin
 FrameWindow(wHnd);
 Sleep(150);
 InvalidateRect(wHnd,0,1); // здесь в параметрах не уверен - не помню как у меня
 Sleep(150);
end;


Не работает, потому что некоторые окна перирисовываются сами за меньший отрезок времени и получается чепуха.

Хотел временно запретить перерисовываться этому окну, исправив код на вот этот...

for i:=1 to 5 do
begin
 FrameWindow(wHnd);
 LockWindowUpdate(wHnd);
 Sleep(150);
 LockWindowUpdate(0);
 InvalidateRect(wHnd,0,1); // здесь в параметрах не уверен - не помню как у меня
 LockWindowUpdate(wHnd);
 Sleep(150);
 LockWindowUpdate(0);
end;


Не понравилось потому что...
а) вызывает нездоровое моргание
б) код по-моему избыточен, а как его поправить не знаю

Попробовал вместо LockWindowUpdate использовать PostMessage(wHnd, WM_SETREDRAW, 1, 0)
Результат вообще не понял. Как хочет так и моргает или же не моргает вовсе.

Может подскажите что-либо? Возможно вообще не так я все делаю, а если так, то что именно неправильно?


 
DVM ©   (2005-05-31 16:51) [1]

Делай DrawFocusRect и рисуй не на окне а прямо поверх всего.


 
Cosinus ©   (2005-05-31 16:59) [2]

Хм... Как вариант.
Смотреть где окно, если оно перекрывается, значит вытащить и поморгать. После чего можно обратно запихнуть (ну это по желанию:).

Спасибо.

Но все же интересно с запретом разобраться. Уже из принципа.



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

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

Наверх




Память: 0.47 MB
Время: 0.043 c
14-1119995888
Юсби
2005-06-29 01:58
2005.07.25
А можно ли к одному USB порту как нибудь два устройства подключит


14-1120210615
Rentgen
2005-07-01 13:36
2005.07.25
Длина кабеля LCD to IBM


1-1120733330
Proz2
2005-07-07 14:48
2005.07.25
Зависание формы


1-1120210030
ch_victor
2005-07-01 13:27
2005.07.25
проблема с компонентом cxGridPopupMenu


14-1119959626
DVM
2005-06-28 15:53
2005.07.25
Вопрос знатокам FreeBSD (Unix). Не работает PHP!