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

Вниз

Взять отрисовку полностью на себя   Найти похожие ветки 

 
BorisMor ©   (2005-04-25 18:31) [0]

Как взять отрисовку контрола полностью на себя ?

Интересует в первую очередь TScrollBar
Создал от него наследника и обрабатываю WM_PAINT.
Если стрелки по краям еще отрисовываю нормально, то запретить прорисовку самого бегунка не могу.

Бегунок стирает все мои художестава при перестаскивание.


 
alpet ©   (2005-04-25 18:38) [1]

1. Надо полностью заменить обработчики WM_PAINT, WM_NCPAINT, WM_ERASEBACKGROUND. Причем управление DefWindowProc потом передаваться не должно.
2. Код пожайлуста приведи.


 
BorisMor ©   (2005-04-25 18:55) [2]

Щас попробую.....
Вот основвной код:


procedure TgScrollBar.WMPaint(var Message: TWMPaint);
begin
 inherited;
 DoPaint;
end;
/////////////////////////////////////////////////////////////////

procedure TgScrollBar.DoPaint;
var
 R: TRect;
 Canvas: TCanvas;
begin
if (parent = nil) or (Canvas=nil) then exit;
GetWindowRect(Handle, R);

if Kind = sbHorizontal then
    begin
     FCanvas.Draw(0,0,butL);
     FCanvas.Draw(Width-wButS,0,butR);
    end else
if Kind = sbVertical then
    begin
     FCanvas.Draw(0,0,butT);
     FCanvas.Draw(0,Height-hButS,butB);
    end;
end;
......
в креэйте создаются всякие битмапы которые отрисовываются +

FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;

hButS := GetSystemMetrics(SM_CYVTHUMB);
wButS := GetSystemMetrics(SM_CXHTHUMB);



 
alpet ©   (2005-04-25 19:02) [3]

procedure TgScrollBar.WMPaint(var Message: TWMPaint);
begin
inherited;
DoPaint;
end;


Ключевое слово inherited. Его надо убрать.
Потом message.result надо устанавливать в 0, и производить валидацию прорисованного участка функцией ValidateRect. Исправь для начала это.


 
alpet ©   (2005-04-25 19:10) [4]

Вообще перерисовка этого элемента управления задача интересная. Для начала - если тебе не нужно рисовать все целиком попробуй обрабатывать сообщение WM_CTLCOLORSCROLLBAR. Можно задать любую кисть (цвет, растр), а отрисовку выполнит Windows.


 
BorisMor ©   (2005-04-25 19:20) [5]

alpet ©   (25.04.05 19:10) [4]
Уже делал. Но некрасиово получается.
Требуется что бы интерфейс польностью был графически, а тут "остатки" Windows виднеются. Да и проклятый бегунок серый :)


 
BorisMor ©   (2005-04-25 19:25) [6]

alpet ©   (25.04.05 19:02) [3]

До того какк постить ветку убирал inherited. Но без него все остальные контролы не прорисовываются... Вернул обратно.

Сейчас добавил в обрабтку
WM_ERASEBKGND
WM_NCPAINT
WM_PAINT

DoPaint;
ValidateRect(Handle, nil);
Message.Result:=0;

к сожелению когда тоскаешь мышкой ползунок результат тот же.


 
MBo ©   (2005-04-25 19:52) [7]

Может, стоит взять с torry какой-либо саморисованный скроллбар и покопаться в коде?


 
BorisMor ©   (2005-04-25 20:31) [8]

Уже брал и смотрел.
Все что нашел, оказалось наследниками от TGraphControl. Т.е. фактически люди создают все заново.
А хочется отнаследовать TScrollBar что бы быстро потом "прикручивать" к другим стандартным контролам.


 
mgcr ©   (2005-04-26 10:43) [9]

alpet ©   (25.04.05 19:02) [3]


> Ключевое слово inherited. Его надо убрать.


Это еще почему ?


> Потом message.result надо устанавливать в 0, и производить
> валидацию прорисованного участка функцией ValidateRect.
> Исправь для начала это.


А что будет, если message.result не равен 0 ?


 
alpet ©   (2005-04-26 11:01) [10]

Переопредели метод не WMPaint, а PaintWindow. Первый заказывает отрисовку дочерних элементов, тогда как второй только самого компонента.



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
3-1115283652
Phenix2005
2005-05-05 13:00
2005.06.14
Доступ к серверу Interbase с нескольких клиентов


3-1115461034
new_one
2005-05-07 14:17
2005.06.14
Index is out of date


1-1116836985
P.N.P.
2005-05-23 12:29
2005.06.14
Приведение типов


14-1116828613
palva
2005-05-23 10:10
2005.06.14
Программисты хулиганят не только на форумах


14-1117126429
Uncle Archi
2005-05-26 20:53
2005.06.14
Глюк в МФ 1.2