質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1813閲覧

OpenGL ChoosePixelFormatの失敗

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/02/02 14:54

前提・実現したいこと

WGLでChoosePixelFormat func.(main.cpp WindowProc WM_CREATE)が失敗してしまいます.PIXELFORMATDESCRIPTORの設定に問題があるのでしょうか?

発生している問題・エラーメッセージ

C

1//main.cpp 2#define UNICODE 3 4#pragma comment(lib,"OpenGL32.lib") 5 6#include <windows.h> 7#include <process.h> 8#include <gl/GL.h> 9#include <gl/GLU.h> 10 11#include "glloop.h" 12 13LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); 14 15const wchar_t CLASS_NAME[] = L"CLASS"; 16 17int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR nCmdLine, int nCmdShow) { 18 UNREFERENCED_PARAMETER(hPrevInstance); 19 UNREFERENCED_PARAMETER(nCmdLine); 20 21 WNDCLASSEX wc = { 22 sizeof(WNDCLASSEX), CS_OWNDC | CS_VREDRAW | CS_HREDRAW, WindowProc, 23 0, 0, hInstance, 24 NULL, (HCURSOR)LoadCursor(NULL,IDC_ARROW), (HBRUSH)GetStockObject(WHITE_BRUSH), 25 NULL, CLASS_NAME, NULL 26 }; 27 28 RegisterClassEx(&wc); 29 30 HWND hwnd = CreateWindowEx( 31 0, CLASS_NAME, L"Template", WS_OVERLAPPEDWINDOW, 32 50, 50, 960, 525, 33 NULL, NULL, hInstance, NULL 34 ); 35 36 ShowWindow(hwnd, nCmdShow); 37 UpdateWindow(hwnd); 38 39 MSG msg = {}; 40 41 while (GetMessage(&msg, NULL, 0, 0) >= 0) { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 46 return (int)msg.wParam; 47} 48 49LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 50 switch (uMsg) { 51 static HANDLE hgl; 52 static unsigned int thId; 53 54 static HDC hdc; 55 static HGLRC glrc; 56 case WM_CREATE: 57 { 58 PIXELFORMATDESCRIPTOR pfd = 59 { 60 sizeof(PIXELFORMATDESCRIPTOR), 1, 61 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 62 PFD_TYPE_RGBA, 32, 63 0, 0, 0, 0, 0, 0, 0, 0, 64 0, 65 0, 0, 0, 0, 66 24, 67 8, 68 0, 69 PFD_MAIN_PLANE, 70 0, 71 0, 0, 0 72 }; 73 74 hdc = GetDC(hwnd); 75 if (hdc == NULL) { 76 MessageBox(hwnd, L"Failed to get HDC", L"Caution", MB_OK); 77 return -1; 78 } 79 80 int format = ChoosePixelFormat(hdc, &pfd); 81 82 if (format == 0) { 83 MessageBox(hwnd, L"pixel format error", L"Caution", MB_OK); 84 return -1; 85 } 86 87 if (SetPixelFormat(hdc, format, &pfd)==FALSE) { 88 MessageBox(hwnd, L"Set error", L"Caution", MB_OK); 89 return -1; 90 } 91 92 glrc = wglCreateContext(hdc); 93 PassHandle ph; 94 ph.hdc = hdc; 95 ph.glrc = glrc; 96 if ((hgl = (HANDLE)_beginthreadex(NULL, 0, (_beginthreadex_proc_type)GLLoop, &ph, 0, &thId)) == NULL) { 97 MessageBox(hwnd, L"Thread error", L"Caution", MB_OK); 98 return -1; 99 } 100 101 102 break; 103 } 104 case WM_PAINT: 105 { 106 PAINTSTRUCT ps = {}; 107 BeginPaint(hwnd, &ps); 108 EndPaint(hwnd, &ps); 109 110 PostThreadMessage(thId, TM_PAINT, 0, 0); 111 } 112 break; 113 114 case WM_CLOSE: 115 { 116 PostThreadMessage(thId, TM_DESTROY, 0, 0); 117 WaitForSingleObject(hgl, INFINITE); 118 wglMakeCurrent(NULL, NULL); 119 wglDeleteContext(glrc); 120 ReleaseDC(hwnd, hdc); 121 122 DestroyWindow(hwnd); 123 } 124 break; 125 126 case WM_DESTROY: 127 PostQuitMessage(0); 128 return 0; 129 } 130 131 return DefWindowProc(hwnd, uMsg, wParam, lParam); 132}

C

1//glloop.h 2#pragma once 3 4#include <Windows.h> 5 6#define TM_PAINT WM_APP+1 7#define TM_DESTROY WM_APP+2 8 9typedef struct _tagPassHandle { 10 HDC hdc; 11 HGLRC glrc; 12}PassHandle; 13 14 15DWORD WINAPI GLLoop(LPDWORD lpdata);

C

1//glloop.cpp 2#define UNICODE 3 4#include "glloop.h" 5#include <gl/GL.h> 6#include <process.h> 7 8 9DWORD WINAPI GLLoop(LPDWORD lpdata) { 10 PassHandle *tps = (PassHandle*)lpdata; 11 12 HDC thdc = tps->hdc; 13 HGLRC tglrc = tps->glrc; 14 15 MSG tMsg = {}; 16 while (GetMessage(&tMsg, NULL, 0, 0) > 0) { 17 18 switch (tMsg.message) { 19 20 case TM_PAINT: 21 { 22 MessageBox(NULL, L"pixel format error", L"Caution", MB_OK); 23 wglMakeCurrent(thdc, tglrc); 24 25 glClearColor(0.0f, 0.5f, 1.0f, 1.0f); 26 glClear(GL_COLOR_BUFFER_BIT); 27 glBegin(GL_LINE_STRIP); 28 29 glVertex2f(0, 0); 30 glVertex2f(0.2, 0.4); 31 32 glEnd(); 33 34 glFlush(); 35 SwapBuffers(thdc); 36 wglMakeCurrent(NULL, NULL); 37 } 38 break; 39 40 case TM_DESTROY: 41 _endthreadex(0); 42 return 0; 43 } 44 } 45}

補足情報

Windows10 Pro
VisualStudio2017 Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

glloopのスレッドでのエラーMessageBoxが表示されているだけでChoosePixelFormatに問題はありませんでした.
修正後も動作はうまくしませんがメインの質問に関しては解決しました.ありがとうございます.

投稿2019/02/03 06:49

Weapon

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問