Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325

Работа с OpenGl

24.04.2017, 17:27. Показов 3079. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите пожалуйста, а вот используя библиотеку OpenGl как сделать что бы то что я там рисую, выводилось в одном окне, а не в двух?
вот пример простого кода и при запуске получаеться запускаеться окно приложения и потом окно то что отрисовала

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include <windows.h>
#include <glut.h>   //Подключение библиотеки glut.h
 
void Initialize()
{
//Выбрать фоновый (очищающий) цвет
glClearColor(1.0,0.0,1.0,1.0);
 
//Установить проекцию
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
 
void Draw()
{
//Очищаем экран glClear(GL_COLOR_BUFFER_BIT);
 
//Отрисовка квадрата 
glColor3f(1.0,1.0,1.0); //Выбираем белый цвет
glBegin(GL_POLYGON);
glVertex3f(0.25,0.25,0.0); //Координаты квадрата
glVertex3f(0.75,0.25,0.0); 
glVertex3f(0.75,0.75,0.0);
glVertex3f(0.25,0.75,0.0);
glEnd();
glFlush();
}
 
//Войти в главный цикл
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);        //Указываем размер окна
glutInitWindowPosition(100,100);    //Позиция окна
glutCreateWindow("Polygon");        //Имя окна
Initialize();                       //Вызов функции Initialize
glutDisplayFunc(Draw);              //Вызов функции отрисовки
glutMainLoop();
 
return 0;
}
а вот как сделать что бы было одно окно? подскажите пожалуйста
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2017, 17:27
Ответы с готовыми решениями:

Работа с openGL
Можно ли с языком СИ использовать openGL? Посоветуете литературу? Погуглил, выдает все с C++.

Работа с Ortho в OpenGL
Набрел я тут значит на способ рисования 2D-графики с помощью Ortho. Код юзал отсюда: https://gamedev.ru/tip/?id=9 Ничего не менял. Но...

OpenGL, работа с освещением
Здравствуйте. Пробую себя в игростроении. Нарисовал трехмерный домик, физику сделал - можно бегать по поверхностям, прыгать, не проходить...

8
58 / 14 / 5
Регистрация: 07.04.2017
Сообщений: 58
24.04.2017, 17:44
итернал, имеешь в виду, чтобы консоли не было? это нужно "Win32 проект" создавать, а не консольный.
1
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
25.04.2017, 13:43  [ТС]
а можно маленький пример как в Win32 проекте, нарисовать такой же квадрат, как и в коде выше?
0
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
26.04.2017, 00:14
может поможет этот код
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
// Пустой.cpp: определяет точку входа для приложения.
//
 
#include "stdafx.h"
#include "Пустой.h"
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
//#include<windows.h>
 
#include "GL\glut.h"
//#include "GL\glaux.h"
 
#pragma comment (lib,"Opengl32.lib")
//#pragma comment (lib,"Glaux.lib")
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
 
#define MAX_LOADSTRING 100
 
 
// Глобальные переменные:
HINSTANCE hInst;                                // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];                  // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];            // имя класса главного окна
HWND hWnd;                                      
HGLRC hGLRC;
HDC hDC;
 
GLfloat xrot;           // Вращение X
GLfloat yrot;           // Y 
GLfloat zrot;           // Z  
 
GLfloat rtri;               // Угол для пирамиды
GLfloat rquad;              // Угол для квадрата
 
GLuint  texture[1];         // Место для одной текстуры
 
BOOL    keys[256];      // Массив для процедуры обработки клавиатуры
 
 
// Отправить объявления функций, включенных в этот модуль кода:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// Теперь вставьте код функции, которая устанавливает параметры контекста воспроизведения OpenGL. 
int SetWindowPixelFormat()
{
    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 = 1;    
     if(DescribePixelFormat(hDC,m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pfd)==0)
       return 0;
    }
 
 
    if (SetPixelFormat( hDC, m_GLPixelIndex, &pfd)==FALSE)
        return 0;
 
    return 1;
}
 
void resize(int Width,int Height)
{
    glViewport(0,0,Width,Height);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
   // glOrtho(-5,5, -5,5, 2,12); 
    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
    gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
    glMatrixMode( GL_MODELVIEW );
}    
 
 
/*Это значит, что рисоваться все будет сначала в буфер. Для того, что бы скопировать содержимое буфера
на экран, вызывается функция SwapBuffers().  чтобы избавиться от мерцания на экране.
В функции display мы сначала очищаем буфер. Цвет, которым заполняется буфер при очищении,
можно установить в функции main() вызовом glClearColor(r,g,b). 
*/
void display()
{
    /*
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 
    /* remove next tree lines and enter your code here
     */
 /*       glTranslated(0.001,0.001,0);
        glColor3d(1,0,0);
        auxSolidSphere( 1 );
 
 
  glFinish();
  SwapBuffers(wglGetCurrentDC());
  */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// Очистка экрана и буфера глубины
glLoadIdentity();               // Сброс просмотра
glTranslatef(-1.5f,0.0f,-6.0f);         // Сдвиг влево и вглубь экрана
glRotatef(rtri,0.0f,1.0f,0.0f);         // Вращение пирамиды по оси Y
glBegin(GL_TRIANGLES);              // Начало рисования пирамиды
    glColor3f(1.0f,0.0f,0.0f);          // Красный
    glVertex3f( 0.0f, 1.0f, 0.0f);          // Верх треугольника (Передняя)
    glColor3f(0.0f,1.0f,0.0f);          // Зеленный
    glVertex3f(-1.0f,-1.0f, 1.0f);          // Левая точка
    glColor3f(0.0f,0.0f,1.0f);          // Синий
    glVertex3f( 1.0f,-1.0f, 1.0f);          // Правая точка
    glColor3f(1.0f,0.0f,0.0f);          // Красная
    glVertex3f( 0.0f, 1.0f, 0.0f);          // Верх треугольника (Правая)
    glColor3f(0.0f,0.0f,1.0f);          // Синия
    glVertex3f( 1.0f,-1.0f, 1.0f);          // Лево треугольника (Правая)
    glColor3f(0.0f,1.0f,0.0f);          // Зеленная
    glVertex3f( 1.0f,-1.0f, -1.0f);         // Право треугольника (Правая)
    glColor3f(1.0f,0.0f,0.0f);          // Красный
    glVertex3f( 0.0f, 1.0f, 0.0f);          // Низ треугольника (Сзади)
    glColor3f(0.0f,1.0f,0.0f);          // Зеленный
    glVertex3f( 1.0f,-1.0f, -1.0f);         // Лево треугольника (Сзади)
    glColor3f(0.0f,0.0f,1.0f);          // Синий
    glVertex3f(-1.0f,-1.0f, -1.0f);         // Право треугольника (Сзади)
    glColor3f(1.0f,0.0f,0.0f);          // Красный
    glVertex3f( 0.0f, 1.0f, 0.0f);          // Верх треугольника (Лево)
    glColor3f(0.0f,0.0f,1.0f);          // Синий
    glVertex3f(-1.0f,-1.0f,-1.0f);          // Лево треугольника (Лево)
    glColor3f(0.0f,1.0f,0.0f);          // Зеленный
    glVertex3f(-1.0f,-1.0f, 1.0f);          // Право треугольника (Лево)
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);      // Сдвинуть вправо и вглубь экрана
glRotatef(rquad,1.0f,1.0f,1.0f);    // Вращение куба по X, Y & Z
glBegin(GL_QUADS);          // Рисуем куб
    glColor3f(0.0f,1.0f,0.0f);      // Синий
    glVertex3f( 1.0f, 1.0f,-1.0f);      // Право верх квадрата (Верх)
    glVertex3f(-1.0f, 1.0f,-1.0f);      // Лево верх
    glVertex3f(-1.0f, 1.0f, 1.0f);      // Лево низ
    glVertex3f( 1.0f, 1.0f, 1.0f);      // Право низ
    glColor3f(1.0f,0.5f,0.0f);      // Оранжевый
    glVertex3f( 1.0f,-1.0f, 1.0f);      // Верх право квадрата (Низ)
    glVertex3f(-1.0f,-1.0f, 1.0f);      // Верх лево
    glVertex3f(-1.0f,-1.0f,-1.0f);      // Низ лево
    glVertex3f( 1.0f,-1.0f,-1.0f);      // Низ право
    glColor3f(1.0f,0.0f,0.0f);      // Красный
    glVertex3f( 1.0f, 1.0f, 1.0f);      // Верх право квадрата (Перед)
    glVertex3f(-1.0f, 1.0f, 1.0f);      // Верх лево
    glVertex3f(-1.0f,-1.0f, 1.0f);      // Низ лево
    glVertex3f( 1.0f,-1.0f, 1.0f);      // Низ право
    glColor3f(1.0f,1.0f,0.0f);      // Желтый
    glVertex3f( 1.0f,-1.0f,-1.0f);      // Верх право квадрата (Зад)
    glVertex3f(-1.0f,-1.0f,-1.0f);      // Верх лево
    glVertex3f(-1.0f, 1.0f,-1.0f);      // Низ лево
    glVertex3f( 1.0f, 1.0f,-1.0f);      // Низ право
    glColor3f(0.0f,0.0f,1.0f);      // Синий
    glVertex3f(-1.0f, 1.0f, 1.0f);      // Верх право квадрата (Лево)
    glVertex3f(-1.0f, 1.0f,-1.0f);      // Верх лево
    glVertex3f(-1.0f,-1.0f,-1.0f);      // Низ лево
    glVertex3f(-1.0f,-1.0f, 1.0f);      // Низ право
    glColor3f(1.0f,0.0f,1.0f);      // Фиолетовый
    glVertex3f( 1.0f, 1.0f,-1.0f);      // Верх право квадрата (Право)
    glVertex3f( 1.0f, 1.0f, 1.0f);      // Верх лево
    glVertex3f( 1.0f,-1.0f, 1.0f);      // Низ лево
    glVertex3f( 1.0f,-1.0f,-1.0f);      // Низ право
    glEnd();                // Закончили квадраты
 
rtri+=0.2f;     // Увеличим переменную вращения для треугольника 
rquad-=0.15f;       // Уменьшим переменную вращения для квадрата   
 
//  glFinish();
 SwapBuffers(wglGetCurrentDC());
 
}
 
 
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
 
    // TODO: разместите код здесь.
    MSG msg;
    HACCEL hAccelTable;
 
    // Инициализация глобальных строк
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
 
    // Выполнить инициализацию приложения:
    if (!InitInstance (hInstance, nCmdShow))
    {
        return FALSE;
    }
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY));
 
    // Цикл основного сообщения:
/*  while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        display();
    }
 
    return (int) msg.wParam;
    */
    while (1)
    {
        // Обработка всех сообщений
        while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
        {
            if (GetMessage(&msg, NULL, 0, 0))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else
            {
                return TRUE;
            }
        }
 
        display();              // Нарисовать сцену
        SwapBuffers(hDC);           // Переключить буфер экрана
        if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0);    // Если ESC - выйти
    }
 
}
 
 
 
//
//  ФУНКЦИЯ: MyRegisterClass()
//
//  НАЗНАЧЕНИЕ: регистрирует класс окна.
//
//  КОММЕНТАРИИ:
//
//    Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код
//    был совместим с системами Win32, не имеющими функции RegisterClassEx'
//    которая была добавлена в Windows 95. Вызов этой функции важен для того,
//    чтобы приложение получило "качественные" мелкие значки и установило связь
//    с ними.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_MY);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}
 
//
//   ФУНКЦИЯ: InitInstance(HINSTANCE, int)
//
//   НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
//
//   КОММЕНТАРИИ:
//
//        В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также
//        создается и выводится на экран главное окно программы.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
 //  HWND hWnd;
 
   hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
 
 /*  hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
 
      */
hWnd = CreateWindow(szWindowClass, szTitle, 
                     WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                     200,
                     150,
                     480,
                     480,
                     HWND_DESKTOP, NULL,
                     hInstance, NULL);
 
 
 
   if (!hWnd)
   {
      return FALSE;
   }
 
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
 
   return TRUE;
}
 
//
//  ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  НАЗНАЧЕНИЕ:  обрабатывает сообщения в главном окне.
//
//  WM_COMMAND  - обработка меню приложения
//  WM_PAINT    -Закрасить главное окно
//  WM_DESTROY   - ввести сообщение о выходе и вернуться.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//+++++++++++++++++++++++++++++++++++++++++++++++++//   
    float pos[4] = {3,3,3,1};
    float dir[3] = {-1,-1,-1};
//++++++++++++++++++++++++++++++++++++++++++++++++//
    int wmId, wmEvent;
    PAINTSTRUCT ps;
//  HDC hdc;
 
 
    switch (message)
    {
 
   // сообщение WM_CREATE приходит один раз при создании окна
   case WM_CREATE:
   
   hDC = GetDC(hWnd);       // получаем контекст устройства нашего окна
   
   SetWindowPixelFormat();  // устанавливаем параметры контекста воспроизведения OpenGL
   
   hGLRC = wglCreateContext(hDC);// создаем контекст воспроизведения OpenGL
 
   wglMakeCurrent(hDC, hGLRC);   // делаем его текущим
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
  //  далее, я устанавливаю ряд тестов и параметров  тест прозрачности,
   // т.е. будет учитываться  четвертый параметр в glColor
    glEnable(GL_ALPHA_TEST);   // тест глубины
    glEnable(GL_DEPTH_TEST);    // glColor будет устанавливать свойства материала
                                // вам не надо дополнительно вызывать glMaterialfv
 
    glEnable(GL_COLOR_MATERIAL);  // разрешаем освещение
    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);
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
        break;
 
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
        // Разобрать выбор в меню:
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;
        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        // TODO: добавьте любой код отрисовки...
        display();
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
            // удаляем созданный выше  контекст воспроизведения OpenGL
        if (hGLRC)
        {
            wglMakeCurrent(NULL, NULL);
            wglDeleteContext(hGLRC);
        }
        // освобождаем контекст устройства нашего окна
 
 
        PostQuitMessage(0);
        break;
  case WM_SIZE:
     resize( LOWORD(lParam), HIWORD(lParam) );
     break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
 
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
 
    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
30.04.2017, 19:59
Программа на WinAPI и OpenGL 3.3: ColoredSquare_CppOpenGL33WinAPI.rar

Подключены библиотеки GLM (для матриц) и GLEW (для шейдеров),
которые находятся в архиве с проектом в папке Libs
Скачайте и запустите. Должно работать в VS2012 - VS2015
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
30.04.2017, 20:14
Сделал небольшие изменения, в заголовок окна теперь выводится "Colored Square": ColoredSquare_CppOpenGL33WinAPI.rar

0
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
30.04.2017, 23:31  [ТС]
спасибо большое, обязательно посмотрю и разберусь, но я сделал не много иначе

Linker => Advanced и в Entery Point вписал: mainCRTStartup.

Linker => System заменил SubSystem на Windows (/SUBSYSTEM:WINDOWS).

и получился нужный мне эффект, с моим кодом, консоль не появлялась

но ваш пример тоже посмотрю, спасибо
0
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
01.05.2017, 09:45
На всякий случай отмечу, что вы используете версию OpenGL, которая была актуальна в период от 1992 по 2004: History of OpenGL. Когда вышел OpenGL 2.0 в 2004 году, то многое что было раньше стало deprecated - это значит, что разработчики не рекомендуют его использовать. На мобильных и веб вообще нельзя использовать glBegin/glEnd. Сейчас актуально использовать OpenGL 3.3, что у меня в примере.

Пару слов о примере. Внутри проекта есть папка Libs, в которую я положил две библиотеки: GLEW и GLM. И подключил эти библиотеки в настройках проекта относительно директории решения: $(SolutionDir).

Вы это можете увидеть в этих пунктах в настройках проекта:
  • "Configuration Properties" -> "C/C++" -> "Additional Include Directories"
  • "Configuration Properties" -> "Linker" -> "General" -> "Additional Library Directories"
  • "Configuration Properties" -> "Linker" -> "Input" -> "Additional Dependencies"

Добавлено через 7 минут
Цитата Сообщение от итернал Посмотреть сообщение
но я сделал не много иначе
Это потому что для GLUT нужно создавать консольное приложение "Win32 Console Application". Да, вы всё правильно сделали в настройках, так и надо. Но я создаю окно без GLUT, на чистом WinAPI, поэтому я создавал сразу не консольное, а оконное приложение "Win32 Project". А консоль у меня показывается для отладочных целей, в неё удобно что-либо выводить во время написания/отладки приложения. Я её искусственно вызываю командой:
C++
1
AllocConsole();
Если эту команду закомментировать, то консоль не будет появляться.

Добавлено через 9 часов 51 минуту
Раз вы GLUT хотите использовать, то может вам пригодится мой пример квадрата с текстурой: TexturedSquare_CppFreeGlutOpenGL33Soil.rar

2
9948 / 2948 / 497
Регистрация: 05.10.2013
Сообщений: 8,019
Записей в блоге: 242
01.05.2017, 11:16
С помощью GLM-матриц вот так можно перенести квадрат с текстурой в центр, задать ему масштаб 1.5 и повернуть на 5 градусов против часовой стрелки:
C++
1
2
3
glm::mat4 M = glm::rotate(glm::mat4(1.0f), glm::radians(5.0f), glm::vec3(0, 0, 1)) *
              glm::scale(glm::mat4(1), glm::vec3(1.5f)) *
              glm::translate(glm::mat4(1), glm::vec3(-0.5f, -0.5f, 0.0f));
TexturedSquare_CppFreeGlutOpenGL33Soil.rar
Миниатюры
Работа с OpenGl  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.05.2017, 11:16
Помогаю со студенческими работами здесь

Работа с изображениями OpenGL
Здравствуйте! Интересуют способы вывода картинок в окно OpenGL(например индикатор здоровья, или индикатор патронов). Какие функции нужно...

Работа с окном openGL
Можно ли разбить окно glfw, на области, на подобии фреймов в html? Если можно то как?

Работа с OpenGL в C + + Builder
На этапе линковки выводит вот такое сообщение. Подскажите что мне делать с этим

Работа с изображениями в OpenGL
Помогите пожалуйста. Надо писать курсач с помощью OpenGL, игру. Возможна ли работа OpenGL с PNG изображениями? Если возможно, то...

Работа с цветом в OpenGL
Доброго времени суток. Возникла проблема при прорисовке различных объектов в OpenGL разным цветом. В общем рисую кубик1, например,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru