![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взять отрисовку полностью на себя [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. Код пожайлуста приведи.