Здравствуйте, поробовал переделать программу из руководства по программированию без корректной реакции на изменение размеров окна, но на экран ничего не выводится: он даже не очищается в заданный цвет. В чем может быть проблема?
Вот исходный код из книжки ( листинг 2-5):
#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);glVertex2f((x1),(y1));glVertex2f((x2),(y2));glEnd();
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
//Черный цвет для всех линий
glColor3f(0.0,0.0,0.0);
glEnable(GL_LINE_STIPPLE);
//В первом ряду три линии с разными шаблонами
glLineWidth(1.0);
glLineStipple(1,0x0101); //Пунктирная
drawOneLine(50.0,125.0,150.0,125.0);
glLineStipple(1,0x00FF); //Штриховая
drawOneLine(150.0,125.0,250.0,125.0);
glLineStipple(1,0x1C47); //Штрих-пунктирная
drawOneLine(250.0,125.0,350.0,125.0);
//Во втором ряду три толстые линии с аналогичными шаблонами
glLineWidth(5.0);
glLineStipple(1,0x0101); //Пунктирная
drawOneLine(50.0,100.0,150.0,100.0);
glLineStipple(1,0x00FF); //Штриховая
drawOneLine(150.0,100.0,250.0,100.0);
glLineStipple(1,0x1C47); //Штрих-пунктирная
drawOneLine(250.0,100.0,350.0,100.0);
//В третьем ряду шесть штрих-пунктирных линий, объединенных в ломаную
glLineWidth(1.0);
glLineStipple(1,0x1C47); //Штрих-пунктирная
glBegin(GL_LINE_STRIP);
for (i=0;i<7;i++)
glVertex2f(50.0+((GLfloat)i*50.0),75.0);
glEnd();
//В четвертом ряду шесть независимых линий того же шаблона
for (i=0;i<6;i++)
{
drawOneLine(50.0+((GLfloat)i*50.0),50.0,50.0+((GLfloat)(i+1)*50.0),50.0);
}
//В пятом ряду 1 штрих-пунктирная линия с фактором повторения=5
glLineStipple(5,0x1c47);
drawOneLine(50.0,25.0,350.0,25.0);
glDisable(GL_LINE_STIPPLE);
glFlush();
}
void reshape(int w,int h)
{
glViewport(0,0,(GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,400.0,0.0,150.0);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,150);
glutInitWindowPosition(100,100);
glutCreateWindow("Line Stipple Patterns");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
Как переделал (WindowsFormApplication по аналогии уроков с сайта)
namespace _2_5_
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
AnT.InitializeContexts();
}
private void Form1_Load(object sender, EventArgs e)
{
// инициализация библиотеки GLUT
Glut.glutInit();
// инициализация режима окна
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);
// устанавливаем цвет очистки окна
Gl.glClearColor(255, 255, 255, 1);
// Gl.glShadeModel(Gl.GL_FLAT);
// устанавливаем порт вывода, основываясь на размерах элемента управления AnT
Gl.glViewport(0, 0, AnT.Width, AnT.Height);
// устанавливаем проекционную матрицу
Gl.glMatrixMode(Gl.GL_PROJECTION);
// очищаем ее
Gl.glLoadIdentity();
Glu.gluOrtho2D(0.0, AnT.Width, 0.0, AnT.Height);
timer1.Start();
}
private void drawOneLine(double x1, double y1,
double x2, double y2)
{
Gl.glBegin(Gl.GL_LINES);
Gl.glVertex2d(x1, y1);
Gl.glVertex2d(x2, y2);
Gl.glEnd();
}
private void Draw()
{
int i;
// Очищаем буфер цвета
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glColor3d(0.0, 0.0, 0.0);
Gl.glEnable(Gl.GL_LINE_STIPPLE);
Gl.glLineWidth((float)1.0);
Gl.glLineStipple(1, 0x0101);
drawOneLine(50.0, 125.0, 150.0, 125.0);
Gl.glLineStipple(1, 0x00FF); //Штриховая
drawOneLine(150.0, 125.0, 250.0, 125.0);
Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
drawOneLine(250.0, 125.0, 350.0, 125.0);
//Во втором ряду три толстые
// линии с аналогичными шаблонами
Gl.glLineWidth((float)5.0);
Gl.glLineStipple(1, 0x0101); //Пунктирная
drawOneLine(50.0, 100.0, 150.0, 100.0);
Gl.glLineStipple(1, 0x00FF); //Штриховая
drawOneLine(150.0, 100.0, 250.0, 100.0);
Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
drawOneLine(250.0, 100.0, 350.0, 100.0);
//В третьем ряду шесть штрих-пунктирных линий,
// объединенных в ломаную
Gl.glLineWidth((float)1.0);
Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
Gl.glBegin(Gl.GL_LINE_STRIP);
for (i = 0; i < 7; i++)
Gl.glVertex2d(50.0 + ((float)i * 50.0), 75.0);
Gl.glEnd();
Gl.glFlush();
AnT.Invalidate();
}
private void timer1_Tick(object sender, EventArgs e)
{
Draw();
}
}
}
Комментарии (5)
rss свернуть / развернутьсвернуть ветку
Чтобы решить проблему, надо сразу поставить в настройках таймера enabled — true.
Самое интересное, что ранее я никогда не встречался с этой проблемой, хотя в нескольких уроках таймер инициализировался именно в функции Form1_Load.
Надо будет почитать документацию по классу Timer. Мне кажется что проблема либо в том, что у меня всегда был enabled таймер (и я проглядел такую серьезную ошибку), либо дело в том, что до недавнего времени у меня стояла VS 2008 SP1, сейчас просто VS 2008 — и это баг.
свернуть ветку
свернуть ветку
Кстати, у меня проблема с таймером пока осталась актуальной. Надо поставить VS с SP1, что-то мне кажется тут собака зарыта :)
свернуть ветку