الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لماذا لايظهر التغيير الا بعد تغيير حجم النافذة

بدأه SuperNova57 في 24 أبريل 2012 · 4 رد · 946 مشاهدة · في OpenGL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته

لدي هذا الكود الذي يقوم بمهام بسيطة مثل : اذا ضغطنا على حرف r يتحول لون المثلث المرسوم للون الاحمر

لكن هذا التغيير لا يظهر بشكل مباشر بعد الضغط حيث اني احتاج الى تغيير حجم النافذة يدويا وقت التشغيل حتى يظهر اللون الجديد

فما المشكلة ؟

ها هو الكود:

//#include "stdafx.h"
#include <iostream.h>
 #include "gl/glut.h"

float r, g, b = 1; 
 void display()
 {
 glClear(GL_COLOR_BUFFER_BIT);

 glBegin(GL_TRIANGLES);
 glColor3f(r,g,b);
 glVertex2f(-0.5, -0.5);
 glVertex2f(-0.5, 0.5);
 glVertex2f(0.5, 0.5);
 glVertex2f(0.5, -0.5);
 glEnd();
 glFlush();
 glutSwapBuffers();
}
 void mykeyboard(unsigned char k, int 

mouseX, int mouseY)
 {
	 switch (k) 
    {

case 'R':
    case 'r':
      r= 1, g=0, b=0;
      break;
	case 'G':
		case 'g':
	r= 0, g=1, b=0;
		break;
		case 'B':
			case 'b':
	r= 0, g=0, b=1;
		break;
		case 27:
		exit(0);
		break; 
    //default: /* Otherwise keep going */
      //return;
    }
}

 void myspecial (int key, int x, int y)
 {
	 if (key=GLUT_KEY_F9) 
glutFullScreen();

 }

 void mymouse (int button, int state, int 

x, int y)
 {
	 if (button== GLUT_LEFT_BUTTON && 

state== GLUT_DOWN) 
cout<<x<<" "<<y<<endl;

 }

 void ProcessPMotion ( int x, int y)
 {
	 glClearColor(0.9, 0.9, 1.0,1.0);

 }
 void processMotion ( int x, int y)
 {
	 glClearColor(0.0, 0.0, 0.0,1.0);

 }

 int main(int argc, char** argv)
{
 glutInit(&argc,argv);
 glutInitDisplayMode(GLUT_DOUBLE);
 glutCreateWindow(" First OGL Program");
 glutDisplayFunc(display);
 glutKeyboardFunc(mykeyboard);
 glutSpecialFunc(myspecial); 
 glutPassiveMotionFunc(ProcessPMotion);
 glutMotionFunc(processMotion);
 glutMainLoop();
 return 0;
}
#2

السلام عليكم..

تحتاج أخي إلى جعل البرنامج يعيد عرض المشهد في كل حدث سواءا كان حدث النقر على الفأرة أو على لوحة المفاتيح أو عصا الألعاب أو ما شابه ذلك..

لهذا قم بإضافة :

glutPostRedisplay();

عند نهاية الدالة

void mykeyboard(unsigned char k, int

mouseX, int mouseY)

{

switch (k)

{

case 'R':

case 'r':

r= 1, g=0, b=0;

break;

case 'G':

case 'g':

r= 0, g=1, b=0;

break;

case 'B':

case 'b':

r= 0, g=0, b=1;

break;

case 27:

exit(0);

break;

//default: /* Otherwise keep going */

//return;

}

هنــــــــــــــــــــــــــــــــــــــــــــــــــــــــــا مثــــــــــــــــــــــــلا

}

تم تعديل هذه المشاركة بواسطة 3ds max2010 في 25 أبريل 2012 في 01:00

1

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg
#3

نعم هذه هي الاجابة اللتي كنت ابحث عنها جزاك الله كل خير لقد عمل البرنامج كما اردت تماما شكرا جزيلا

:)ا

#4

لدي سؤال اخر اذا سمحت لي

هذا الجزء من الكود من المفترض ان يقوم بطباعة احداثيات النقطة اللتي تقف عليها الفارة ان تم ضغط الزر الايسر من الفارة لكنه لم يعمل هل كيف استطيع التعديل عليه؟

 void mymouse (int button, int state, int 

x, int y)
 {
         if (button== GLUT_LEFT_BUTTON && 

state== GLUT_DOWN) 
cout<<x<<" "<<y<<endl;

 }
#5

تحتاج إلى إضافة :

glutMouseFunc(mymouse );

في الدالة main.

تم تعديل هذه المشاركة بواسطة 3ds max2010 في 25 أبريل 2012 في 02:24

1

تخيل, هل سيكون مستقبل الأوبن جي أل مع البشرية هكذا

future.jpg

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…