у меня при вервом обращение к компоненту класа вылетает ошибка
Кликните здесь для просмотра всего текста
C++ | 1
2
3
4
| CwindowP::CwindowP(HINSTANCE hInstance)
{
WINDOWP( hInstance);
} |
|
Кликните здесь для просмотра всего текста
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
| LRESULT CALLBACK CwindowP::WndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
RECT Screen; // используется позднее для размеров окна
GLuint PixelFormat;
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), // Размер этой структуры
1, // Номер версии (?)
PFD_DRAW_TO_WINDOW |// Формат для Окна
PFD_SUPPORT_OPENGL |// Формат для OpenGL
PFD_DOUBLEBUFFER,// Формат для двойного буфера
PFD_TYPE_RGBA, // Требуется RGBA формат
16, // Выбор 16 бит глубины цвета
0, 0, 0, 0, 0, 0,// Игнорирование цветовых битов (?)
0, // нет буфера прозрачности
0, // Сдвиговый бит игнорируется (?)
0, // Нет буфера аккумуляции
0, 0, 0, 0, // Биты аккумуляции игнорируются (?)
16, // 16 битный Z-буфер (буфер глубины)
0, // Нет буфера траффарета
0, // Нет вспомогательных буферов (?)
PFD_MAIN_PLANE, // Главный слой рисования
0, // Резерв (?)
0, 0, 0 // Маски слоя игнорируются (?)
};
switch (message) // Тип сообщения
{
case WM_CREATE:
this->hDC = GetDC(hWnd); // Получить контекст устройства для окна
PixelFormat = ChoosePixelFormat(hDC, &pfd);
// Найти ближайшее совпадение для нашего формата пикселов
if (!PixelFormat)
{
MessageBoxA(0,"Can't Find A Suitable PixelFormat.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
// Это сообщение говорит, что программа должна завершится
break; // Предтовращение повтора кода
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
{
MessageBoxA(0,"Can't Set The PixelFormat.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
hRC = wglCreateContext(hDC);
if(!hRC)
{
MessageBoxA(0,"Can't Create A GL Rendering Context.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
if(!wglMakeCurrent(hDC, hRC))
{
MessageBoxA(0,"Can't activate GLRC.","Error",MB_OK|MB_ICONERROR);
PostQuitMessage(0);
break;
}
GetClientRect(hWnd, &Screen);
InitGL(Screen.right, Screen.bottom);
BuildFont();
break;
case WM_DESTROY:
case WM_CLOSE:
ChangeDisplaySettings(NULL, 0);
wglMakeCurrent(hDC,NULL);
wglDeleteContext(hRC);
ReleaseDC(hWnd,hDC);
KillFont();
PostQuitMessage(0);
break;
case WM_KEYDOWN:
keys[wParam] = TRUE;
break;
case WM_KEYUP:
keys[wParam] = FALSE;
break;
case WM_SIZE:
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
break;
case WM_MBUTTONDOWN:
mouse_click_middle = true;
GetCursorPos(&mouse_position_last);
break;
case WM_MBUTTONUP:
mouse_click_middle = false;
break;
case WM_MOUSEMOVE:
if (mouse_click_middle)
{
GetCursorPos(&mouse_position);
CameraViev::y -= (mouse_position.x - mouse_position_last.x) * CameraViev::speed_rotate_angle;
CameraViev::x += (mouse_position.y - mouse_position_last.y) * CameraViev::speed_rotate_angle;
memcpy(&mouse_position_last,&mouse_position,sizeof(POINT));
}
break;
case WM_MOUSEWHEEL:
float wheelDelta;
wheelDelta= GET_WHEEL_DELTA_WPARAM(wParam);
if (mouse_click_middle)
CameraViev::z += wheelDelta * CameraViev::speed_rotate_angle;
else
CameraViev::zoom += wheelDelta * CameraViev::speed_zoom;
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
} |
|
Кликните здесь для просмотра всего текста
C++ | 1
2
3
4
| inline static LRESULT CALLBACK CwindowP::mainwindowproc_pseudo(HWND hWnd,UINT message,WPARAM wParam, LPARAM lParam)
{
return wndlist.find(hWnd)->second->WndProc(hWnd, message, wParam, lParam);
} |
|
Кликните здесь для просмотра всего текста
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
| LPTHREAD_START_ROUTINE CwindowP::WINDOWP ( LPVOID lpThreadParameter)
{
InitGL();
HINSTANCE hInstance = (HINSTANCE)lpThreadParameter;
MSG msg; // Структура сообщения Windows
WNDCLASS wc; // Структура класса Windows для установки типа окна
HWND hWnd;// Сохранение дискриптора окна
wndlist[hWnd] = this;
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = mainwindowproc_pseudo;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGL WinClass";
if(!RegisterClass(&wc))
{
MessageBoxA(0,"Failed To Register The Window Class.","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
hWnd = CreateWindowA(
"OpenGL WinClass",
"Jeff Molofee's GL Code Tutorial ... NeHe '99", // Заголовок вверху окна
WS_POPUP |
WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0, // Позиция окна на экране
1280, 1024, // Ширина и высота окна
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
{
MessageBoxA(0,"Window Creation Error.","Error",MB_OK|MB_ICONERROR);
return FALSE;
}
DEVMODE dmScreenSettings; // Режим работы
memset(&dmScreenSettings, 0, sizeof(DEVMODE)); // Очистка для хранения установок
dmScreenSettings.dmSize = sizeof(DEVMODE); // Размер структуры Devmode
dmScreenSettings.dmPelsWidth = 1280; // Ширина экрана
dmScreenSettings.dmPelsHeight = 1024; // Высота экрана
dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; // Режим Пиксела
ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN);
// Переключение в полный экран
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
SetFocus(hWnd);
//SetTimer(hWnd,0, frame_rate,(TIMERPROC)&FDraw);
while (1)
{
// Обработка всех сообщений
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
return (LPTHREAD_START_ROUTINE)TRUE;
}
}
//DrawGLScene(); // Нарисовать сцену
//SwapBuffers(hDC); // Переключить буфер экрана
if (keys[VK_ESCAPE]) SendMessage(hWnd,WM_CLOSE,0,0); // Если ESC - выйти
}
} |
|
0
|