第05章ノート


主な内容:
メニューイベントとマウスイベント(左ボタンを押す、移動する、左ボタンを放す)にプログラムが応答できるようにします.
イベントについて:
ウィンドウプログラムはイベントによってユーザーがインタラクティブになります.ユーザーがマウスをクリックしたり、メニューを選択したり、キーボードを押したりすると、イベントが発生します.プログラムでは、指定したイベントのハンドラを作成する必要があります.2.イベントハンドラを登録します.
イベントハンドラの作成
イベントハンドラの作成は、イベントを処理するクラスにメソッド(メンバー関数)を追加することです.MFCでは,ウィンドウフレームクラス(例えばCFRameWnd,CMDIFrameWnd,CMDIChildWnd)でも文書クラスでもビュークラスでもイベントを処理でき,クラスに対応するメソッドを追加するだけでよい.
イベントハンドラは特殊な方法であるため、イベントハンドラはafx_でなければならない.msgの先頭.
イベントハンドラ登録
イベントを処理するクラスには、イベントを処理するメソッドのほかに、クラスに次のマクロDECLARE_を追加します.MESSAGE_MAP();2.クラス外にイベントハンドラを追加してマクロを登録します.フォーマットは以下の通りです.
BEGIN_MESSAGE_MAP(クラス名、親クラス名)
特定のイベント登録マクロ
END_MESSAGE_MAP()
マウスをクリックしたり、マウスを移動したりするなど、システムメッセージと呼ばれるイベントがあります.1、このクラスのイベントを処理する方法宣言は、マウスを移動する方法宣言はafx_msg void OnMouseMove(UINT nFlags, CPoint point);2,このクラスのイベントを登録するときは,いずれもON_WMの先頭にある、例えばマウスを動かすイベント登録:ON_WM_MOUSEMOVE().
一方、メニューの選択など、いくつかの操作では、アクションはすべてクリックされますが、異なるメニュー項目には異なる処理関数が必要であるため、このような方法では、1、イベントを処理する関数名は自分で定義できます.2,登録イベントのマクロ名は固定されており,メニューを選択した登録イベントマクロは:ON_COMMAND;3、イベント処理マクロに2つのパラメータを追加する必要があります.1つ目のパラメータはイベントが発生したリソースIDで、2つ目のパラメータはリソース上で指定されたイベントを処理する関数名です.
たとえば、メニューには、IDM_TEST、イベント処理関数の宣言:afx_msg void OnTest()の場合、そのイベント登録マクロは:ON_COMMAND(IDM_TEST, OnTest).
サンプル・プログラム:
簡単なウィンドウプログラムを作成します.プログラムには簡単なメニュー「File」があり、「Exit 1」と「Exit」の2つのメニュー項目があります.
メニュー項目
リソースID
機能
Exit1
IDM_EXIT
プロンプトメッセージが表示されたらプログラムを終了します.
Exit
ID_APP_EXIT
プログラムを終了します.
そのうち:ID_APP_EXITはシステムが提供するリソースIDであり、機能はプログラムを終了し、ユーザーが自分でプログラミングする必要がない.IDM_EXITはユーザが独自に定めたリソースIDであり,独自にハンドラを追加する必要がある.
プログラムウィンドウでマウスの左ボタンを押して移動すると、ウィンドウに赤い点が描画されます.
主なイベント分析:
1:「Exit 1」メニューをクリックすると、プログラムが呼び出され、ダイアログが表示され、プログラムが終了します.
2:ウィンドウでマウスを押し、マウストラックのスナップを開始します.
3:左ボタンを押しながらマウスを動かすと、赤い点が描画されます.
4:マウスを離すとスナップが終了します.
プログラムコード:
#include <afxwin.h>
#include "Message.h"

class CMyFrame : public CFrameWnd
{
private:
    CMenu *pMenu;
public:
    CMyFrame()
    {
        Create(NULL, "Hello MFC");
        pMenu = new CMenu;
        pMenu->LoadMenu(IDR_MENU1);
        SetMenu(pMenu);
    }

    ~CMyFrame()
    {
        delete pMenu;
    }

    afx_msg void OnExit()// afx_msg 
    {
        MessageBox("Exit1");
        DestroyWindow();
    }

    afx_msg void OnLButtonDown(UINT nFlags, CPoint point)// 
    {
        SetCapture();
    }

    afx_msg void OnMouseMove(UINT nFlags, CPoint point)
    {
        if(GetCapture() == this)
        {
            CClientDC aDC(this);
            aDC.SetPixel(point, RGB(255, 0, 0));
        }
    }

    afx_msg void OnLButtonUp(UINT nFlags, CPoint point)
    {
        ReleaseCapture();
    }

    DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CMyFrame, CFrameWnd)
    ON_COMMAND(ID_Exit1, OnExit)
    ON_WM_LBUTTONDOWN()
    ON_WM_MOUSEMOVE()
    ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

class CMyApp : public CWinApp
{
public:
    BOOL InitInstance()
    {
        CFrameWnd *pFrame = new CMyFrame;
        m_pMainWnd = pFrame;
        pFrame->ShowWindow(SW_SHOW);

        return true;
    }
}a_app;

...