GUIとイベント処理

思うところあって、今まで触ってきたプログラミング言語の、GUIアプリケーション開発におけるイベント処理の書き方をズラズラと並べてみようと思います。

まずはVisualBasic5.0,6.0から。

Private Sub btnFoo_Click()
    '処理
End Sub

VB5と言えば、自分が最初に触った言語です。なので今でもプログラミングと聞くと、一番最初に沸くイメージは「Hello,World!」では無く、何もないまっさらなWindowだったりします。

次にC言語のWin32SDK

#include <windows.h>
//ウィンドウプロシージャ
LRESULT CALLBACK WinProc
    (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
    case WM_COMMAND:
        //処理
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, Msg, wParam, lParam);
    }
    return 0L;
}
//メイン関数
int WINAPI WinMain(
    HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow
    )
{
//                略                //
    WNDCLASSEX  wcex;
//                略                //
    wcex.lpfnWndProc    = WinProc;
//                略                //
    //メッセージループ
    while(GetMessage(&msg, NULL, 0, 0) != 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

かなり派手に端折りましたけどこんな感じでしょうか。VBがある程度以上使えるようになって調子に乗ってC言語に手をつけたりしましたが、当時はさっぱり解らなかったのを覚えてます。
メッセージループ内でメッセージがキューに詰まれるのを監視してWinProc()が呼び出されるわけですが。中途半端にブラックボックス化されているので、ポインタや構造体をちゃんと理解してないとどうして動くのかさっぱり解らないです。
まぁ、実際の所どの入門書やサイトでもパターンとして覚えるような感じで書かれてますね。

次にJava Swingです。

import javax.swing.*;
import java.awt.event.*;
public class foo extends JFrame implements ActionListener{
    JButton btnFoo = new JButton("bar");
    public foo(){
        btnFoo.addActionListener(this);
        add(btnFoo);
        setSize(200, 100);
        show();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //処理
    }
} 

インターフェースの性格上、色々な書き方があるのですが、とりあえずスタンダートにJFrameを継承しつつ、ActionListenerを実装するパターンです。
Javaのインターフェースを用いたイベントの実装に関しては、若干無理やりな感じが否めないのはしょうがないでしょうか。

最後に、C#.NET Framework

using System;
using System.Drawing;
using System.Windows.Forms;
public class foo : Form
{
    Button btnFoo = new Button();
    public foo()
    {
        this.Width = 200; this.Height = 80;
        btnFoo.Location = new Point(10, 10);
        btnFoo.Size = new Size(170, 30);
        btnFoo.Text = "bar";
        this.Controls.Add(this.btnFoo);
        btnFoo.Click += btnFoo_Click;
    }
    void btnFoo_Click(object sender, EventArgs e)
    {
        //処理
    }
}

実際にイベントを呼び出すための定義は、btnClick += btnFoo_Click;の部分だけです。デリゲートのおかげで、かなり簡潔な書き方ができます。
さらにpartialクラスとして定義する事で、コンポーネント配置処理とイベント記述処理を簡単に分けられるようになったので、VisualStudioを使えば、ほとんどVisualBasicのような感覚でプログラミングできます。

いままで触ったことのあるGUI開発のフレームワークというと、こんなものでしょうか。
最近ようやくWindowsからUbuntuへの移行をはじめた関係で、Java Swingを除くと、全部Windowsアプリケーションですが、それでもこれだけ書き方に差が出るものです。

GUIのイベント処理は複雑なため、言語毎の特性が出やすい部分だと言えます。
なので、こうして並べてみるだけでも、その言語の歩んできた道や根底にある思想が見えてきて面白いんじゃないかと思ってやってみたのですが・・・どうでしょう?