初歩の初歩、ウィンドウの表示を行なうプログラムを書きたいと思います。
とは言え、wxWidgets ライブラリを使う場合の基本的なことがわかると思うので、コードの意味を考えながら、プログラムの動きを見てください。
このページで登場する wxWidgets のクラスは、以下の 3 つです。
それではソースコードです。
まあ、sample ディレクトリにある「minimal」のコードからさらに削っただけですが。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. |
|
実行結果はこちら

それじゃまあ、重要なマクロ, メソッドを紹介します。
wxFrame::wxFrame (wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=wxDEFAULT_FRAME_STYLE, const wxString& name=wxFrameNameStr)wxFrame のコンストラクタ。parent には 親ウィンドウのポインタを渡す。
| 定数名 | 意味 |
| wxDEFAULT_FRAME_STYLE | wxCAPTION, wxSYSTEM_MENU, wxMINIMIZE_BOX, wxMAXIMIZE_BOX, wxCLOSE_BOX, wxRESIZE_BORDER, wxCLIP_CHILDREN を有効にする |
| wxCAPTION | ウィンドウの枠とタイトルバーを表示 (最小化・最大化ボタン, 「閉じる」ボタンを表示したいなら必須) |
| wxSYSTEM_MENU | システムメニューを表示する(Windows のみ?)動作の一貫性を保つため、wxCAPTION と一緒に使用することが推奨されている |
| wxMINIMIZE_BOX | ウィンドウの最小化ボタンを表示 |
| wxMAXIMIZE_BOX | ウィンドウの最大化ボタンを表示 |
| wxCLOSE_BOX | 「閉じる」ボタンを表示 |
| wxRESIZE_BORDER | ウィンドウのリサイズを許可する |
| wxCLIP_CHILDREN | 子ウィンドウが描画される際、下にある親ウィンドウも再描画する(Windows のみ) |
| wxFRAME_EX_METAL | メタリックフレームなウィンドウの枠にする(Mac OS X のみ) |
プログラムの流れはこんな感じです。
wxApp の派生クラスの myApp ですが、これは wxWidgets を使った GUI アプリケーションの場合は必須らしいです。
仮想関数である OnInit をオーバーライドすると、そこに書いた処理がプログラム起動時に実行されると。
今回のプログラムだと、ウィンドウを作成して、問題がなければ true を返す感じ。
wxFrame の派生クラスの myFrame は、title(ウィンドウの題名)を引数にとって、ウィンドウの設定を行なっている感じ。
なお、ヘッダファイルの 1 ~ 10 行目の部分は、ライブラリを作った人たちが色々試してみて、一番エラーが少なかった結果らしいです。
ということで、基本的にはここの部分については何もいじらず、常にコピペで大丈夫と思います。
次はもう少し設定を加えてみます。
最初にソースコードを書いていきます。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. |
|
実行結果はこちら。
それでは、太字で示した関数の紹介をします。
template<typename EventTag, typename Class, typename EventArg, typename EventHandler> void wxEvtHandler::Bind(const EventTag& eventType, void(Class::*)(EventArg& ) method, EventHandler* handler, int id = wxID_ANY, int lastId = wxID_ANY, wxObject* userData = NULL)イベントハンドラを登録するためのメソッド。(2.9.0 以降)
| 定数名 | 意味 |
| wxOK | 「Ok」ボタンを表示 |
| wxCANCEL | 「Cancel」ボタンを表示すると同時に「×」ボタンを有効にする wxOK, または wxYES_NO と一緒に使わなければいけない |
| wxYES_NO | 「Yes」「No」ボタンを表示する。Windows の場合、「×」ボタンが使えなくなる |
| wx_HELP | 「ヘルプ」ボタンを表示(2.9.3 以降?)。Cocoa ではメインスレッド以外から呼び出した場合には使えず、Carbon では完全にサポートされていない |
| wxOK_DEFAULT | デフォルトで「Ok」ボタンにフォーカスを当てておく。 wxOK が有効になっている必要がある |
| wxCANCEL_DEFAULT | デフォルトで「Cancel」ボタンにフォーカスを当てておく。 wxCancel が有効になっている必要がある |
| wxYES_DEFAULT | デフォルトで「Yes」ボタンにフォーカスを当てておく |
| wxNO_DEFAULT | デフォルトで「No」ボタンにフォーカスを当てておく |
| wxICON_NONE | メッセージボックスにアイコンを表示しない |
| wxICON_EXCLAMATION | 警告を表すアイコンを、メッセージの左側に表示 |
| wxICON_ERROR | エラーを表すアイコンを、メッセージの左側に表示 |
| wxICON_HAND | エラーシンボルである「手のひら」アイコンを、メッセージの左側に表示(Windows だと wxICON_ERROR と一緒?) |
| wxICON_QUESTION | 質問を表すアイコンを、メッセージの左側に表示 |
| wxICON_INFORMATION | 情報を表すアイコンを、メッセージの左側に表示 |
| wxSTAY_ON_TOP | メッセージボックスを、全てのウィンドウの最上面に存在し続けるようにする |
| wxCENTRE | ディスプレイ中央にメッセージボックスを表示 |
関数やマクロの説明が結構大雑把だったり、英語を直訳したような感じなのですが、もう少しわかりやすい表現が書けたらな…と思う。
最初はイベントハンドラの登録を DECLARE_EVENT_TABLE() や wxBEGIN_EVENT_TABLE(), wxEND_EVENT_TABLE のマクロで行なっていたのですが、このページを作成中、この記事を見て早速 Bind を使う方法に切り替えました。
それにしても、GLUT だとウィンドウを閉じる時に終了確認が出来なかった(freeglut は出来るかも)ので、終了確認が実装出来るようになったことが個人的にかなり嬉しい。
それでは後もう 1 つ、描画領域の縦横比を固定する機能を付け加えます。
「必要か?」と思われる方もいるかもですが、思いっきり私怨が入っています。
というのも“自分”の使っているモニタが 16 : 9 なので、4 : 3 の画面のゲームをフルスクリーンにすると、縦横比が崩れることがよくあって「フルスクリーン使えねーよ!」とよく思っていました。
それはともかくプログラムを書いてみます。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. |
|
実行結果の画像は、今回はなし。
にしても、今のところはあまりソースコードが長くならずに済んでますねー。
ということで、太字で示した関数の紹介を。
| 定数名 | 意味 |
| wxFULLSCREEN_NOMENUBAR | メニューバーを隠す |
| wxFULLSCREEN_NOTOOLBAR | ツールバーを隠す |
| wxFULLSCREEN_NOSTATUSBAR | ステータスバーを隠す |
| wxFULLSCREEN_NOBORDER | ウィンドウの境界を隠す |
| wxFULLSCREEN_NOCAPTION | キャプション(「×」ボタンとかウィンドウ名が書かれている部分)を隠す |
| wxFULLSCREEN_ALL | 上のオプション全てを有効にする |
本当は最大化ボタンか F11 キーを押すことでフルスクリーンモードと通常のウィンドウモードを切り替える、ということをやりたかったのですが……
よくわからないんだけど、最大化ボタンを押して wxMaximizeEvent が発生した時にフルスクリーンモードをオンにする処理を書いただけなのに、何か他の処理もやっているんだか知らないけど上手くいかない。
しょうがないから、F11 キーだけで切り替えるようにして、最大化ボタンは無効にしておいた。
何がいけないんだろう?
後、詳しくは次のページで書きますが、Skip() を行なっても上の階層のオブジェクトへとイベントが伝播しない場合があります。
その場合、伝播レベルを適当な数字に設定する必要があるので注意。
それでは最後に、このページで紹介した関数・マクロの一覧を。