Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для SuurKissat
34 / 34 / 16
Регистрация: 11.01.2015
Сообщений: 130

Первый опыт с DirectX9. Странное поведение программы

02.05.2015, 18:08. Показов 998. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил начать осваивать DirectX. Взял код из этого урока, где рисуется треугольник
http://www.directxtutorial.com... onid=9-4-4 также почитал немного Луна ()

Переделал кое-что, ввел свою функцию рисования однотонного прямоугольника. Также сделал чтобы по щелчку мыши рисовало прямоугольник от точки где нажата мышь до точки где мышь отпущена. Все это каким-то чудом (я начал читать вчера вечером и прогер не великий...) почти работает. Чего не хватает для счастья...
Рисуется первый прямоугольник - все нормально. Рисуется второй - переходит программа из полноэкранного в оконный режим и первый прямоугольник исчезает. Рисуется третий - программа возвращается в полноэкранный и видны первый и третий прямоугольники, но не второй. Далее по циклу.
Нечетное число рисований прямоугольника - полноэкранный режим, видны нечетные.
Четное число - оконный режим, видны четные.
Такое впечатление, что я где-то умудряюсь случайно работать с какими-то двумя буфферами, а надо с одним. Вот.
Далее полный код того, что слепил. На всякий случай - компилировал MinGW

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
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <d3d9.h>
 
 
// define the screen resolution
#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600
 
// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")
 
// global declarations
LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer
 
// function prototypes
void initD3D(HWND hWnd);    // sets up and initializes Direct3D
///void render_frame(void);    // renders a single frame
void cleanD3D(void);    // closes Direct3D and releases memory
 
 
inline POINT mouse_coord();
int isLButtonDown();
int isRButtonDown();
int click_info(int *x1,int *y1,int *x2,int *y2);
int drawbar(const int x1,const int y1,const int x2,const int y2,const int color1,const int color2,const int color3);
 
 
struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
 
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
 
 
// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    HWND hWnd;
    WNDCLASSEX wc;
 
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
 
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass";
 
    RegisterClassEx(&wc);
 
    hWnd = CreateWindowEx(NULL,
                          "WindowClass",
                          "Our Direct3D Program",
                          WS_OVERLAPPEDWINDOW,
                          0, 0,
                          SCREEN_WIDTH, SCREEN_HEIGHT,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);
 
    ShowWindow(hWnd, nCmdShow);
 
    // set up and initialize Direct3D
    initD3D(hWnd);
 
    // enter the main loop:
 
    MSG msg;
    
    for(int i=0;i<5;i++){
        const int s=50;
        drawbar(s*i,s*i,s*i+s,s*i+s,255,255,255);
    
    }
    while(TRUE)
    {
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
 
        if(msg.message == WM_QUIT)
            break;
        
        if(isLButtonDown())
        {
            int x1,y1,x2,y2;            
            click_info(&x1,&y1,&x2,&y2);
            drawbar(x1,y1,x2,y2,0,100,100);
        }
 
    }
 
    cleanD3D();
 
    return msg.wParam;
}
 
 
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            } break;
    }
 
    return DefWindowProc (hWnd, message, wParam, lParam);
}
 
 
// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
 
    D3DPRESENT_PARAMETERS d3dpp;
 
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = FALSE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;
 
    // create a device class using this information and the info from the d3dpp stuct
    d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3ddev);
                        d3ddev->SetFVF(CUSTOMFVF);
    //d3ddev->SetFVF(CUSTOMFVF);
    //d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
 
}
 
 
 
// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    v_buffer->Release();    // close and release the vertex buffer
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D
}
 
 
 
inline POINT mouse_coord(){
    POINT rez;
    GetCursorPos(&rez);
    return rez;
}///Возвращает понятно что - объект точку координаты мыши
 
int isLButtonDown()
{
  SHORT state = GetAsyncKeyState(VK_LBUTTON);
  return (state & 0x8000) != 0; // == 0 - just to force bool value 
}
 
int isRButtonDown()
{
  SHORT state = GetAsyncKeyState(VK_RBUTTON);
  return (state & 0x8000) != 0; // == 0 - just to force bool value 
}
 
 
int click_info(int *x1,int *y1,int *x2,int *y2)
{
    POINT buff;
    int FLAG=0;
    for(;FLAG==0;)
    {
        if(isLButtonDown()){FLAG=1;}
        if(isRButtonDown()){FLAG=2;}
    }
    buff=mouse_coord();
    *x1=buff.x;
    *y1=buff.y;
    
    if(FLAG==1){for(;isLButtonDown();){}}
    if(FLAG==2){for(;isRButtonDown();){}}
    buff=mouse_coord();
    *x2=buff.x;
    *y2=buff.y;
    
    return FLAG;
}
 
 
 
 
int drawbar(const int x1,const int y1,const int x2,const int y2,const int color1,const int color2,const int color3)
{
    const double _x1=x1;
    const double _y1=y1;
    const double _x2=x2;
    const double _y2=y2;
    
    const int C1=color1;
    const int C2=color2;
    const int C3=color3;
        
    CUSTOMVERTEX vertices[] =
    {
        {_x1,_y1, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
        {_x2,_y1, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
        {_x1,_y2, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
        {_x2,_y1, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
        {_x2,_y2, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
        {_x1,_y2, 0.5f, 1.0f, D3DCOLOR_XRGB(C1,C2,C3),},
    };
 
    d3ddev->CreateVertexBuffer(6*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               &v_buffer,
                               NULL);
 
    VOID* pVoid;    // a void pointer
 
    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();
    
    ///////////////////
    
    d3ddev->BeginScene();
    
    d3ddev->SetFVF(CUSTOMFVF);
    d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
    d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
 
    d3ddev->EndScene();
 
    d3ddev->Present(NULL, NULL, NULL, NULL);
 
    return 0;
}
Добавлено через 8 минут
Добавка мелкая
также почитал немного Луна ()
речь вел о книге Луна Фрэнк Д. Введение в программирование трехмерных игр с DirectX 9.0
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2015, 18:08
Ответы с готовыми решениями:

странное поведение программы
Подскажите в чем мб дело, может быть это не на этот форум вопрос, если так , то отправьте, пожалуйста куда нужно :) Дело в том, что...

Странное поведение программы
Странное поведение программы. Почему выводит эту, извините, ерунду в отображении после кнопки submit-а? Ребята, неужели я где-то забыл...

Странное поведение программы
#include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;ctime&gt; #include &quot;windows.h&quot; #include &lt;Windows.h&gt; #include &lt;ctime&gt; using...

2
 Аватар для SuurKissat
34 / 34 / 16
Регистрация: 11.01.2015
Сообщений: 130
02.05.2015, 20:57  [ТС]
Небольшая добавка. Я работаю на WindiwsXP, послал экзешник другу, у которого Windows7. У него в оконный не переходит, хотя ситуация с "четно-нечетными" та же самая. У меня тоже не совсем полноэкранный, как происходит - вот скрин.
Миниатюры
Первый опыт с DirectX9. Странное поведение программы  
0
 Аватар для SuurKissat
34 / 34 / 16
Регистрация: 11.01.2015
Сообщений: 130
03.05.2015, 21:40  [ТС]
Кое-что удалось! Посмотрел пример специально про полный экран
http://www.directxtutorial.com... onid=9-4-2
У себя в строке 63 сменил флаг WS_OVERLAPPEDWINDOW на WS_EX_TOPMOST | WS_POPUP .
После этого переход в "полуоконный режим" исчез.
Но "четно-нечетное отображение" по прежнему...

Добавлено через 8 часов 24 минуты
Ура!!! Замена
C++
1
d3dpp.SwapEffect = D3DSWAPEFFECT_D[B]ISCARD[/B];
на
C++
1
d3dpp.SwapEffect = D3DSWAPEFFECT_[B]COPY[/B];
Дала нормальное поведение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2015, 21:40
Помогаю со студенческими работами здесь

Странное поведение программы
Перечитываю Герберт Шилдт: С++ базовый курс. Простая программа: #include &lt;iostream&gt; using namespace std; int main() { ...

Странное поведение программы
Здравствуйте! Написал я программу (вот задание: &quot;Пользователь вводит email. Осуществить проверку на корректность (длина больше...

Странное поведение программы
Ниже - черновик. Когда программа выходит из условия if (question_mark != NULL) , то переменная path равна значению buf, что правильно. Но...

Странное поведение программы
Здравствуйте и доброго дня, уважаемые. Куря в интернетах мануалы и статьи по C++ для начинающих я наткнулся на вот такой пример...

Странное поведение программы
Здравствуйте, у меня проблема. В силу какой-то причины результатом вычисления выражения при значениях PA и PB равных 0 и 1 соответственно,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru