Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Полосы прокрутки. MFC OpenGL

289
15 февраля 2005 года
Jeyson
207 / / 20.04.2000
Доброго вам времени суток. Опять вынужден обратиться за помощью. Приложение планирую типа CAD системы. Использую MFC и OpenGL. Дошел до момента, что потребовалось как-то перемещать изображение (в моем случае это всего лишь линия). Одним из способов как и в AutoCad'е являются полосы прокрутки. Добавил их в стиле окна (Приложение документ-вид, и стиль изменен в файле traceView.cpp если это конечно принципиально). Но не тут-то было. Полосы добавились, но висят как запружиненые, т.е. бегунок горизонтальной полосы - слева, вертикальной - вверху. Как с ними управиться? В Билдере было все гораздо проще. Т.е. мне нужно: задать максимальную (если не безконечную) длину перемещения полос, отслеживать позицию бегунка каждой из них, сдвигать его программно на любую позицию и т.д. как это сделать пока понятия не имею.
Сразу еще один момент: какие будут мысли преобразования координат? В OpenGL координата 0,0 находится в центре окна программы и изменяется от -1 до 1 как по вертикали так и по горизонтали и не зависит от размера окна. Координаты курсора окна отсчитываются от верхнего левого угла окна... вот... Подскажите плз... Исходник прикрепил. Посмотрите если не затруднит. Заранее благодарен.
279
15 февраля 2005 года
bave
456 / / 07.03.2004
Исходник ещё не посмотрел, так что возможно
не совсем правильно врубился что тебе надо.
Если я правильно понял, то тебе надо
сделать что-то вроде скролинга.
Ну я для этих целей вырезку использую (SCISSOR).
Как саму прокрутку организовать зависит что тебе
надо сделать, универсальный способ я виде у
NeHe, но нефига не врубился как он пашет,
поэтому когда надо стало делать прокрутку я
для себя свой способ придумал, вот:
(я выложу всю свою функцию DrawGLScene, а то что
нужно прокоментирую)

int BaveGUI:: DrawGLScene(GLvoid)
{
unsigned short dy = 0; //смещение для прокрутки
unsigned short num; //число строк.
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glLoadIdentity();
glTranslatef(0.0f, 0.0f, -6.0f);
glBindTexture(GL_TEXTURE_2D, TEX_ID(1));
glCallList(MODEL_ID(0));
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glColor3f(0.7f, 1.0f, 0.2f);
glPrint(40, 570, 0,"GUI Tools. v.0.10.0.1");
glPrint(40, 546, 0,"(C) 2005 Bave.");
num = gui_tools.GetNumExWin();
/*Не учитывается desktop поэтому num - 1, а loop + 1;*///
glPrint(30, 480, 0,
"Num of executing obj's = %d", num - 1);
gui_tools.GetExWinName();
//Дальше задаётся область вырезки.
glScissor(30, int(0.230416f*gdi_args.sheight), gdi_args.swidth - 450,
int(0.8897916f*gdi_args.sheight));
glEnable(GL_SCISSOR_TEST);//Разрешить вырезку.
for(int loop = gdi_args.scroll;loop < num;loop++)
{
if (strlen(gui_tools.ExWndList[loop].str) > 0)
{
glPrint(32, (460 - dy), 1, "%d %s", (loop +1), gui_tools.ExWndList[loop].str);
dy+=20;
}
else
{
glPrint(32, (460 - dy), 1,
"%d NoNamed Executing Object", (loop + 1));
dy+=20;
}
}
glDisable(GL_SCISSOR_TEST);//отключить вырезку

delete [] gui_tools.ExWndList;
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glColor3f(1.0f, 1.0f, 1.0f);
glBindTexture(GL_TEXTURE_2D, TEX_ID(2));
glCallList(MODEL_ID(1));
return TRUE;
}

Короче, весь смысл в том, что когда вырезка
включена, все что бы ты ты ни делал в
функции DrawGLScene, будет
проявлять себя только в пределах ограниченных
вырезкой.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог