Текущий архив: 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.46 MB
Время: 0.036 c