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

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

Перекрыл 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]

вот удивительно-то. я кусок вырезал, и на вырезаном не рисует...


Наверх

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