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

Вниз

Перекрыл GetClientRect, отрисовывается не весь компонент   Найти похожие ветки 

 
Vasiliy   (2006-11-14 21:51) [0]

В наследнике TCustomControl перекрыл метод GetClientRect для того, чтобы компоненты располагающиеся на нем занимали только отведенную клиентскую область.
Всё хорошо, только компонент перестал отрисовываться снизу и справа от клиентской области, тоесть Canvas.ClipRect при отрисовке имеет размер меньше чем область которую нужно отрисовывать.

Как с этим бороться?


 
Ketmar ©   (2006-11-14 22:23) [1]

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


 
DrPass ©   (2006-11-14 23:25) [2]


> В наследнике TCustomControl перекрыл метод GetClientRect
> для того, чтобы компоненты располагающиеся на нем занимали
> только отведенную клиентскую область

А ты не перекрывай GetClientRect. В Коране такого нет, где ты такую ересь нашел? Истинный воин джихада должен отлавливать WM_NCCALCSIZE и в этом обработчике писать размеры клиентской области. Только так он может пройти после смерти по мосту, который тоньше человеческого волоса и острее меча.


 
Vasiliy   (2006-11-15 08:20) [3]

Удалено модератором


 
Vasiliy   (2006-11-18 11:48) [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;


Работает, только не так как надо :(
Теперь и моя рамка рисуется в уменьшенной области.

А нужно чтобы было так:
Рисую рамку и определяю клиентскую область для остальных компонентов, чтобы не вылазили на рамку.

Может мне не клиентскую область нужно изменять?
Чтото уже совсем запутался :(


 
DrPass ©   (2006-11-18 13:53) [5]


> Vasiliy   (18.11.06 11:48) [4]

Да нет, все верно. Смотря только где ты надумал рисовать свою рамку. Теперь, поскольку у тебя она за пределами клиентской области, то и перерисовывать ее нужно в обработчике WM_NCPAINT


 
Vasiliy   (2006-11-18 14:36) [6]


> DrPass ©   (18.11.06 13:53) [5]


А примера отрисовки за пределами клиентской области в WM_NCPaint  нет случайно?


 
Vasiliy   (2006-11-18 15:27) [7]

Рзобрался ...
Определил вот такой обработчик:

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 Спасибо!



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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
10-1125920390
Гость22
2005-09-05 15:39
2006.12.03
Как узнать, что конкретный документ Word уже открыт?


15-1163535845
sgTrA2_7605
2006-11-14 23:24
2006.12.03
работа с exe-файлом проекта Делфи


3-1159323045
Alex_AA
2006-09-27 06:10
2006.12.03
Проблема с отчетом в конструкторе Rave Report


2-1163360378
pavels777
2006-11-12 22:39
2006.12.03
Распознование Текста с сканера!


11-1140014372
Игорь Шевченко
2006-02-15 17:39
2006.12.03
К вопросу о замене System/SysInit в Delphi и обработке исключений