GLFWで GLFWwindow を使用してウィンドウを描画する際に、既に別プログラムで作成したウィンドウを指定したいのですが可能なのでしょうか?
具体的には以下のように CreateWindow 関数で作成したウィンドウに対して描画処理を行いたいです。
C++
1#include <Windows.h> 2 3... 4 5HWND hwnd = CreateWindow( 6 name, name, 7 WS_OVERLAPPEDWINDOW, 8 CW_USEDEFAULT, CW_USEDEFAULT, 9 CW_USEDEFAULT, CW_USEDEFAULT, 10 NULL, NULL, 11 hInst, NULL 12); 13 14
現在はこちらの質問に回答されていた方法で子ウィンドウとして関連付けている状態なのですが、これではウィンドウのフォーカスが動いてしまって不自然なので直接 GLFWwindow で指定できればと思っています。
https://teratail.com/questions/133167
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答1件
1
ベストアンサー
GLFW使わず直接OpenGLを使うのはダメなんですかね?
CreateWindowでウィンドウ作るなら、GLFW使う意味があまりないような気がするのですが…。
↓直接OpenGLを使うサンプル
C++
1#pragma comment(lib, "OpenGL32.lib")//OpenGL32.libを使用 2#include <windows.h> 3#include <GL/gl.h> 4 5LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 6 7int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow) 8{ 9 //各種変数・構造体宣言 10 HWND hWnd; 11 MSG msg; 12 WNDCLASS WndClass; 13 14 //WNDCLASS構造体を初期化 15 WndClass.style = CS_HREDRAW | CS_VREDRAW; 16 WndClass.lpfnWndProc = WndProc; 17 WndClass.cbClsExtra = 0; 18 WndClass.cbWndExtra = 0; 19 WndClass.hInstance = hInstance; 20 WndClass.hIcon = NULL; 21 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 22 WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 23 WndClass.lpszMenuName = NULL; 24 WndClass.lpszClassName = "OpGlWindow"; 25 26 //WNDCLASSを登録(失敗したら終了) 27 if (!RegisterClass(&WndClass))return FALSE; 28 29 //ウインドウを作成 30 hWnd = CreateWindow( 31 "OpGlWindow", 32 "OpenGLで描画", 33 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 34 CW_USEDEFAULT, CW_USEDEFAULT, 35 640, 480,NULL, NULL, hInstance, NULL); 36 37 //ウインドウ作成に失敗したら終了 38 if (hWnd == NULL)return FALSE; 39 40 //ウインドウを表示 41 ShowWindow(hWnd, nCmdShow); 42 UpdateWindow(hWnd); 43 44 //メインループ 45 while (GetMessage(&msg, NULL, 0, 0)) { 46 DispatchMessage(&msg); 47 } 48 49 //終了 50 return (msg.wParam); 51} 52 53//ウインドウプロージャー 54LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 55{ 56 //ウインドウ一個だからstaticで… 57 static HGLRC glRC; 58 static HDC hdc; 59 60 switch (msg) { 61 case WM_CREATE: {//ウインドウが作成された 62 //表示コンテキストを作成※エラー処理は省略してあります 63 PIXELFORMATDESCRIPTOR pfd ={ 64 sizeof(PIXELFORMATDESCRIPTOR), 65 1,PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 66 32, 0, 0, 0, 0, 0, 0,0,0,0,0, 0, 0, 0,24, 8,0,PFD_MAIN_PLANE,0,0, 0, 0 67 }; 68 hdc = GetDC(hWnd); 69 int format = ChoosePixelFormat(hdc, &pfd); 70 SetPixelFormat(hdc, format, &pfd); 71 glRC = wglCreateContext(hdc); 72 }break; 73 break; 74 case WM_PAINT:{//描画 75 PAINTSTRUCT ps; 76 BeginPaint(hWnd, &ps);//描画の準備 77 wglMakeCurrent(hdc, glRC); 78 glClearColor(0, 0, 0, 1); 79 glClear(GL_COLOR_BUFFER_BIT); 80 81 glBegin(GL_QUADS); //四角形描画 82 glColor3ub(0xFF, 0, 0); 83 glVertex2f(-0.9f, -0.9f); 84 glColor3ub(0, 0xFF, 0); 85 glVertex2f(-0.9f, 0.9f); 86 glColor3ub(0, 0, 0xFF); 87 glVertex2f(0.9f, 0.9f); 88 glColor3ub(0xFF, 0xFF, 0xFF); 89 glVertex2f(0.9f, -0.9f); 90 glEnd(); 91 92 glFlush(); 93 SwapBuffers(hdc); 94 wglMakeCurrent(hdc, 0); 95 EndPaint(hWnd, &ps);//描画の終了 96 }break; 97 case WM_SIZE: //サイズが変更された 98 wglMakeCurrent(hdc, glRC); 99 glViewport(0, 0, LOWORD(lParam), HIWORD(lParam)); 100 glEnd(); 101 wglMakeCurrent(hdc, 0); 102 break; 103 case WM_DESTROY://ウインドウが破棄された 104 wglDeleteContext(glRC); 105 PostQuitMessage(0);//終了メッセージをポスト 106 break; 107 default://それ以外はデフォルトのプロージャに 108 return(DefWindowProc(hWnd, msg, wParam, lParam)); 109 } 110 return 0; 111}
投稿2022/05/02 07:46
総合スコア225
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2022/05/04 02:19