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

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

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

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

C++

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

Q&A

解決済

2回答

708閲覧

OpenGLでウインドウを動かせずカーソルが処理待ち状態になる原因と対処法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/09/02 08:40

提示コードの////コメント部の中だと思われますが提示画像のようにウインドウは表示されますが上のタブを掴んでも動かせずまた画面領域にカーソルを入れると処理待ちになってしまいますまた×印で終了もできません。しかしコンソール画面を閉じると終了されます。これはどうしたらいいのでしょうか?

イメージ説明

#include "io.h" #include "Fcntl.h" #include "stdio.h" #include "Windows.h" #include "glew/include/GL/glew.h" #include "gl/GL.h" #include "Debug.hpp" #//include "Game.hpp" //ウインドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { //終了または閉じる時にプログラムを正常に終了する if( message && WM_DESTROY || message && WM_CLOSE) { PostQuitMessage(0);//正常終了 return 0; } return DefWindowProcW(hWnd,message,wParam,lParam);//意味がない場合 } int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) //int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow ) { Debug::CreateConsoleWindow(); HWND hWnd;//ウインドウハンドル MSG msg = { 0 };//スレッドのメッセージキュー情報 WNDCLASS wc;//汎用ウインドウ HGLRC glRC; HDC dc; int _format; wc.style = CS_HREDRAW | CS_VREDRAW;//ウインドウのスタイル(ウインドウサイズを変更すると自動調整) wc.lpfnWndProc = WndProc;//ウインドウプロシージャを設定 wc.cbClsExtra = 0;//構造体の後ろに補足バイト数 wc.cbWndExtra = 0;//ウインドウインスタンスの後ろに補足バイト数 wc.hInstance = hInstance;//ウインドウプロシージャがあるインスタンスハンドル wc.hIcon = NULL;//アイコンのハンドル wc.hCursor = LoadCursor(NULL,IDC_ARROW);//マウスカーソルのハンドル wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//ウインドウ背景色 wc.lpszMenuName = NULL;//デフォルトのメニュー名 wc.lpszClassName = TEXT("line");//ウインドウクラスに付ける名前 if( !RegisterClass(&wc)) { return 1; } hWnd = nullptr; hWnd = CreateWindow(TEXT("STATIC"), TEXT("WinAPITest"),WS_OVERLAPPEDWINDOW | WS_VISIBLE, 500,500,500,500, NULL,NULL,hInstance,NULL); if(hWnd == NULL) { printf("NULL"); } //ピクセルフォーマットを指定 PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0,0,0,0,0, 0, 0, 0, 0,0,0,0, 24, 8, 0, PFD_MAIN_PLANE, 0, 0,0,0 }; dc = GetDC(hWnd); _format = ChoosePixelFormat(dc,&pfd); if(_format == 0) { printf("%d\n",GetLastError());//Error } //OpenGLが使うデバイスコンテキストに指定のピクセルフォーマットを指定 if( !SetPixelFormat(dc,_format,&pfd) ) { printf("%d\n",GetLastError());//Error } //OpenGLコンテキストを作成 glRC = wglCreateContext(dc); if( !wglMakeCurrent(dc,glRC) ) { printf("%d\n",GetLastError());//Error } glewExperimental = TRUE; GLenum err = glewInit(); if(err != GLEW_OK) { printf("glew 初期化エラー\n"); } /////////////////////////////////////////////////////////////////////////////// while(true) { wglMakeCurrent(dc, glRC); glClearColor(0.0f, 0.5f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glRectf(-0.5f, -0.5f, 0.5f, 0.5f); glFlush(); SwapBuffers(dc); // wglMakeCurrent(NULL, NULL); UpdateWindow(hWnd); } ///////////////////////////////////////////////////////////////////////////// Debug::closeConsoleWindow(); return 0; } int main() { }

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

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

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

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

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

guest

回答2

0

ベストアンサー

c++

1if( PeekMessage(&msg,hWnd,0,0,PM_REMOVE) ){ 2 TranslateMessage(&msg); 3 DispatchMessage(&msg); 4}

UpdateWindowの代わりにいれてみてはいかがでしょうか?


追記

閉じた時に終了しないのならば

c++

1if( PeekMessage(&msg,hWnd,0,0,PM_REMOVE) ){ 2 if(msg.message == WM_QUIT) break; // 追加 3 TranslateMessage(&msg); 4 DispatchMessage(&msg); 5}

投稿2020/09/02 09:02

編集2020/09/02 10:27
asm

総合スコア15149

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

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

退会済みユーザー

退会済みユーザー

2020/09/02 09:04

マウスカーソルの処理待ちの青い丸いはなくなりました。が ウインドウが動かせない等のウインドウがフリーズする現象はなくなりませんw
asm

2020/09/02 09:12

> wc.lpszClassName = TEXT("line");//ウインドウクラスに付ける名前 > hWnd = CreateWindow(TEXT("STATIC"), TEXT("WinAPITest"),WS_OVERLAPPEDWINDOW | WS_VISIBLE, クラス名が別な事が問題ですね。 どちらかに統一してください
退会済みユーザー

退会済みユーザー

2020/09/02 10:04 編集

> wc.lpszClassName = TEXT("STATIC") > hWnd = CreateWindowW(TEXT("STATIC"),TEXT("WinAPITest") ,WS_OVERLAPPEDWINDOW | WS_VISIBLE, 500,500,500,500, NULL,NULL,hInstance,NULL); に変更しました。がウインドウが動きませんwどうしたらいいのでしょうか?
fana

2020/09/02 09:37

とりあえず,この回答内容だと while(true){...} から抜けられない予感.
asm

2020/09/02 10:19

CreateWindow側のリファレンスを参照するとわかるかと思いますが hWnd = CreateWindow(TEXT("WinAPITest"),TEXT("title") ... ですね > とりあえず,この回答内容だと while(true){...} から抜けられない予感. DefWindowProcに勝手に閉じられた記憶がありましたが終了まではしてないのですね。。。
fana

2020/09/02 10:38

ところでコレ,この状態から {ウィンドウの作り方,メッセージループを書きましょう,終了できるようにしましょう,ウィンドウプロシージャ内の記述,GLがどうの…} という諸々をまともな形にするところまでここで面倒見るんでしょうか? (とりあえず自動生成コードからスタートしたら? と言っているのはそういう方向の理由があるのだけど… まぁ空っぽから書くのは自由だけども,それならそれで,せめてそれに必要な相応のことを調査/勉強して雛形相当のコードを書くところまでは独力でやってみるべきではなくて? GLとか混ぜ込む前に.)
guest

0

メッセージ処理を実装してください.

少し前の質問にも書きましたが,Visual Studioを使っているならば,そこらへんのテンプレなコードを自動生成させた状態から実装を開始してはどうでしょうか.

投稿2020/09/02 09:01

編集2020/09/02 09:04
fana

総合スコア11996

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

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

退会済みユーザー

退会済みユーザー

2020/09/02 09:08 編集

なるほど、メッセージ処理はなんでしょうか?ウインドウプロシージャのことでしょうか?
fana

2020/09/02 09:15

他回答がついていますが,メッセージの有無を調べて,ある場合は適切に処理する(ウィンドウプロシージャが処理できるようにする)ことです.
fana

2020/09/02 09:17

> if( message && WM_DESTROY || message && WM_CLOSE) ウィンドウプロシージャも,ここらへんからもうまずそうだし.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問