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

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

Перерисовка окна [D6, Win95/98, WinXP]


Alex870 ©   (2004-09-29 23:35:00) 

Здравствуйте!
Подскажите пожалуйста, как перерисовать неклиентскую часть окна, я пробую так:
var
Reg : HRGN;
Rect : TRect;
begin
GetWindowRect(Wnd,Rect); //Wnd- хэндл окна, которое я хочу перерисовать
Reg := CreateRectRgn(Rect.Left,Rect.Top,Rect.Right,Rect.Bottom);
SendMessage(Wnd,WM_NCPAINT,Reg,0);
end;

Всё это расположено у меня в статически подключенной библиотеке, однако если Wnd- хэндл окна моего приложения- то всё работает, а вот если окно не моё...
Проверял, что wnd и Reg в строке SendMessage(...) имеют правильные значения. Заранеие всем спасибо!


wicked   (2004-10-11 21:24:00) [1]


> Если кто предложит более грамотный способ буду ОЧЕНЬ благодарен!

см. [7] и [8]....


Alex870   (2004-10-11 19:44:00) [2]

Здравствуйте!
Нашел свой вопрос, спасибо за ответы! Решил его случайно так:
SendMessage(Window,wm_ncpaint,1,0) -перерисовывает некоторые типы окон (не все).
InvalidateRect(Window,nil,True) - перерисовывает только те окна, которые не удалось перерисовать первой строкой, пачему - нэзнаю :), но факт - две эти строки подряд перерисовывают неклиентскую часть любого окна, правда есть ещё небольшая трудность - когда неклиентские части двух или более окон совпадают, то перерисовку надо делать всем им, так как рисование на самом "глубоком" окне приводит к рисованию и на самом верхнем. Решил так - ищу все точки нарисованного, а потом ищу с территорией какого окна они совпадают, и их перерисовываю. Если кто предложит более грамотный способ буду ОЧЕНЬ благодарен! Спасибо.


Игорь Шевченко   (2004-10-04 14:54:00) [3]

hint: Стандартно сообщение WM_NCPAINT посылается из обработчика сообщения WM_PAINT в системе.


wicked   (2004-10-04 13:16:00) [4]

RedrawWindow, SetWindowPos с флагом SWP_FRAMECHANGED....
а прямо засылать PAINT сообщения не рекомендуется....


TUser   (2004-10-04 12:21:00) [5]

А если приложение не твое - то покажи, как ты узнаешь его Handle. Возможно, там ошибка.


KSergey   (2004-10-04 12:14:00) [6]

А может прямо заслать ему WM_NCPAINT?


Alex870   (2004-10-01 13:20:00) [7]

Спасибо, хоть кто-то ответил!Но InvalidateRect перерисовывает только часть (всю) клиентской области окна, а мне нужно перерисовать неклиентскую часть


KSergey   (2004-10-01 12:29:00) [8]

InvalidateRect


Alex870   (2004-10-01 12:21:00) [9]

Извиняюсь за неточность, вторую строку кода надо читать:
SendMessage(wnd,wm_ERASEBKGND,dc,0);
И ещё, уважаемые знатоки API, неужели никто никогда не посылал чужому окну WM_NCPAINT, или вы на VCL пишите :)?


Alex870   (2004-09-30 23:01:00) [10]

Дополнение.
Выяснил (с помощью Spyxx), что для перерисовки окну посылают
SendMessage(wnd,wm_ncpaint,1,0);
dc := GetWindowDC(Wnd);
SendMessage(Pwnd,wm_ERASEBKGND,dc,0);
PostMessage(wnd,wm_paint,0,0);
после применения сего кода выяснилось, что такая перерисовка действует только на главное окно и на его прямых наследников, а дальше нет, хотя SpyXX упрямо утверждает, что такая последовательность передается всем окнам.


Наверх

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