В SQL 2005 есть типа прогрессбара, появляющееся при выполнении длительной операции. Парни из TMS даже смастрячили Delphi/C++ компонент: http://www.tmssoftware.com/site/acp.asp TАdvCirculаrPrоgress. Можно ли сделать аналогичную анимацию на OpenGL? Да так еще, что бы использовать в своих проектах на Delphi? (опыт работы с OpenGL практически нулевой )
Подумалось, что это легче сделать на нем, чем на win api Мне навороты не нужны, просто что-то типа сегментного колеса, в котором бегает по кругу один сегмент другого цвета, типа показать, что процесс идет. И всё! Это можно реализовать десятком-двумя строк кода? Или это потребует дней для реализации?
Relic на флэше - 2 часа на блендере - 2 часа на вынь апи - 2 часа на директХ - 3 часа на огл - не знаю. не имел дела Booster а какие скорости от прелоадера требуются? на выньапи имхо короче будет
Дело в том, что окно, в котором надо сделать этот прогресс, создается без помощи VCL (т.е. компонентов). А как нарисовать сие при помощи только win api, я не знаю (с графикой не дружу ), подумалось, что можно заюзать OpenGL - несколько строчек и вуаля! Все готово
Хорошо. Сам круг (колесо) можно сделать так: Код (Text): quadObj := gluNewQuadric; gluQuadricDrawStyle(quadObj, GLU_FILL); gluDisk(quadObj, 2,3,10,10); // <-- gluDeleteQuadric(quadObj); Но как его сегментировать?
читаем в мсдн про GetDC PolyDraw (контур цветом текущего пера, заливка - текущей заливкой) выводить по SetTimer массивы точек вам полюбому готовить по WM_SIZE и хранить в SetWindowLong с GWL_USERDATA все очень даже просто
делаете массив массивов точек каждого сектора. скам 12 массивов по, для начала, 4 точки координаты точек рассчитываем в обработчике WM_SIZE как x1 = X0 + R*cos( (360/12)*n - (360/24) + da) y1 = Y0 + R*sin( (360/12)*n - (360/24) + da) x2 = X0 + R*cos( (360/12)*n + (360/24) - da) y2 = Y0 + R*sin( (360/12)*n + (360/24) - da) x3 = X0 + r*cos( (360/12)*n + (360/24) - da) y3 = Y0 + r*sin( (360/12)*n + (360/24) - da) x4 = X0 + r*cos( (360/12)*n - (360/24) + da) y4 = Y0 + r*sin( (360/12)*n - (360/24) + da) где n - порядковый номер сегмента (0..11), (X0, Y0) - центр прелоадера, R - наружный радиус, r - внутренний радиус, da - угол пробела между секторами, углы в sin|cos заданы в градусах (double) перед выводом сектора в WM_PAINT ставите нужную кисть по WM_TIMER перерисовываете контол. и GetDC не надо
OpenGL в основном годится для 3D. Рисуется параллелепипед. Далее вращаем систему координат, рисуем следующий, с так далее по окружности рисуются все фигуры. По таймеру пусть меняют цвета. Примеры в сети есть , рисования кубиков в OpenGL. Вот так - гуглим и читаем книжки по графике.
_basmp_ Забыли про 5-ю точку, замыкающую Но как-то некрасиво это выглядит: Промежуток между секторами получается не равномерным (увеличивается от центра) и скруглить бы еще сами сектора. Только как? Вот тестовый код на Delphi: Код (Text): procedure TForm5.Button3Click(Sender: TObject); var n: integer; a_pt: array[0..119] of integer; a_t: array[0..59] of byte; begin // рисуем на панели H := GetDC(Panel1.Handle); for n := 0 to 11 do begin a_pt[10*n] := X0 + Floor(Ro*cos( DegToRad((360/12)*n - (360/24) + da))); a_pt[10*n+1] := Y0 + Floor(Ro*sin( DegToRad((360/12)*n - (360/24) + da))); a_t[5*n] := PT_MOVETO; a_pt[10*n+2] := X0 + Floor(Ro*cos( DegToRad((360/12)*n + (360/24) - da))); a_pt[10*n+3] := Y0 + Floor(Ro*sin( DegToRad((360/12)*n + (360/24) - da))); a_t[5*n+1] := PT_LINETO; a_pt[10*n+4] := X0 + Floor(ri*cos( DegToRad((360/12)*n + (360/24) - da))); a_pt[10*n+5] := Y0 + Floor(ri*sin( DegToRad((360/12)*n + (360/24) - da))); a_t[5*n+2] := PT_LINETO; a_pt[10*n+6] := X0 + Floor(ri*cos( DegToRad((360/12)*n - (360/24) + da))); a_pt[10*n+7] := Y0 + Floor(ri*sin( DegToRad((360/12)*n - (360/24) + da))); a_t[5*n+3] := PT_LINETO; a_pt[10*n+8] := a_pt[10*n]; a_pt[10*n+9] := a_pt[10*n+1]; a_t[5*n+4] := PT_LINETO; end; PolyDraw(H, a_pt, a_t, 60); ReleaseDC(Panel1.Handle, H); end;
Relic сделайте промежуток побольше, а высоту сектора поменьше. или разные углы. или фиксированое смещение скруглить - просто. добавьте еще по нескольку точек сверху и снизу на промежуточные углы я вобщем то не знаю делфей, но как округляет floor? отбрасывает дробную? и чтото мне подсказывает, что разумнее сразу все писать в радианах вместо DegToRad, те вместо DegToRad((360/12)*n + (360/24) - da)) ---> (Pi*(double)n + Pi/2.0)/12.0 - (double)da а лучше все константы вычислить заранее, тк делфи