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

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

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

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

Q&A

解決済

1回答

1527閲覧

wxwdgetsでキーイベントが取得できない

gochuumonha

総合スコア74

C++

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

0グッド

0クリップ

投稿2016/11/19 18:09

最近wxwdgetsを用いてソフト開発を始めたのですが、キーイベントの取得方法がどうしてもわからなかったので質問させていただきました。キーイベント取得はソースコード中に(1)とコメントしてます。EVT_KEY_DOWN(TestGLCanvas::OnKeyDown)というマクロです。

実行結果は以下のようになってます。
イメージ説明

クリックは取得できているので、左側の描画されているパネルの上で右クリックするとクリックされたことを取得できます。
イメージ説明

なのでキーを押したときにプログラムが、どのクラスのマクロを呼び出せばいいのかわかってないのだと考えたのですが、どうすれば解決するのかわかりませんでした(全くの見当違いかもしれませんが……)。

些細なことでもいいので、教えていただけると幸いです。
よろしくお願いします。

wxFrameを継承した関数からは、

C++

1panel_1 = new wxPanel(this, wxID_ANY); 2window_1 = new TestGLCanvas(panel_1, wxID_ANY);

のように呼ばれています。

以下、ソースコードです。

c++

1// TestGLCanvas.cpp 2 3#include "stdafx.h" 4#include "iostream" 5 6#include "wx/wx.h" 7#include "wx/sizer.h" 8#include "wx/glcanvas.h" 9#include "TestGLCanvas.h" 10 11// include OpenGL 12#ifdef __WXMAC__ 13#include "OpenGL/glu.h" 14#include "OpenGL/gl.h" 15#else 16#include <GL/glu.h> 17#include <GL/gl.h> 18#endif 19 20 21wxBEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas) 22 EVT_SIZE(TestGLCanvas::OnSize) 23 EVT_PAINT(TestGLCanvas::render) 24 EVT_ERASE_BACKGROUND(TestGLCanvas::OnEraseBackground) 25 EVT_RIGHT_DOWN(TestGLCanvas::rightClick) 26 EVT_MOUSE_EVENTS(TestGLCanvas::OnMouse) 27 EVT_KEY_DOWN(TestGLCanvas::OnKeyDown)//------(1)------ 28 EVT_KEY_UP(TestGLCanvas::keyReleased) 29 EVT_LEAVE_WINDOW(TestGLCanvas::mouseLeftWindow) 30 EVT_MOUSEWHEEL(TestGLCanvas::mouseWheelMoved) 31wxEND_EVENT_TABLE() 32 33 34 35void TestGLCanvas::OnSize(wxSizeEvent &event) 36{ 37 Refresh(); 38} 39 40void TestGLCanvas::OnEraseBackground(wxEraseEvent& event) 41{ 42 // Do nothing, to avoid flashing. 43} 44 45void TestGLCanvas::OnMouse(wxMouseEvent& event) 46{ 47 48} 49 50void TestGLCanvas::OnKeyDown(wxKeyEvent& event) 51{ 52 switch (event.GetKeyCode()) 53 { 54 case WXK_RIGHT: 55 wxMessageBox(wxT("rigrt")); 56 break; 57 58 case WXK_LEFT: 59 wxMessageBox(wxT("left")); 60 break; 61 62 case WXK_DOWN: 63 wxMessageBox(wxT("down")); 64 break; 65 66 case WXK_UP: 67 wxMessageBox(wxT("up")); 68 break; 69 70 case WXK_SPACE: 71 wxMessageBox(wxT("space")); 72 break; 73 74 case WXK_F1: 75 wxMessageBox(wxT("f1")); 76 break; 77 78 default: 79 event.Skip(); 80 return; 81 } 82} 83void TestGLCanvas::keyReleased(wxKeyEvent& event) {} 84 85void TestGLCanvas::rightClick(wxMouseEvent& event) 86{ 87 wxMessageBox(wxT("right click")); 88} 89 90void TestGLCanvas::mouseLeftWindow(wxMouseEvent& event) { 91 wxMessageBox(wxT("left or leave ?")); 92} 93 94void TestGLCanvas::mouseWheelMoved(wxMouseEvent& event) {} 95 96void TestGLCanvas::prepare3DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y) 97{ 98 99 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background 100 glClearDepth(1.0f); // Depth Buffer Setup 101 glEnable(GL_DEPTH_TEST); // Enables Depth Testing 102 glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do 103 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 104 105 glEnable(GL_COLOR_MATERIAL); 106 107 glViewport(topleft_x, topleft_y, bottomrigth_x - topleft_x, bottomrigth_y - topleft_y); 108 glMatrixMode(GL_PROJECTION); 109 glLoadIdentity(); 110 111 float ratio_w_h = (float)(bottomrigth_x - topleft_x) / (float)(bottomrigth_y - topleft_y); 112 gluPerspective(45 /*view angle*/, ratio_w_h, 0.1 /*clip close*/, 200 /*clip far*/); 113 glMatrixMode(GL_MODELVIEW); 114 glLoadIdentity(); 115 116} 117 118GLfloat v[8][3]; 119GLint faces[6][4] = { /* Vertex indices for the 6 faces of a cube. */ 120 { 0, 1, 2, 3 },{ 3, 2, 6, 7 },{ 7, 6, 5, 4 }, 121 { 4, 5, 1, 0 },{ 5, 6, 2, 1 },{ 7, 4, 0, 3 } }; 122 123TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id) 124 :wxGLCanvas(parent, wxID_ANY, NULL, 125 wxDefaultPosition, wxDefaultSize, 126 wxFULL_REPAINT_ON_RESIZE) 127{ 128 m_context = new wxGLContext(this); 129 130 v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1; 131 v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1; 132 v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1; 133 v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1; 134 v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1; 135 v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1; 136 137 // To avoid flashing on MSW 138 SetBackgroundStyle(wxBG_STYLE_CUSTOM); 139} 140 141TestGLCanvas::~TestGLCanvas() 142{ 143 delete m_context; 144} 145 146/** Inits the OpenGL viewport for drawing in 2D. */ 147void TestGLCanvas::prepare2DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y) 148{ 149 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background 150 glEnable(GL_TEXTURE_2D); // textures 151 glEnable(GL_COLOR_MATERIAL); 152 glEnable(GL_BLEND); 153 glDisable(GL_DEPTH_TEST); 154 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 155 156 glViewport(topleft_x, topleft_y, bottomrigth_x - topleft_x, bottomrigth_y - topleft_y); 157 glMatrixMode(GL_PROJECTION); 158 glLoadIdentity(); 159 160 gluOrtho2D(topleft_x, bottomrigth_x, bottomrigth_y, topleft_y); 161 glMatrixMode(GL_MODELVIEW); 162 glLoadIdentity(); 163} 164 165int TestGLCanvas::getWidth() 166{ 167 return GetSize().x; 168} 169 170int TestGLCanvas::getHeight() 171{ 172 return GetSize().y; 173} 174 175void TestGLCanvas::render(wxPaintEvent& evt) 176{ 177 if (!IsShown()) return; 178 179 wxGLCanvas::SetCurrent(*m_context); 180 wxPaintDC(this); // only to be used in paint events. use wxClientDC to paint outside the paint event 181 182 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 183 184 // ------------- draw some 2D ---------------- 185 prepare2DViewport(0, 0, getWidth() / 2, getHeight()); 186 glLoadIdentity(); 187 188 // white background 189 glColor4f(1, 1, 1, 1); 190 glBegin(GL_QUADS); 191 glVertex3f(0, 0, 0); 192 glVertex3f(getWidth(), 0, 0); 193 glVertex3f(getWidth(), getHeight(), 0); 194 glVertex3f(0, getHeight(), 0); 195 glEnd(); 196 197 // red square 198 glColor4f(1, 0, 0, 1); 199 glBegin(GL_QUADS); 200 glVertex3f(getWidth() / 8, getHeight() / 3, 0); 201 glVertex3f(getWidth() * 3 / 8, getHeight() / 3, 0); 202 glVertex3f(getWidth() * 3 / 8, getHeight() * 2 / 3, 0); 203 glVertex3f(getWidth() / 8, getHeight() * 2 / 3, 0); 204 glEnd(); 205 206 // ------------- draw some 3D ---------------- 207 prepare3DViewport(getWidth() / 2, 0, getWidth(), getHeight()); 208 glLoadIdentity(); 209 210 glColor4f(0, 0, 1, 1); 211 glTranslatef(0, 0, -5); 212 glRotatef(50.0f, 0.0f, 1.0f, 0.0f); 213 214 glColor4f(1, 0, 0, 1); 215 for (int i = 0; i < 6; i++) 216 { 217 glBegin(GL_LINE_STRIP); 218 glVertex3fv(&v[faces[i][0]][0]); 219 glVertex3fv(&v[faces[i][1]][0]); 220 glVertex3fv(&v[faces[i][2]][0]); 221 glVertex3fv(&v[faces[i][3]][0]); 222 glVertex3fv(&v[faces[i][0]][0]); 223 glEnd(); 224 } 225 226 glFlush(); 227 SwapBuffers(); 228}

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

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

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

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

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

guest

回答1

0

自己解決

どうやらwxgladeの使い方が悪かったみたいです。
シンプルにしてみたらうまく動いたので解決しました。

投稿2016/11/20 16:56

gochuumonha

総合スコア74

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問