Главная страница
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.025 c
1-1100015551
Dema-X
2004-11-09 18:52
2004.11.21
}{афман и его адаптивный метод кодирования


1-1099664180
Cosinus
2004-11-05 17:16
2004.11.21
Runtime create PoupMemu Items... Не разберусь с OnDrawItem...


14-1099761724
default
2004-11-06 20:22
2004.11.21
Послепятничная задачка


9-1090517851
2_XBOCTA
2004-07-22 21:37
2004.11.21
Сценарий к квесту...


3-1098092071
Kerk
2004-10-18 13:34
2004.11.21
Значение первичного ключа