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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

Q&A

解決済

1回答

1011閲覧

GLFWのGLFWwindowに既に作成済みのウィンドウを指定したい

Scald

総合スコア36

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

GLFW

GLFWは、OpenGLを使用してアプリ開発を行うためのフレームワークです。Macにも対応しているマルチプラットフォームであることが特徴。ウィンドウ管理、解像度切り替え、入力管理などの機能を持ちます。

OpenGL

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

0グッド

0クリップ

投稿2022/04/29 12:52

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ページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

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

kousatu

総合スコア225

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

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

Scald

2022/05/04 02:19

なるほど! 直接WndProcのPAINTイベントに書き込んでしまえばよかったのですね! 全く思いつかなかったです、、 ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問