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

Вниз

Перерисовка окна   Найти похожие ветки 

 
Alex870   (2004-09-29 23:35) [0]

Здравствуйте!
Подскажите пожалуйста, как перерисовать неклиентскую часть окна, я пробую так:
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(...) имеют правильные значения. Заранеие всем спасибо!


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

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


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

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


 
KSergey ©   (2004-10-01 12:29) [3]

InvalidateRect


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

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


 
KSergey ©   (2004-10-04 12:14) [5]

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


 
TUser ©   (2004-10-04 12:21) [6]

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


 
wicked ©   (2004-10-04 13:16) [7]

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


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

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


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

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


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


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

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



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

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

Наверх




Память: 0.49 MB
Время: 0.053 c
1-1099764695
MUHAMOR
2004-11-06 21:11
2004.11.21
AstonShell


4-1097249553
pirate
2004-10-08 19:32
2004.11.21
Необходимо получить список запущенных процессов.


1-1099984033
КиТаЯц
2004-11-09 10:07
2004.11.21
Excel + Delphi задание формата ячейкам


14-1099855294
Piter
2004-11-07 22:21
2004.11.21
А дайте простенькую программу на C#


1-1100072010
YuriS
2004-11-10 10:33
2004.11.21
Form