目次

ニュース

日記カテゴリ

書庫

ちょっと時間があったので、Visual C# 2005 Express Editionをインストールして少し触っています。

まずはフォームにボタンを配置して、押してみてメッセージボックスを表示させてみる、と(笑

そうすっと、Form1.Desiner.csにこんなコードが追加されてます。

this.button1.Click += new System.EventHandler(this.button1_Click));

こんな記述が出来るっていうことに感動しました。さらにもってClickに突っ込んでいくと、これはSystem.EventHandler形で記述されています。

イベントハンドラって関数のポインタで突っ込むのかと思っていましたよ。で、System.EventHandlerっていうのは、System.Delegateの派生で記述されているから、名前から察することにはなんらかのProxyのような働きをしているのかな。・・・もうちょっと調べてみないとわからないか。

さらにもって、System.Windows.Forms.Buttonに戻ってみる。すると、こいつには

WndProc(reg System.Windows.Forms.Message)

っていうメソッドがあった。これもこれで名前から察しているだけなんだけれど、Windowsのネイティブな部分からWndProcあたりでコールバック受けて、こいつがSystem.Eventhandlerをinvokeしてるって感じですか。しっかし、とりあえず初めて触ってみて、フォームのボタンでメッセージボックス出すだけでいろいろ考察できるもんだなあ。

ところで、同じようなことをやりたいためにC言語でとりあえず書いてみた。

#include

HINSTANCE ghInstance;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
???????????????????? HINSTANCE hPrevInstance,
???????????????????? LPSTR???? lpCmdLine,
???????????????????? int?????? nCmdShow )
{
?WNDCLASS wc;
?HWND hWnd;
?MSG msg;
?ghInstance = hInstance;
?// ウィンドウクラスの情報を設定
?wc.style = CS_HREDRAW | CS_VREDRAW;
?wc.lpfnWndProc = WndProc;
?wc.cbClsExtra = 0;
?wc.cbWndExtra = 0;
?wc.hInstance = hInstance;
?wc.hIcon = (HICON)LoadImage(?? NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
?0, 0, LR_DEFAULTSIZE | LR_SHARED );
?wc.hCursor = (HCURSOR)LoadImage(? NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
?0, 0, LR_DEFAULTSIZE | LR_SHARED );
?wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
?wc.lpszMenuName = NULL;
?wc.lpszClassName = "疲れてきた。";

?if( RegisterClass( &wc ) == 0 ){
??return 1;
?}
?hWnd = CreateWindow(
?wc.lpszClassName, "適当ウィンドウ", WS_OVERLAPPEDWINDOW,
?CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, hInstance, NULL);
?if( hWnd == NULL ){
??return -1;
?}

?ShowWindow( hWnd, SW_SHOW );
?UpdateWindow( hWnd );

?// メッセージループ
?while( GetMessage( &msg, NULL, 0, 0 ) )
?{
??TranslateMessage( &msg );
??DispatchMessage( &msg );
?}
?return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
?static HWND hButton;
?switch (msg) {
??case WM_CREATE:
???hButton = CreateWindow("BUTTON","何ぞ",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,40, 40,100,20,hWnd,NULL, ghInstance, NULL );
???break;
??case WM_COMMAND:
???MessageBox( hWnd, "押した", "確認" , MB_ICONINFORMATION | MB_OK );
???break;
??case WM_CLOSE:
???PostQuitMessage(0);
???break;
??default:
???return (DefWindowProc(hWnd, msg, wp, lp));
?}
?return 0;
}

結局メッセージの種類によってcase文で切り分ける必要があるわけですから、

イベントハンドラをnewで追加するだけ

っていうのには本当に感動した。

投稿日時 : 2007年6月22日 13:02
Feedback
  • # re: Visual C#のイベントハンドラ
    とっちゃん
    Posted @ 2007/06/22 13:26
    メッセージクラッカ(Windowsx.h参照w)or ATL だとdefineマクロで designer.cs 部分は書けます。

    MFC だとまたちょっと形はちがいますが同じように書けます。

    Windowsx.h も使えないし、ATL/MFC もだめという場合「だけ」は、switch/case をむき身で書くことになります。

    正直その世界はもういやw
    #Hello, world なネタならやるけどwww<おい!
  • # re: Visual C#のイベントハンドラ
    ながせ
    Posted @ 2007/06/22 13:38
    SDKのWndProcの名前が同じですってことを書こうと思って^^;

    実際問題としてCreateWindowとかはやりませんw
  • # re: Visual C#のイベントハンドラ
    けろ
    Posted @ 2007/06/22 16:48
    Cで、API使って書くとこうなりますよね。
    .NET使うようになってから、この書き方は、
    少し懐かしいです。
    EventHandlerデリゲートに感謝ですね。
  • # re: Visual C#のイベントハンドラ
    ながせ
    Posted @ 2007/06/22 21:32
    実は、.netを使ったのは今日が初めてです^-^;

    言語も進化してますよねえ。
  • # re: Visual C#のイベントハンドラ
    けろ
    Posted @ 2007/06/23 0:22
    え~そうなんですか?ながせさん、.NET初体験とは。
    ビックリです。ある程度、WndProcなど、名前から
    推測できた点は、Cでの経験がすごい活きてるなと
    思いました。あっぱれです。
タイトル  
名前  
Url
コメント   

Blog 利用状況

コミュニティ

プロファイル