次のコードを、お好きなエディタで記述して、hello.cpp という名前でお好きな場所に保存してください。Windowsの場合は、C:¥msys64¥home¥ユーザー名
に保存するのが便利です。
#include <wx/wx.h>
class Hello : public wxFrame
{
public:
Hello();
};
class App : public wxApp
{
public:
virtual bool OnInit();
};
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
{
}
IMPLEMENT_APP(App)
bool App::OnInit()
{
Hello *hello = new Hello();
hello->Show();
return true;
}
#include <wx/wx.h>
wx/wx.h を読み込むと、wxWidgets 関連と C++ 関連のヘッダーファイルのほとんどを読み込めるみたいです。
class Hello : public wxFrame
{
public:
Hello();
};
Hello クラスを定義しています。Hello クラスは wxFrame を継承しています。wxFrame はウィンドウを作るためのクラスです。public なアクセス権を持つ Hello() という関数は、クラスのインスタンスを作るコンストラクターになります。クラス名と同じ名前の関数はコンストラクターになります。コンストラクターには戻り値は指定しません。public な変数や関数は、他のクラスからもアクセスすることができます。クラスの定義(ヘッダー)の最後の }(中括弧)には ;(セミコロン)をつけなければなりません。
class App : public wxApp
{
public:
virtual bool OnInit();
};
wxApp を継承した App というクラスを定義しています。wxApp クラスはアプリケーションの起動と終了、イベントループ(event loop)などを担当しています。App クラスには virtual で bool 型を返す OnInit( ) という関数が定義されています。virtual の付いた関数は仮想関数となり、 スーパークラスの型で呼びだせばスーパークラスの OnInit( ) が呼び出され、サブクラスの型で呼び出せばサブクラスの OnInit( ) が呼び出されます。wxApp の OnInit( ) は、ループ(起動し続けること)以外は何も実装していませんので、サブクラスで OnInit( ) を再定義しなければ、そのアプリケーションは何もせずに(ウィンドウも表示せずに)起動し続けるだけになります。
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
{
}
Hello クラスの Hello() 関数を実装しています。今回は何も実装していませんが、スーパークラスのコンストラクターを次のパラメーターで呼び出しています。
IMPLEMENT_APP(App)
この部分は、main( ) 関数と、その main( ) 関数から引数で指定した wxApp のサブクラスの OnInit( ) 関数を呼び出すコードに置き換わります。このようにある文字列を一連のコードに結びつけたものをマクロと呼びます。C++ ではマクロは、すべて大文字で書く慣習になっています。またマクロの最後には ;(セミコロン)はつけません。
bool App::OnInit()
{
Hello *hello = new Hello();
hello->Show();
return true;
}
C++ のプログラムはコンパイル(compile)という作業をして実行ファイル(アプリケーション)を作ります。
MSYS2(mingw64.exe)を起動して、hello.cpp を保存したディレクトリに移動してください。hello.cpp を C:¥msys64¥home¥ユーザー名
に、保存した場合は、MSYS2 が起動した画面がそのディレクトリになります。
コンパイルするためのコマンドは、Windows 7 と Windows 10 では少し違います。
g++ hello.cpp `wx-config --cppflags --libs` -o Hello -static -lstdc++ -lgcc -lwinpthread
g++
の次にスペースを空けてコンパイルしたいソースコードのファイルを指定します`wx-config --cppflags --libs`
は、wxWidgets の関連ファイルをリンクさせます-o
の次にスペースを空けてコンパイルで生成される実行ファイルの名前を指定します。-static -lstdc++ -lgcc -lwinpthread
は、DLLと呼ばれるライブラリを実行ファイルに読み込んでいます。この DLL ライブラリは Windows 特有のものです。
g++ hello.cpp `wx-config --cppflags --libs` -o Hello -static -lstdc++ -lgcc
Windows 7 と比べると読み込む DLL ライブラリのうち -lwinpthread
が一つ減ります
コマンドを実行して、特に何も表示されずに、プロンプトに戻れば、コンパイルは成功しています。もしエラーや警告(warning)が表示されれば、それに従って対処してください。
コンパイルに成功すると、hello.cpp と同じディレクトに Hello.exe というファイルが出来上がります。これが実行ファイル(アプリケーション)です。ダブルクリックすると起動します。Hello.exe をデスクトップなどに移動させても、ダブルクリックで起動できます。
ウィンドウのデフォルトサイズは、プラットフォームによって違うみたいです。多くの場合、横 400 ピクセル、縦 500 ピクセルぐらいになる場合が多いみたいです。
次のようにコードを変更するとウィンドウのサイズを指定できます。
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
↓
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"), wxDefaultPosition, wxSize(400, 250))
ターミナルを起動して、hello.cpp を保存したディレクトリに移動し、次のコマンドを実行してください。
g++ hello.cpp `wx-config --cppflags --libs` -o hello
g++
の次にスペースを空けてコンパイルしたいソースコードのファイルを指定します`wx-config --cppflags --libs`
は、wxWidgets の関連ファイルをリンクさせます-o
の次にスペースを空けてコンパイルで生成される実行ファイルの名前を指定します。コマンドを実行して、特に何も表示されずに、プロンプトに戻れば、コンパイルは成功しています。もしエラーや警告(warning)が表示されれば、それに従って対処してください。
コンパイルに成功すると、hello.cpp と同じディレクトに hello というファイルが出来上がります。これが実行ファイル(アプリケーション)です。
生成された hello アプリケーションを起動するには、ターミナルで次のようにコマンドします。
./hello
もしくは、hello ファイルをダブルクリックすると新しいターミナルのウィンドウが開き、しばらくすると hello アプリケーションが起動します。
ターミナルを開かずにダブルクリックで hello アプリケーションを起動させる方法は、次の「アプリーションバンドル」の項で説明します
ウィンドウのデフォルトサイズは、プラットフォームによって違うみたいです。macOSの場合、横 400 ピクセル、縦 250 ピクセルぐらいになる場合が多いみたいです。
次のようにコードを変更するとウィンドウのサイズを指定できます。
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
↓
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"), wxDefaultPosition, wxSize(400, 500))
macOS では、アプリケーションを、「アプリケーションバンドル」とよばれる特殊なフォルダで管理します。アプリケーションバンドルを使うとダブルクリックでターミナルを開かずにアプリケーションを起動できるようになります。
アプリケーションバンドルは次のようなディレクトリ構成になります。
Hello.app
+Contents
++Info.plist
++MacOS
+++hello
++Resources
+++Hello.icns
Info.plist は、xml 形式のテキストファイルです。このファイルにアプリケーションのいろいろな設定をしていきます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>hello</string>
<key>CFBundleIconFile</key>
<string>Hello.icns</string>
<key>CFBundleName</key>
<string>Hello</string>
<key>NSPrincipalClass</keyv
<string>NSApplication</string>
</dict>
</plist>
最小限、以上の5項目を設定すれば OK です
出来上がったアプリケーションバンドルをダブルクリックしても起動しない場合は、アプリケーションバンドルを他の場所(例えばデスクトップなど)に移動してダブルクリックしてみてください。一度起動できれば、そのあとは、どの場所に移動しても起動できます。
ターミナルを起動して、hello.cpp を保存したディレクトリに移動し、次のコマンドを実行してください。
g++ hello.cpp `wx-config --cppflags --libs` -o Hello
g++
の次にスペースを空けてコンパイルしたいソースコードのファイルを指定します`wx-config --cppflags --libs`
は、wxWidgets の関連ファイルをリンクさせます-o
の次にスペースを空けてコンパイルで生成される実行ファイルの名前を指定します。特に何も表示されずに、コマンドプロンプトに戻れば、コンパイルは成功しています。もしエラーや警告(warning)が表示されれば、それに従って対処してください。
コンパイルに成功すると、hello.cpp と同じディレクトに Hello というファイルが出来上がります。これが実行ファイル(アプリケーション)です。ダブルクリックすると起動します。Hello をデスクトップなどに移動させても、ダブルクリックで起動できます。
ウィンドウのデフォルトサイズは、プラットフォームによって違うみたいです。多くの場合、横 400 ピクセル、縦 500 ピクセルぐらいになる場合が多いみたいです。
次のようにコードを変更するとウィンドウのサイズを指定できます。
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"))
↓
Hello::Hello() : wxFrame(NULL, -1, wxT("Hello wxWidgets!"), wxDefaultPosition, wxSize(400, 250))