Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
ВнизВзять отрисовку полностью на себя Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.06.14;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c