第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:マウスを離すとスナップが終了します.
プログラムコード:
...
メニューイベントとマウスイベント(左ボタンを押す、移動する、左ボタンを放す)にプログラムが応答できるようにします.
イベントについて:
ウィンドウプログラムはイベントによってユーザーがインタラクティブになります.ユーザーがマウスをクリックしたり、メニューを選択したり、キーボードを押したりすると、イベントが発生します.プログラムでは、指定したイベントのハンドラを作成する必要があります.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;
...