![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перекрыл GetClientRect, отрисовывается не весь компонент [D7, WinXP]
Vasiliy © (2006-11-14 21:51:00)В наследнике TCustomControl перекрыл метод GetClientRect для того, чтобы компоненты располагающиеся на нем занимали только отведенную клиентскую область.
Всё хорошо, только компонент перестал отрисовываться снизу и справа от клиентской области, тоесть Canvas.ClipRect при отрисовке имеет размер меньше чем область которую нужно отрисовывать.
Как с этим бороться?
Vasiliy (2006-11-18 15:27:00) [1]Рзобрался ...
Определил вот такой обработчик:
procedure TavpGraphForm.WMNCPaint(var Message: TMessage);
Var ACanvas: TCanvas;
begin
inherited;
ACanvas := TCanvas.Create;
try
ACanvas.Handle := GetWindowDC(Handle);
NCPaint(ACanvas);
finally
ReleaseDC(Handle, ACanvas.Handle);
ACanvas.Free;
end;
end;
Где NCPaint бывший метод Paint.
Всё работает, только теперь проблемы с WM_MouseMove, неправильные координаты X и Y получаются :)
Будем дальше разбираться ....
DrPassСпасибо!
Vasiliy (2006-11-18 14:36:00) [2]
> DrPass © (18.11.06 13:53) [5]
А примера отрисовки за пределами клиентской области в WM_NCPaint нет случайно?
DrPass (2006-11-18 13:53:00) [3]
> Vasiliy (18.11.06 11:48) [4]
Да нет, все верно. Смотря только где ты надумал рисовать свою рамку. Теперь, поскольку у тебя она за пределами клиентской области, то и перерисовывать ее нужно в обработчике WM_NCPAINT
Vasiliy (2006-11-18 11:48:00) [4]
> отлавливать WM_NCCALCSIZE и в этом обработчике писать размеры
> клиентской области.
Сделал вот так:
procedure TavpGraphForm.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
with Message.CalcSize_Params^ do
begin
With rgrc[0] do
begin
Inc(Left, FLeftImage.Width); // Размер левой части рамки
Inc(Top, FLeftImage.Height); // Размер верхней части рамки
Dec(Right, FRightImage.Width); // Размер правой части рамки
Dec(Bottom, FBottomImage.Height); // Размер нижней части рамки
end;
end;
end;
Работает, только не так как надо :(
Теперь и моя рамка рисуется в уменьшенной области.
А нужно чтобы было так:
Рисую рамку и определяю клиентскую область для остальных компонентов, чтобы не вылазили на рамку.
Может мне не клиентскую область нужно изменять?
Чтото уже совсем запутался :(
Vasiliy (2006-11-15 08:20:00) [5]Удалено модератором
DrPass (2006-11-14 23:25:00) [6]
> В наследнике TCustomControl перекрыл метод GetClientRect
> для того, чтобы компоненты располагающиеся на нем занимали
> только отведенную клиентскую область
А ты не перекрывай GetClientRect. В Коране такого нет, где ты такую ересь нашел? Истинный воин джихада должен отлавливать WM_NCCALCSIZE и в этом обработчике писать размеры клиентской области. Только так он может пройти после смерти по мосту, который тоньше человеческого волоса и острее меча.
Ketmar (2006-11-14 22:23:00) [7]вот удивительно-то. я кусок вырезал, и на вырезаном не рисует...