Last active
February 23, 2021 11:57
-
-
Save tuket/0cc2f9b77a4a6a82a72655941547e292 to your computer and use it in GitHub Desktop.
WGL minamal example that enumates display devices
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <windows.h> /* must include this before GL/gl.h */ | |
| #include <GL/gl.h> /* OpenGL header file */ | |
| #include <GL/glu.h> /* OpenGL utilities header file */ | |
| #include <stdio.h> | |
| #pragma comment (lib, "opengl32.lib") | |
| void display() | |
| { | |
| /* rotate a triangle around */ | |
| glClear(GL_COLOR_BUFFER_BIT); | |
| glBegin(GL_TRIANGLES); | |
| glColor3f(1.0f, 0.0f, 0.0f); | |
| glVertex2i(0, 1); | |
| glColor3f(0.0f, 1.0f, 0.0f); | |
| glVertex2i(-1, -1); | |
| glColor3f(0.0f, 0.0f, 1.0f); | |
| glVertex2i(1, -1); | |
| glEnd(); | |
| glFlush(); | |
| } | |
| LONG WINAPI WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) | |
| { | |
| static PAINTSTRUCT ps; | |
| switch (uMsg) { | |
| case WM_PAINT: | |
| display(); | |
| BeginPaint(hWnd, &ps); | |
| EndPaint(hWnd, &ps); | |
| return 0; | |
| case WM_SIZE: | |
| glViewport(0, 0, LOWORD(lParam), HIWORD(lParam)); | |
| PostMessage(hWnd, WM_PAINT, 0, 0); | |
| return 0; | |
| case WM_CHAR: | |
| switch (wParam) { | |
| case 27: /* ESC key */ | |
| PostQuitMessage(0); | |
| break; | |
| } | |
| return 0; | |
| case WM_CLOSE: | |
| PostQuitMessage(0); | |
| return 0; | |
| } | |
| return DefWindowProc(hWnd, uMsg, wParam, lParam); | |
| } | |
| HWND CreateOpenGLWindow(const wchar_t* title, int x, int y, int width, int height, BYTE type, DWORD flags) | |
| { | |
| int pf; | |
| HDC hDC; | |
| HWND hWnd; | |
| WNDCLASS wc; | |
| PIXELFORMATDESCRIPTOR pfd; | |
| static HINSTANCE hInstance = 0; | |
| /* only register the window class once - use hInstance as a flag. */ | |
| if (!hInstance) { | |
| hInstance = GetModuleHandle(NULL); | |
| wc.style = CS_OWNDC; | |
| wc.lpfnWndProc = (WNDPROC)WindowProc; | |
| wc.cbClsExtra = 0; | |
| wc.cbWndExtra = 0; | |
| wc.hInstance = hInstance; | |
| wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); | |
| wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
| wc.hbrBackground = NULL; | |
| wc.lpszMenuName = NULL; | |
| wc.lpszClassName = L"OpenGL"; | |
| if (!RegisterClass(&wc)) { | |
| MessageBox(NULL, L"RegisterClass() failed: " | |
| "Cannot register window class.", L"Error", MB_OK); | |
| return NULL; | |
| } | |
| } | |
| hWnd = CreateWindow(L"OpenGL", title, WS_OVERLAPPEDWINDOW | | |
| WS_CLIPSIBLINGS | WS_CLIPCHILDREN, | |
| x, y, width, height, NULL, NULL, hInstance, NULL); | |
| if (hWnd == NULL) { | |
| MessageBox(NULL, L"CreateWindow() failed: Cannot create a window.", | |
| L"Error", MB_OK); | |
| return NULL; | |
| } | |
| hDC = GetDC(hWnd); | |
| /* there is no guarantee that the contents of the stack that become | |
| the pfd are zeroed, therefore _make sure_ to clear these bits. */ | |
| memset(&pfd, 0, sizeof(pfd)); | |
| pfd.nSize = sizeof(pfd); | |
| pfd.nVersion = 1; | |
| pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | flags; | |
| pfd.iPixelType = type; | |
| pfd.cColorBits = 32; | |
| pf = ChoosePixelFormat(hDC, &pfd); | |
| if (pf == 0) { | |
| MessageBox(NULL, L"ChoosePixelFormat() failed: " | |
| "Cannot find a suitable pixel format.", L"Error", MB_OK); | |
| return 0; | |
| } | |
| if (SetPixelFormat(hDC, pf, &pfd) == FALSE) { | |
| MessageBox(NULL, L"SetPixelFormat() failed: " | |
| "Cannot set format specified.", L"Error", MB_OK); | |
| return 0; | |
| } | |
| DescribePixelFormat(hDC, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd); | |
| ReleaseDC(hWnd, hDC); | |
| return hWnd; | |
| } | |
| extern "C" { | |
| _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; | |
| } | |
| int main() | |
| { | |
| HDC hDC; /* device context */ | |
| HGLRC hRC; /* opengl context */ | |
| HWND hWnd; /* window */ | |
| MSG msg; /* message */ | |
| hWnd = CreateOpenGLWindow(L"minimal", 0, 0, 256, 256, PFD_TYPE_RGBA, 0); | |
| if (hWnd == NULL) | |
| exit(1); | |
| hDC = GetDC(hWnd); | |
| hRC = wglCreateContext(hDC); | |
| wglMakeCurrent(hDC, hRC); | |
| ShowWindow(hWnd, SW_SHOW); | |
| DISPLAY_DEVICE lDevice; | |
| lDevice.cb = sizeof(DISPLAY_DEVICE); | |
| int i = 0; | |
| while (EnumDisplayDevices(NULL, i, &lDevice, EDD_GET_DEVICE_INTERFACE_NAME) != 0) { | |
| printf( | |
| "i: %d\n" | |
| "cb: %d\n" | |
| "DeviceName: %ws\n" | |
| "DeviceString: %ws\n" | |
| "StateFlags: %d\n" | |
| "DeviceID: %ws\n" | |
| "DeviceKey: %ws\n", | |
| i, | |
| lDevice.cb, | |
| lDevice.DeviceName, | |
| lDevice.DeviceString, | |
| lDevice.StateFlags, | |
| lDevice.DeviceID, | |
| lDevice.DeviceKey | |
| ); | |
| i++; | |
| } | |
| while (GetMessage(&msg, hWnd, 0, 0)) { | |
| TranslateMessage(&msg); | |
| DispatchMessage(&msg); | |
| } | |
| wglMakeCurrent(NULL, NULL); | |
| ReleaseDC(hWnd, hDC); | |
| wglDeleteContext(hRC); | |
| DestroyWindow(hWnd); | |
| return msg.wParam; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment