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

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

Взять отрисовку полностью на себя [D6, Win95/98, Win2k, WinXP]


BorisMor ©   (2005-04-25 18:31:00) 

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

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

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


alpet   (2005-04-26 11:01:00) [1]

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


mgcr   (2005-04-26 10:43:00) [2]

alpet ©   (25.04.05 19:02) [3]


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


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


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


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


BorisMor   (2005-04-25 20:31:00) [3]

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


MBo   (2005-04-25 19:52:00) [4]

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


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

alpet ©   (25.04.05 19:02) [3]

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

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

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

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


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

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


alpet   (2005-04-25 19:10:00) [7]

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


alpet   (2005-04-25 19:02:00) [8]

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


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


BorisMor   (2005-04-25 18:55:00) [9]

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


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 18:38:00) [10]

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


Наверх

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