Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
API. Cpp ⇐ ПредыдущаяСтр 10 из 10 #include "Header.h"
BOOL SetWindowPixelFormat(HWND); BOOL display (HWND); BOOL resize (int, int); LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
void newRotate (float a, float x, float y, float z) { float m[16]; glGetFloatv (GL_MODELVIEW_MATRIX, m); glLoadIdentity (); glRotatef (a,x,y,z); glMultMatrixf (m); }
void newTranslate (float x, float y, float z) { float m[16]; glGetFloatv (GL_MODELVIEW_MATRIX, m); glLoadIdentity (); glTranslatef (x,y,z); glMultMatrixf (m); }
void DispalyList () { glNewList(1,GL_COMPILE); glBegin(GL_LINES); glColor3d(15.0,0.0,0.0); glVertex3d(-50.0, 0.0, 0.0); glVertex3d(50.0, 0.0, 0.0); glEnd();
glBegin(GL_LINES); glColor3d(0.0,15.0,0.0); glVertex3d(0.0, -50.0, 0.0); glVertex3d(0.0, 50.0, 0.0); glEnd();
glBegin(GL_LINES); glColor3d(15.0,15.0,15.0); glVertex3d(0.0, 0.0, -50.0); glVertex3d(0.0, 0.0, 50.0); glEnd(); glEndList();
glNewList(2,GL_COMPILE); glPushMatrix(); glTranslated(0.5,0,0); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(-0.5,0,0); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(0,0.5,0); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(0,-0.5,0); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(0,0,0.5); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(0,0,-0.5); glColor3d(1,0,0); glutSolidSphere(1.3,20,20); glPopMatrix(); glEndList();
glNewList(3,GL_COMPILE); glPushMatrix(); glTranslated(1.5,1.5,1.5); glColor3d(1,1,1); glutSolidSphere(0.8,20,20); glPopMatrix();
glPushMatrix(); glTranslated(-1.5,-1.5,-1.5); glColor3d(1,1,1); glutSolidSphere(0.8,20,20); glPopMatrix(); glEndList();
glNewList(4,GL_COMPILE); glPushMatrix(); glTranslated(3,3,3); glColor3d(1,0,1); glutSolidSphere(0.8,20,20); glPopMatrix();
glPushMatrix(); // сохраняем текущие координаты glTranslated(-3,-3,-3); // сдвигаемся по оси Х glColor3d(0,1,1); glutSolidSphere(0.9,20,20); // рисуем сферу glPopMatrix(); // возвращаемся к старой системе координат
glPushMatrix(); glTranslated(-3,0,0); glColor3d(1,1,0); glutSolidSphere(0.8,20,20); glPopMatrix();
glPushMatrix(); glTranslated(3,0,0); glColor3d(0,0,1); glutSolidSphere(0.7,20,20); glPopMatrix(); glEndList();
glNewList(5,GL_COMPILE); glPushMatrix(); glTranslated(-4,4,4); glColor3d(1,1,0); glutSolidSphere(0.5,20,20); glPopMatrix();
glPushMatrix(); // сохраняем текущие координаты glTranslated(4,-4,-4); // сдвигаемся по оси Х glColor3d(1,0,0); glutSolidSphere(0.4,20,20); // рисуем сферу glPopMatrix(); // возвращаемся к старой системе координат
glPushMatrix(); glTranslated(0,-4,0); glColor3d(0,1,0); glutSolidSphere(0.3,20,20); glPopMatrix();
glPushMatrix(); glTranslated(0,4,0); glColor3d(0,1,1); glutSolidSphere(0.6,20,20); glPopMatrix(); glEndList(); }
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR str,int nWinMode){
WNDCLASS wclass; wclass.hInstance=hThisInst; wclass.cbClsExtra = 0; wclass.cbWndExtra = 0; wclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wclass.hIcon = NULL; wclass.lpfnWndProc = WindowFunc; wclass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wclass.lpszMenuName = NULL; wclass.hCursor = LoadCursor(NULL,IDC_ARROW); wclass.lpszClassName = L"Window"; RegisterClass(&wclass);
hWnd = CreateWindowA("Window", "Win API WND", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 50, //CW_USEDEFAULT 50, //CW_USEDEFAULT 800, //CW_USEDEFAULT 800, //CW_USEDEFAULT HWND_DESKTOP, NULL, hThisInst, NULL); if (!hWnd) return 0; ShowWindow(hWnd,nWinMode); UpdateWindow(hWnd); DispalyList (); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); display (hWnd); } return msg.wParam; }
BOOL SetWindowPixelFormat(HWND hWnd) { int m_GLPixelIndex; PIXELFORMATDESCRIPTOR pfd;
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cRedBits = 8; pfd.cRedShift = 16; pfd.cGreenBits = 8; pfd.cGreenShift = 8; pfd.cBlueBits = 8; pfd.cBlueShift = 0; pfd.cAlphaBits = 0; pfd.cAlphaShift = 0; pfd.cAccumBits = 64; pfd.cAccumRedBits = 16; pfd.cAccumGreenBits = 16; pfd.cAccumBlueBits = 16; pfd.cAccumAlphaBits = 0; pfd.cDepthBits = 32; pfd.cStencilBits = 8; pfd.cAuxBuffers = 0; pfd.iLayerType = PFD_MAIN_PLANE; pfd.bReserved = 0; pfd.dwLayerMask = 0; pfd.dwVisibleMask = 0; pfd.dwDamageMask = 0;
m_GLPixelIndex = ChoosePixelFormat(hDC, &pfd); if(m_GLPixelIndex==0) // Let's choose a default index. { m_GLPixelIndex = TRUE; if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0) return FALSE; } if (SetPixelFormat(hDC, m_GLPixelIndex, &pfd)==FALSE) return FALSE; return TRUE; } BOOL resize(int width,int height) { glViewport(0,0,width,height);//выбор порта glMatrixMode(GL_PROJECTION); glLoadIdentity(); ////??? //glOrtho(-5,5, -5,5, 2,12);//отртографическая(параллельная проекция) gluPerspective(90.0, width/height, 0.2, 100.0); glMatrixMode(GL_MODELVIEW); return TRUE; }
BOOL display(HWND hWnd) { int rot=0;
glClearColor(0.5f,0.5f,0.5f,1.0f); // Будем очищать экран, заполняя его цветом тумана glEnable(GL_FOG); // Включаем туман (GL_FOG) glFogi(GL_FOG_MODE, fogMode[fogfilter]);// Выбираем тип тумана glFogfv(GL_FOG_COLOR, fogColor); // Устанавливаем цвет тумана glFogf(GL_FOG_DENSITY, fogDensity); // Определяем, на сколько густым будет туман (fogDensity) glHint(GL_FOG_HINT, fogHint[foghint]); // Вспомогательная установка тумана glFogf(GL_FOG_START, 1.0f); // Глубина, с которой начинается туман glFogf(GL_FOG_END, 5.0f); // Глубина, где туман заканчивается.
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glCallList(1);
glPushMatrix(); glTranslated (0.0f+xSide,0.0f+ySide,0.0f+zSide); glScaled (0.0f+Scale,0.0f+Scale,0.0f+Scale); glRotated (TurnX, 1, 0, 0); glRotated (TurnY, 0, 1, 0); glRotated (TurnZ, 0, 0, 1);
glCallList(2);
glPushMatrix(); glTranslated (0.0f+xSideO,0.0f+ySideO,0.0f+zSideO); glScaled (0.0f+ScaleO,0.0f+ScaleO,0.0f+ScaleO); glRotated (TurnXO, 1, 0, 0); glRotated (TurnYO, 0, 1, 0); glRotated (TurnZO, 0, 0, 1);
for (int i = 1; i <= objCount; i++){ rot = 360/objCount; if (i<5) { glRotated(rot*i, 1, 0, 0); glRotated(rot*(i-1), 0, 1, 0); glRotated(rot*(i-2), 0, 0, 1); glCallList(3); } if (i>=5) { glRotated(rot*i, 1, 0, 0); glRotated(rot*(i-1), 0, 1, 0); glRotated(rot*(i-2), 0, 0, 1); glCallList(4);
glRotated(rot*i, 1, 0, 0); glRotated(rot*(i-1), 0, 1, 0); glRotated(rot*(i-2), 0, 0, 1); glCallList(5); }
}
glPopMatrix(); glPopMatrix();
glEnd();
SwapBuffers(wglGetCurrentDC()); return TRUE; } LRESULT CALLBACK WindowFunc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam){ float pos[4] = {3,3,3,1}; float dir[3] = {-1,-1,-1};
switch(msg){ case WM_CREATE: hDC = GetDC(hWnd); // получаем контекст устройства нашего окна SetWindowPixelFormat(hWnd); // устанавливаем параметры контекста воспроизведения OpenGL hGLRC = wglCreateContext(hDC); // создаем контекст воспроизведения OpenGL wglMakeCurrent(hDC, hGLRC); // делаем его текущим
glEnable(GL_ALPHA_TEST); // тест прозрачности, т.е. будет учитываться четвертый параметр в glColor glEnable(GL_DEPTH_TEST); // тест глубины glEnable(GL_COLOR_MATERIAL); // glColor будет устанавливать свойства материала glEnable(GL_LIGHTING); // разрешаем освещение glEnable(GL_LIGHT0); // включаем нулевую лампу glEnable(GL_BLEND); // разрешаем смешение цветов glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // устанавливаем положение нулевой лампы glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); return 0;
case WM_DESTROY: if (hGLRC) { wglMakeCurrent(NULL, NULL); wglDeleteContext(hGLRC); // удаляем созданный выше контекст воспроизведения OpenGL } ReleaseDC(hWnd, hDC); // освобождаем контекст устройства нашего окна
PostQuitMessage(0); return 0;
case WM_SIZE: resize(LOWORD(lParam), HIWORD(lParam)); return 0;
case WM_KEYDOWN: // Была ли нажата кнопка? switch (wParam) { case VK_DECIMAL: // NUM. foghint+=1; if(foghint>2) foghint=0; break;
case VK_NUMPAD0: // NUM 0 fogfilter+=1; if(fogfilter>2) fogfilter=0; break;
case VK_MULTIPLY: // NUM * fogDensity+=0.025; if(fogDensity>=0.5) fogDensity=0.5; break; case VK_DIVIDE: // NUM / fogDensity-=0.025; if(fogDensity<=0.05) fogDensity=0.05; break;
case VK_ADD: // NUM + objCount+=1; if(objCount>=10) objCount=10; break; case VK_SUBTRACT: // NUM - objCount-=1; if(objCount<=1) objCount=1; break;
case 0x57: //W newTranslate(0,0,1); //xSideObj+=1.5f; break; case 0x53: //S newTranslate(0,0,-1); //xSideObj-=1.5f; break; case 0x41: //A newTranslate(1,0,0); //ySideObj+=1.5f; break; case 0x44: //D newTranslate(-1,0,0); //ySideObj-=1.5f; break; case 0x20:// space newTranslate(0,-1,0); //zSideObj+=1.5f; break; case 0x11:// ctrl newTranslate(0,1,0); //zSideObj-=1.5f; break;
case VK_UP: newRotate(5,1,0,0); /*ySide=1.5f;*/ break; case VK_DOWN: newRotate(-5,1,0,0); /*ySide=-1.5f;*/ break; case VK_LEFT: newRotate(-5,0,1,0); /*xSide=-1.5f;*/ break; case VK_RIGHT: newRotate(5,0,1,0); /*xSide=1.5f;*/ break; case 0x45://E newRotate(-5,0,0,1); /*zSide=-1.5f;*/ break; case 0x51://Q newRotate(5,0,0,1); /*zSide=1.5f;*/ break;
case VK_OEM_PLUS: Scale+=0.01; break; case VK_OEM_MINUS: Scale-=0.01; break;
//case 0x50: //P // glLoadIdentity(); // Scale=0.8; // break;
case 0x54: //T xSide+=1; break; case 0x47: //G xSide-=1; break; case 0x48: //H ySide+=1; break; case 0x46: //F ySide-=1; break; case 0x59: //Y zSide+=1; break; case 0x52: //R zSide-=1; break;
case VK_NUMPAD6: TurnY+=5; break; case VK_NUMPAD4: TurnY-=5; break; case VK_NUMPAD8: TurnX+=5; break; case VK_NUMPAD2: TurnX-=5; break; case VK_NUMPAD9: TurnZ+=5; break; case VK_NUMPAD7: TurnZ-=5; break;
case 0x49: TurnYO+=5; break; case 0x4B: TurnYO-=5; break; case 0x4C: TurnXO+=5; break; case 0x4A: TurnXO-=5; break; case 0x55: TurnZO+=5; break; case 0x4F: TurnZO-=5; break;
case 0x4E: ScaleO+=0.01; break; case 0x4D: ScaleO-=0.01; break; } return 0;
default: return DefWindowProc(hWnd,msg,wParam,lParam); } return DefWindowProc (hWnd,msg,wParam,lParam); }
Руководство пользователя. Данное приложение является полностью графическим приложением, разработанное на базе Win32 API с помощью библиотек OPENGL. В приложении представлена модель абстрактного вещества. Есть возможность свободного полета "камеры" - точки обзора наблюдателя, движение атома по всем 3-м осям (х, y, z) и управление параметрами тумана: изменение формул прорисовки тумана и густоты тумана. Управление камерой происходит с помощью кнопок: W/S - движение камеры вперед и назад. A/D - движение камеры влево и вправо (straif). CTRL/SPACE - движение камеры вверх и вниз. UP/DOWN - поднятие и опускание камеры. LEFT/RIGHT - повороты камеры влево и вправо. Q/R - поворот камеры относительно оси, перпендикулярной экрана. +/- на боковой цифровой клавиатуре увеличивает число атомов, находящихся вокруг ядра. *и / - увеличивают или уменьшают густоту тумана. NUMPAD0 - меняет качество прорисовки.
Литература
1. Знакомство с Win32 и Win64: http://www.williamspublishing.com/PDF/5-8459-0879-5/part1.pdf 2. Джонсон М. Харт "Системное программирование в среде Windows". Третье издание. 3. Кибер форум программистов: http://www.cyberforum.ru/win-api/thread947523.html 4. Библиотека MSDN: http://msdn.microsoft.com/ru-ru/library/bb384843%28v=vs.90%29.aspx 5. Журнал RSDN Magazine #4-2005 (информация о журнале http://www.rsdn.ru/mag/main.htm) 6. Обучающее видео по созданию оконных приложений с использованием Win32 API: http://rutube.ru/video/3152ae06f75044f4331a29a4aa5cbf0d/ 7.Н.А. Литвиненко "Теория программирования на языке С++. WIN API.
|