Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.011 c
14-1120391464
ArMellon
2005-07-03 15:51
2005.07.25
php


8-1111865107
seregka
2005-03-26 22:25
2005.07.25
TMemoryStream и bitmap


8-1111831947
Quattro
2005-03-26 13:12
2005.07.25
выезжающая картинка


14-1118829505
ANB
2005-06-15 13:58
2005.07.25
Зачем нужен DataSource ?


8-1111882439
Valera
2005-03-27 04:13
2005.07.25
DSPack не обрабатывает сообщение на включение заставки и питания





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский