8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 151

Как рисовать в С++ средствами OpenGL

15.12.2014, 21:26. Показов 2540. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Мне необходимо нарисовать треугольник в WinApi. У меня в программе выводится окно с треугольником, а при закрытии пустое окно WinApi, а мне надо чтоб рисовалось сразу в WinApi. В чем ошибка, подскажите?
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
#include <Windows.h>
#include <gl\GL.H>
#include <gl\GLU.h>
#include <gl\GLAUX.H>
 
#include <iostream>
#include <conio.h>
#include "triangle.h"
 
 
void CALLBACK display(void);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
 
int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
    WNDCLASS wc;
    wc.style = CS_OWNDC; // WS_POPUP;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(6);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = L"class";
 
    RegisterClass(&wc);
 
    HWND hWnd = CreateWindow(L"class",L"programa",WS_OVERLAPPEDWINDOW,0,0,800,600,NULL,NULL,hInstance,NULL);
    ShowWindow(hWnd,nCmdShow);
 
    UpdateWindow(hWnd);
    
    MSG msg;
 
    while(true)
    {
        if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
                return 0;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}
void CALLBACK display(void)
{
    glBegin(GL_TRIANGLES);
    // 0 = (400;300)
    glVertex2f(400.0,300.0);
    glVertex2f(400.0,600.0);
    glVertex2f(600.0,400.0);
    glEnd();
    glFlush();
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
    switch(Msg)
    {
    case WM_CREATE:
        {
            auxInitDisplayMode(AUX_RGB);
            auxInitPosition(0,0,800,600);
            auxInitWindow(L"Program");
            auxMainLoop(display);   
        }
    case WM_DESTROY:
      {
        PostQuitMessage(0);
        return 0;
      }
    case WM_CLOSE:
      {
        exit(0);
      }
    case WM_QUIT:
      {
        return 0;
      }
    default:
      {
        return DefWindowProc(hWnd,Msg,wParam,lParam);
      }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2014, 21:26
Ответы с готовыми решениями:

Как рисовать в pictureBox
Никак не могу понять, как рисовать в pictureBox. Покажите, пожалуйста, на примере.

Как рисовать в видеокарту?
Привем всем! Представим, что запущена какая-либо игра, могу ли я рисовать поверх изображения игры, то есть прямо в видеокарту?

Как рисовать в Turbo C?
Как рисовать в Turbo C?

7
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.12.2014, 21:31
Darkos, Вы уж определитесь: Вам нужно рисовать с помощью WinAPI или с помощью OpenGL? А мешать две эти вещи это глупость полная.

Добавлено через 2 минуты
Цитата Сообщение от Darkos Посмотреть сообщение
В чем ошибка, подскажите?
Вы создаете 2 окна - одно с помощью WinAPI, другое с помощью OpenGL.
0
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 151
15.12.2014, 21:39  [ТС]
Я пока в этом ничего не понимаю, если использовать OpenGL то программу по другому писать(без WinApi)?

Добавлено через 5 минут
Kerry_Jr, Я пока в этом ничего не понимаю, если использовать OpenGL то программу по другому писать(без WinApi)?
0
11 / 11 / 1
Регистрация: 17.10.2014
Сообщений: 91
15.12.2014, 22:08
Ну а зачем тебе 2 окна ?? и зачем WinApi ?
Вот накидал по быстрому правда квадрат
В функции draw от редактируешь
P.s не судите строго сам только учусь ! =)
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
#include <GL/glut.h>
float wig=400;
float heg=400;
void draw()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
 
glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);
glVertex2i(-150, -150);
glColor3f(0.0, 0.0, 1.0);
glVertex2i(150, -150);
glColor3f(0.0, 1.0, 0.0);
glVertex2i(150, 150);
glColor3f(1.0, 0.0, 0.0);
glVertex2i(-150, 150);
 
 
 
    glEnd();
    glPopMatrix();
    glutSwapBuffers();
 
 
}
void Timer(int v)
{
    glutPostRedisplay();
    glutTimerFunc(50, Timer, 0);
 
}
 
 
 
void inti()
{
 
 
    glEnable(GL_TEXTURE_2D);
 
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-wig, wig, -heg, heg, -400.0, 400.0);
    glMatrixMode(GL_MODELVIEW);
}
 
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(wig, heg);
    glutInitWindowPosition(300,200);
    glutCreateWindow("test");
 
    glutDisplayFunc(draw);
    glutTimerFunc(50, Timer, 0);
 
    inti();
 
    glutMainLoop();
 
 
    return 0;
 
}
Добавлено через 14 минут
И да на ютубе есть пару норм уроков с 0 по openGl сам с них начинал =) советую поищи их =)
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
15.12.2014, 23:03
Darkos, В WinAPI можно без 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
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
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
/****************************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW; // WS_POPUP;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "class";
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    
    if (!RegisterClassEx(&wc))
    {
        MessageBox(NULL,"Unable to register class of the window", "Error", MB_OK);
        return NULL;
    }
    hWnd = CreateWindowEx(WS_EX_TRANSPARENT, wc.lpszClassName, "Program", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL);
    if (!hWnd)
    {
        MessageBox(NULL,"Unable to register class of the window", "Error", MB_OK);
        return NULL;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    while (GetMessage(&msg, NULL, NULL, NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}
/***********************************************************************/
BOOL Line(HDC hDC, int x1, int y1, int x2, int y2);
/***********************************************************************/
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    switch (uMsg)
    {
        case WM_PAINT:
            hDC = BeginPaint(hWnd, &ps);
            GetClientRect(hWnd, &rect);
            Line(hDC, 400, 200, 400, 500);
            Line(hDC, 400, 500, 600, 300);
            Line(hDC, 600, 300, 400, 200);
            ValidateRect(hWnd, NULL);
            EndPaint(hWnd, &ps);
            break;
        case WM_CLOSE: DestroyWindow(hWnd); break;
        case WM_DESTROY: PostQuitMessage(NULL); break;
        default: return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return NULL;
}
 
/****************************************************************************/
BOOL Line(HDC hDC, int x1, int y1, int x2, int y2)
{
    MoveToEx(hDC, x1, y1, NULL);
    return LineTo(hDC, x2, y2);
}
1
8 / 8 / 12
Регистрация: 16.05.2014
Сообщений: 151
17.12.2014, 16:41  [ТС]
А что лучше использовать для графики, OpenGL или DirectX?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.12.2014, 17:30
OpenGL кроссплатформенный, а DirectX содержит дополнительные возможности из коробки, но только под Windows. Решать вам. Сейчас большинство движков переписывают под OpenGL.
0
11 / 11 / 1
Регистрация: 17.10.2014
Сообщений: 91
18.12.2014, 01:34
Лично по мне OpenGl в начинаниях по проще будет (ну это лично по мне так )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2014, 01:34
Помогаю со студенческими работами здесь

Как рисовать графику
Добрый день Хочу спросить каким образом можно нарисовать графический елементы. Мне тут задали курсовую написать что-то на подобии...

Блок-схема как её рисовать ?
Народ !!! нужна помощь... как нарисовать блок схемы на функции : void output( Student * students, int N, ostream &amp; stream ) {...

как рисовать графику в С++ или С
Помогите пожалуйста,кто нибудь по пунктам и подробно,начиная с того,какой С или С++ нужно установить,что бы с графикой работать и пошагово...

Можно ли средствами OpenGL рисовать на канве?
Всем доброго времени суток. Можно ли средствами OpenGL рисовать скажем на конве формы? Если можно то как? Добавлено через 6 часов...

Как рисовать средствами API на BITMAP?
Линия, нарисованная на контексте устройства PictureBox с помощью MoveToEx и LineTo, сотрётся если форму свернуть и затем развернуть. Как...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru