без него можно не запускать.
Тем не менее, - работает.
Я конечно понимаю - это смешное требование для чертежа из нескольких линий, но мелкософтный драйвер тормозит очень жестко((, хотя в программе всё считается на CPU, OGL только рисует уже посчитанные линии.
Просто, у меня есть подозрение, что возможно сделать быстрее. Может, я ошибаюсь.
на то он и пользователь - его не предскажешь. и не факт что 1 объект, можно все сразу.
Ну, если пользователь не болен и это не бета-тестер...

Он будет действовать по определённому сценарию. Почти всегда.
Поэтому, думаю, что нельзя говорить однозначно, про непредсказуемое поведение пользователя.
модель статическая до поры до времени, всё спихнуть на ГПУ не выйдет полюбому, наоборот функции ГПУ потихоньку переезжают на ЦПУ, изза всяких мелких ограничений.
Ээээ... А всякие шейдеры

и т.д и т.п., если на будущее? Может, мелкие ограничения возможно обойти?
конечно VBO - современней и производительней, но его реализация для данной задачи не проста, пока glBegin не является "узким местом".
Так это понятно. Просто на будущее, я так думаю, единственное на что возможно ориентироваться - это VBO.
В идеале хотелось бы получить систему работающую вообще без OpenGL
Почему? И что используя?
Последние стандарты - OpenGL для игрушек. О сапр (насколько знаю GL изначально был для САПР и серъезной визуализации) забыли. например GL_SELECT на ATI вообще "работает" мягко сказать - очень медленно.
Да, похоже.

Хотя, их dx поджимает. На хомячковой "системе".
А учитывая то, что большинство игр на ней, если не будет соответствовать, OpenGL просто вытеснят, вообще.
А ATI - это г., по-моему. Выбор, кстати, тоже убрали в OpenGL 3.
Скролбары - возможно надо, но толку от них будет мало, модель в размерах не ограничена, если только по габаритам.
Ну, обычные скроллбары, как вариант. Ведь возможно и "линейку" рисованную сделать. Чтобы было понятно где находишься и не теряться.
Кстати правый даблклик масштабирует и сдвигает модель чтобы было всё видно на экране.
Кстати, только хотел вспомнить про масштабирование в 1 и центрирование.

Почему-то у меня средний даблклик...
Но мы ушли от темы, по прежнему интересует как отключить WM_ERASEBACKGROUND. с ним перерисовки инициализированные Windows жутко мелькают.
Я уж не помню ни фига. TPanel, вроде, всё-таки не стандартный контрол... %-|
Покопался в LCL.
1. Есть защищённое поле: FWinControlFlags. Оно доступно из любого оконного контрола.
Тип:
- Код: Выделить всё
TWinControlFlag = (
wcfClientRectNeedsUpdate,
wcfColorChanged,
wcfFontChanged, // Set if font was changed before handle creation
wcfReAlignNeeded,
wcfAligningControls,
wcfEraseBackground,
wcfCreatingHandle, // Set while constructing the handle of this control
wcfInitializing, // Set while initializing during handle creation
wcfCreatingChildHandles, // Set while constructing the handles of the childs
wcfHandleVisible
);
TWinControlFlags = set of TWinControlFlag;
Очевидно: Exclude(FWinControlFlags, wcfEraseBackground);
Ещё, не самые лучшие, пожалуй, варианты (кто-то из наследников или предков, в особых случаях, теоретически может использовать эти методы напрямую) - перегрузить, как вы и сделали:
- Код: Выделить всё
procedure TWinControl.WMEraseBkgnd(var Message: TLMEraseBkgnd);
procedure TWinControl.EraseBackground(DC: HDC);
Зато, их перегрузка будет всегда работать, в отличие от FWinControlFlags. Со всеми вытекающими.
Насчёт "вытекающих", посмотрите на код WMPaint (я, не относящееся к делу, убрал), всё примерно понятно:
- Код: Выделить всё
procedure TWinControl.WMPaint(var Msg: TLMPaint);
var
DC,MemDC: HDC;
PS : TPaintStruct;
ClientBoundRect: TRect;
begin
if (Msg.DC <> 0) then
begin
if not (csCustomPaint in ControlState) and (ControlCount = 0) then
begin
DefaultHandler(Msg);
end
else
PaintHandler(Msg);
end
else begin
// NOTE: not every interface uses this part
try
// Fetch a DC of the whole Handle (including client area)
DC := BeginPaint(Handle, PS);
if DC=0 then exit;
// erase background
Include(FWinControlFlags,wcfEraseBackground);
Perform(LM_ERASEBKGND, WParam(MemDC), 0);
Exclude(FWinControlFlags,wcfEraseBackground);
// create a paint message to paint the child controls.
// WMPaint expects the DC origin to be equal to the client origin of its
// parent
// -> Move the DC Origin to the client origin
if not GetClientBounds(Handle,ClientBoundRect) then exit;
MoveWindowOrgEx(MemDC,ClientBoundRect.Left,ClientBoundRect.Top);
// handle the paint message
Msg.DC := MemDC;
Perform(LM_PAINT, WParam(MemDC), 0);
Msg.DC := 0;
// restore the DC origin
MoveWindowOrgEx(MemDC,-ClientBoundRect.Left,-ClientBoundRect.Top);
EndPaint(Handle, PS);
finally
Exclude(FWinControlFlags,wcfEraseBackground);
end;
end;
end;
Зачем - не очень понятно. Надо просто проверить на Linux и подобном.
2. Для windaw$ посмотрите на стиль окна CS_OWNDC, если он у вас не устанавливается при создании.
Вроде не мелькает. Под linux`ом есть аналог WM_ERASEBACKGROUND или это winonly?
Вряд ли он, в таком виде, он есть под Linux. Точнее, под X. Не знаю. Но, в lazarus, он, скорее всего, - кросс.
P.S.:
А PDF вы чем делали?
Мануал смотрится, мне тоже надо будет делать тут, а с PDF я дела ни разу не имел.
Понравилось. И, тогда придётся искать чем в в-де возможно создать PDF.
Добавлено спустя 58 минут 22 секунды:Ёлки-палки, ну я и отстал. Уже есть OpenGL 4.0.
