Форум программистов, компьютерный форум CyberForum.ru

Как вывести фигуру в окне? - C++

Восстановить пароль Регистрация
 
Discovert
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 5
18.08.2014, 20:19     Как вывести фигуру в окне? #1
Всем доброго дня.
Я знаком с C++ довольно поверхностно, но на уровне консольного приложения знаю, возможно, все. Начал изучать DirectX по книгам Горнакова С.Г., для пущего реализма поставил VC++6.0 и DX9 под WinXP - все, как у него. И все же постоянно приходится адаптировать код, чтобы избавиться от ошибок. До сего момента справлялся, однако теперь в тупике. Следующий код собирается/компилируется и якобы исполняется - в диспетчере приложений имя своего творения в списке процессов наблюдаю, однако никакого визуального эффекта кроме этого нет. Собственно, код:

Кликните здесь для просмотра всего текста
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
#include <windows.h> 
#include <Winerror.h> 
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
 
/*****************************Инициализация Direct3D************************************/
 
        /**---------------Глобальные переменные--------------**/
        /**/   LPDIRECT3D9 pDirect3D = NULL;                /**/
        /**/   LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;    /**/
        /**/        struct CUSTOMVERTEX                     /**/
        /**/        {                                       /**/
        /**/        FLOAT X, Y, Z, rhw;                     /**/
        /**/        DWORD COLOR;                            /**/
        /**/        };                                      /**/
        /**/ LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; /**/
        /**--------------------------------------------------**/
 
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW | D3DFVF_DIFFUSE  //Директива описывает формат хранения данных о вершинах полигона. Используемый вариант - FVF.
                
/*--------------------Функция инициализации Direct3D----------------------*/
 
    HRESULT InitialDirect3D(HWND hWnd)
    {
        if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
        D3DDISPLAYMODE Display;
        if (FAILED(pDirect3D -> 
                   GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
        D3DPRESENT_PARAMETERS Direct3DParametr;
        ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
        Direct3DParametr.Windowed = TRUE;
        Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
        Direct3DParametr.BackBufferFormat = Display.Format;
 
        if (FAILED(pDirect3D -> 
                   CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 
                   hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
                   &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
        return S_OK;
    }
 
            /*Функция создания буфера для хранения данных о вершинах полигона*/
                        HRESULT InitialBufferVershin()
                        {
                            CUSTOMVERTEX Vershin[] = 
                            {
                                {300.0f, 300.0f, 0.5f, 1.0f, 0x00000ff}, //Вершина A
                                {150.0f, 300.0f, 0.5f, 1.0f, 0x00000ff}, //Вершина B
                                {150.0f, 150.0f, 0.5f, 1.0f, 0x00000ff}, //Вершина C
                                /* X       Y      Z     rhw     цвет */
                            };
                        if (FAILED(pDirect3DDevice -> CreateVertexBuffer(
                            3*sizeof(CUSTOMVERTEX),
                            0, D3DFVF_CUSTOMVERTEX,
                            D3DPOOL_DEFAULT,
                            &pBufferVershin, NULL)))
                            return E_FAIL;
                        VOID* pBV;
                        if (FAILED(pBufferVershin ->
                            Lock(0, sizeof(Vershin), (void**)&pBV, 0)))
                            return E_FAIL;
                        memcpy(pBV, Vershin, sizeof(Vershin)); //Копирование в буффер в случае неудачной проверки
                        pBufferVershin -> Unlock();            //Разблокирование
                        return S_OK;
                        }
                /*---------------------------Функция рисования----------------------------*/
 
                VOID RenderingDirect3D()
                {
                if (pDirect3DDevice == NULL) //Если ошибки не обнаружены
                    return;
                pDirect3DDevice -> Clear(0, NULL, D3DCLEAR_TARGET, 
                                        D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
                pDirect3DDevice -> BeginScene();  //Начало сцены
 
                /*------------Вывод сцены на экран------------*/
pDirect3DDevice -> SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));
pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX);
pDirect3DDevice -> DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
 
                pDirect3DDevice -> EndScene();  //Функция, завершающая сцену
                pDirect3DDevice -> Present(NULL, NULL, NULL, NULL);
                }
/*----------------Функция освобождения захваченных ресурсов-------------------*/
 
VOID DeleteDirect3D()
{
if (pBufferVershin != NULL) 
pBufferVershin -> Release();
if (pDirect3DDevice != NULL)  
pDirect3DDevice -> Release();
if (pDirect3D != NULL)        
pDirect3D -> Release();
}
 
/*-----------------------Функция обработки сообщений---------------------------*/
LRESULT CALLBACK MainWinProc (HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch(msg)
        {
        case WM_DESTROY:
            {
                DeleteDirect3D();
                PostQuitMessage(0);
                        return 0;
            }
        } //Конец switch-конструкции
    return DefWindowProc(hWnd, msg, wparam, lparam);
}
    /*----------------Функция входной точки приложения------------------*/
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow)
    {
    HWND         hWnd;      //создаем дескриптор окна
    MSG          msg;       //создаем идентификатор сообщения
    WNDCLASSEX   wndclass;  //создаем класс окна
 
        wndclass.cbSize        = sizeof(WNDCLASSEX);
        wndclass.style         = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
        wndclass.lpfnWndProc   = MainWinProc;
        wndclass.cbClsExtra    = 0;
        wndclass.cbWndExtra    = 0;
        wndclass.hInstance     = hInstance;
        wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wndclass.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);
        wndclass.lpszMenuName  = NULL;
        wndclass.lpszClassName = "Window Class"; 
        wndclass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
 
        /*Активация функции рисования в главной функции программы*/
        while (msg.message != WM_QUIT)
        {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    else
        RenderingDirect3D();
        }
    RenderingDirect3D();
        /*-------------Регистрация класса окна------------*/
        if(RegisterClassEx(&wndclass) == 0)
        return 0;
        /*-------------Создание окна приложения-----------*/
        if (!(hWnd = CreateWindowEx(
            NULL, "WINDOWSCLASS", "Рисуем треугольник", 
            WS_OVERLAPPEDWINDOW|WS_VISIBLE, 300, 150, 
            500, 400, NULL, NULL, hInstance, NULL)))
            return 0;
        if (SUCCEEDED(InitialDirect3D(hWnd)))
        {
            if (SUCCEEDED(InitialBufferVershin()))
            {
                ShowWindow(hWnd, SW_SHOWDEFAULT);
                UpdateWindow(hWnd);
                ZeroMemory(&msg, sizeof(msg));
                while(msg.message != WM_QUIT)
                {
                    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                    {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                    }
                    else
                        RenderingDirect3D();
                }
            }
        }
        return 0;
    }


Комментарии сочинял сам и для себя, некоторые, вполне возможно, не точны или ошибочны - в DX я чайник.
Имеются у кого-нибудь идеи, что я делаю неправильно? Буду очень признателен, если поделитесь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jewbacabra
18.08.2014, 20:30
  #2

Не по теме:

Цитата Сообщение от Discovert Посмотреть сообщение
Начал изучать DirectX по книгам Горнакова С.Г.
кошмарная книга, лучше изучай по книгам Франка Луна

Discovert
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 5
18.08.2014, 20:41  [ТС]     Как вывести фигуру в окне? #3
Спасибо, книгу обязательно посмотрю. Честно говоря, у Горнакова порадовал стиль изложения - русский кодер все же, а также идея постепенного дополнения в ходе изучения изначального кода различными нововведениями - этой особенностью напомнило "С++ для чайников" Стефана Р. Дэвиса, с которого когда-то начинал и чьим трудом остался весьма доволен.
Brendon
Заблокирован
18.08.2014, 22:07     Как вывести фигуру в окне? #4
О_о ... давненько я такого гавнакода не видел Ты уж извини за прямоту.
P.S.: ты вообще не понимаешь что делаешь.
P.S.S.: Изучение DirectX начинай с DirectX11 как минимум.
Начни с: http://d3dbegin.narod.ru/
Продолжи: Beginning DirectX 11 Game Programming
И добро пожаловать на http://gamedev.ru/

Держи в общем своё уже рабочее барахло.
Кликните здесь для просмотра всего текста
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
#include <windows.h> 
#include <Winerror.h> 
#include <d3d9.h>
#pragma comment(lib, "d3d9.lib")
 
/*****************************Инициализация Direct3D************************************/
 
/**---------------Глобальные переменные--------------**/
/**/   LPDIRECT3D9 pDirect3D = NULL;                /**/
/**/   LPDIRECT3DDEVICE9 pDirect3DDevice = NULL;    /**/
/**/        struct CUSTOMVERTEX                     /**/
    /**/        {                                       /**/
    /**/        FLOAT X, Y, Z, rhw;                     /**/
    /**/        DWORD COLOR;                            /**/
    /**/
};                                      /**/
/**/ LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; /**/
/**--------------------------------------------------**/
 
#define D3DFVF_CUSTOMVERTEX D3DFVF_XYZRHW | D3DFVF_DIFFUSE  //Директива описывает формат хранения данных о вершинах полигона. Используемый вариант - FVF.
 
/*--------------------Функция инициализации Direct3D----------------------*/
 
HRESULT InitialDirect3D(HWND hWnd)
{
    if (NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;
    D3DDISPLAYMODE Display;
    if (FAILED(pDirect3D ->
        GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))
        return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));
    Direct3DParametr.Windowed = TRUE;
    Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat = Display.Format;
 
    if (FAILED(pDirect3D ->
        CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
        hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParametr, &pDirect3DDevice)))
        return E_FAIL;
    return S_OK;
}
 
/*Функция создания буфера для хранения данных о вершинах полигона*/
HRESULT InitialBufferVershin()
{
    CUSTOMVERTEX Vershin[] =
    {
        { 300.0f, 300.0f, 0.5f, 1.0f, 0x00000ff }, //Вершина A
        { 150.0f, 300.0f, 0.5f, 1.0f, 0x00000ff }, //Вершина B
        { 150.0f, 150.0f, 0.5f, 1.0f, 0x00000ff }, //Вершина C
        /* X       Y      Z     rhw     цвет */
    };
    if (FAILED(pDirect3DDevice->CreateVertexBuffer(
        3 * sizeof(CUSTOMVERTEX),
        0, D3DFVF_CUSTOMVERTEX,
        D3DPOOL_DEFAULT,
        &pBufferVershin, NULL)))
        return E_FAIL;
    VOID* pBV;
    if (FAILED(pBufferVershin ->
        Lock(0, sizeof(Vershin), (void**)&pBV, 0)))
        return E_FAIL;
    memcpy(pBV, Vershin, sizeof(Vershin)); //Копирование в буффер в случае неудачной проверки
    pBufferVershin->Unlock();            //Разблокирование
    return S_OK;
}
/*---------------------------Функция рисования----------------------------*/
 
VOID RenderingDirect3D()
{
    if (pDirect3DDevice == NULL) //Если ошибки не обнаружены
        return;
    pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET,
        D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0);
    pDirect3DDevice->BeginScene();  //Начало сцены
 
    /*------------Вывод сцены на экран------------*/
    pDirect3DDevice->SetStreamSource(0, pBufferVershin, 0, sizeof(CUSTOMVERTEX));
    pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
 
    pDirect3DDevice->EndScene();  //Функция, завершающая сцену
    pDirect3DDevice->Present(NULL, NULL, NULL, NULL);
}
/*----------------Функция освобождения захваченных ресурсов-------------------*/
 
VOID DeleteDirect3D()
{
    if (pBufferVershin != NULL)
        pBufferVershin->Release();
    if (pDirect3DDevice != NULL)
        pDirect3DDevice->Release();
    if (pDirect3D != NULL)
        pDirect3D->Release();
}
 
/*-----------------------Функция обработки сообщений---------------------------*/
LRESULT CALLBACK MainWinProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_DESTROY:
    {
                       DeleteDirect3D();
                       PostQuitMessage(0);
                       return 0;
    }
    } //Конец switch-конструкции
    return DefWindowProc(hWnd, msg, wparam, lparam);
}
/*----------------Функция входной точки приложения------------------*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    HWND         hWnd;      //создаем дескриптор окна
    MSG          msg = { 0 };       //создаем идентификатор сообщения
    WNDCLASSEX   wndclass;  //создаем класс окна
 
    wndclass.cbSize = sizeof(WNDCLASSEX);
    wndclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = MainWinProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = "WINDOWSCLASS";
    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
    /*-------------Регистрация класса окна------------*/
    if (RegisterClassEx(&wndclass) == 0)
        return 0;
    /*-------------Создание окна приложения-----------*/
    if (!(hWnd = CreateWindowEx(
        NULL, "WINDOWSCLASS", "Рисуем треугольник",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300, 150,
        500, 400, NULL, NULL, hInstance, NULL)))
        return 0;
    if (SUCCEEDED(InitialDirect3D(hWnd)))
    {
        if (SUCCEEDED(InitialBufferVershin()))
        {
            ShowWindow(hWnd, SW_SHOWDEFAULT);
            UpdateWindow(hWnd);
            ZeroMemory(&msg, sizeof(msg));
            while (msg.message != WM_QUIT)
            {
                if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
                else
                    RenderingDirect3D();
            }
        }
    }
    return 0;
}
Discovert
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 5
18.08.2014, 22:17  [ТС]     Как вывести фигуру в окне? #5
Brendon,да, ты 100 % прав - я не ведаю, что творю )
"Изучение DirectX начинай с DirectX11 как минимум" - это как понимать? А максимум че, DirectX15 ?
Короче, от души, ты реально помог, в особенности ссылками. Действительно бесит, когда "не втыкаешь" в какие-то моменты с самого начала, а все эти книги говорят о них как об "очевидных вещах, любой дурак, мол, знает". А мне бы сначала все, в стиле "...вот эту кнопочку нажимаем для того-то, а эту буковку пишем затем-то..."
Brendon
Заблокирован
18.08.2014, 22:27     Как вывести фигуру в окне? #6
Цитата Сообщение от Discovert Посмотреть сообщение
это как понимать? А максимум че, DirectX15 ?
После DirectX11 есть уже DirectX11.1 и DirectX11.2 (Window8.1). Скоро выходит DirectX12.
Ну вообще AMD собирается скоро Mantle запускать, который по их словам, порвёт DirectX, а Microsoft говорит, что DirectX12 порвёт Mantle
Ведущий
Заблокирован
19.08.2014, 04:01     Как вывести фигуру в окне? #7
Как вывести фигуру в окне?
Начал изучать DirectX
А зачем для таких простых вещей нужен DirectX?
Фигура трехмерная? Или Вы планируете писать игры, а не приложения с окошками со стандартными кнопочками и пр.?
Discovert
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 5
19.08.2014, 07:24  [ТС]     Как вывести фигуру в окне? #8
Ведущий, Вы знаете, и то, и другое, вероятно. Но для приложений с окошками я привык обходиться с помощью Delphi, да и в C++ для этого вовсе не обязателен DirectX, я в курсе. Так что в случае с cpp меня интересуют именно игры Я знаю также, что существуют различные конструкторы игр, но это не то - я хочу четко понимать, что и когда я делаю, а DirectX, а не, скажем, OpenGL - по двум причинам: во-первых, я уверен, что в ближайшие десятилетия с Windows ничего не случится (с DX, соответственно, тоже), а во-вторых - DirectX сложнее, на мой взгляд, и это своеобразный вызов - не люблю начинать с простого, если от него позже все равно придется отказываться в пользу чего-то более сложного, тем более что от этого простого (например, OpenGL) не будет пользы в дальнейшем - лишняя трата драгоценного времени, получается.

З.Ы. Извините, "поумничаю" - фигура априори двумерна, трехмерный объект принято называть телом
Мой треугольник в этом, как его назвали "гавнакоде" (псевдо-)трехмерен лишь потому, что этого требует функция, но координата Z тут не используется.
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
19.08.2014, 11:59     Как вывести фигуру в окне? #9
Цитата Сообщение от Discovert Посмотреть сообщение
DirectX сложнее
я думал наоборот)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2014, 12:16     Как вывести фигуру в окне?
Еще ссылки по теме:

C++ Вывести текст по словам в окне с определенными интервалами времени
Вывести на экран фигуру из * C++
C++ Вывести на экран геометричесую фигуру, которая состоит из символов "*"

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

Или воспользуйтесь поиском по форуму:
Discovert
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 5
19.08.2014, 12:16  [ТС]     Как вывести фигуру в окне? #10
dzrkot, Ну, азы OpenGL я понял примерно через час после того, как начал о нем читать, а вот в DirectX я ничего не могу понять уже неделю Может быть, это субъективно, конечно...
Yandex
Объявления
19.08.2014, 12:16     Как вывести фигуру в окне?
Ответ Создать тему
Опции темы

Текущее время: 22:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru