Главная страница
    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.017 c
1-1120840895
A013B
2005-07-08 20:41
2005.07.25
Две формы.


4-1117192528
RedStranger
2005-05-27 15:15
2005.07.25
Как послать e-mail?


1-1120646620
Demidoff
2005-07-06 14:43
2005.07.25
Есть ли в Delphi компонент по работе с архивами?


1-1120728354
SergP.
2005-07-07 13:25
2005.07.25
Рекурсивное описание типов.


14-1119972717
Viktop
2005-06-28 19:31
2005.07.25
Установка JEDI VCL 3.0 в Delphi 2005





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский