MFC-メッセージとイベント
アプリケーションはさまざまなオブジェクトで構成されています。ほとんどの場合、コンピューター上で複数のアプリケーションが実行されており、オペレーティングシステムは常にいくつかの割り当てを実行するように求められます。非常に多くの要求が予期せずに提示される可能性があるため、オペレーティングシステムは、オブジェクトに任せて、必要なもの、必要なタイミング、および期待する動作や結果を指定します。
概要概要
Microsoft Windowsオペレーティングシステムは、あるオブジェクトが処理する必要のある要求の種類と、別のオブジェクトが必要とする割り当ての種類を予測できません。
これらすべての割り当てと要求を管理するために、オブジェクトはメッセージを送信します。
各オブジェクトには、送信するメッセージとタイミングを決定する責任があります。
メッセージを送信するには、コントロールがイベントを作成する必要があります。
2つを区別するために、メッセージの名前は通常、ウィンドウメッセージを表すWM_で始まります。
イベントの名前は通常、アクションを示すOnで始まります。
イベントは、メッセージを送信するアクションです。
メッセージの地図
Windowsはメッセージ指向のオペレーティングシステムであるため、Windows環境のプログラミングの大部分はメッセージ処理に関係しています。キーストロークやマウスクリックなどのイベントが発生するたびに、メッセージがアプリケーションに送信され、アプリケーションはそのイベントを処理する必要があります。
コンパイラがメッセージを管理するには、メッセージをクラス定義に含める必要があります。
ザ・ DECLARE_MESSAGE_MAP 次のコードに示すように、クラス定義の最後にマクロを指定する必要があります。
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
DECLARE_MESSAGE_MAP()
};
実際のメッセージは、DECLARE_MESSAGE_MAP行のすぐ上にリストされている必要があります。
メッセージを実装するには、プログラムが使用しているメッセージのテーブルを作成する必要があります。
このテーブルは、2つの区切りマクロを使用しています。
その始まりは BEGIN_MESSAGE_MAP そしてで終わる END_MESSAGE_MAP マクロ。
BEGIN_MESSAGE_MAPマクロは、次のコードに示すように、クラスの名前とクラスの派生元のMFCクラスの2つの引数を取ります。
#include <afxwin.h>
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {
// Create the window's frame
Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
public:
BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance(){
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMessagesApp theApp;
新しいWin32プロジェクトを作成して、簡単な例を見てみましょう。
Step 1 − MFCプロジェクトを作成するには、プロジェクトを右クリックして[プロパティ]を選択します。
Step 2 −左側のセクションで、[構成のプロパティ]→[一般]をクリックします。
Step 3 − [プロジェクトのデフォルト]セクションで[共有DLLでMFCを使用する]オプションを選択し、[OK]をクリックします。
Step 4 −新しいソースファイルを追加する必要があります。
Step 5 −プロジェクトを右クリックし、「追加」→「新規アイテム」を選択します。
Step 6 − [テンプレート]セクションで、[C ++ファイル(.cpp)]をクリックします。
Step 7 − [追加]をクリックして続行します。
Step 8 −ここで、*。cppファイルに次のコードを追加します。
#include <afxwin.h>
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {
// Create the window's frame
Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
public:
BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
END_MESSAGE_MAP()
BOOL CMessagesApp::InitInstance() {
m_pMainWnd = new CMainFrame;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMessagesApp theApp;
Windowsメッセージ
ウィンドウの作成、ウィンドウの表示など、さまざまな種類のWindowsメッセージがあります。一般的に使用されるWindowsメッセージの一部を次に示します。
メッセージ | マップエントリ | 説明 |
---|---|---|
WM_ACTIVATE | ON_WM_ACTIVATE() | フレームワークは、CWndオブジェクトがアクティブ化または非アクティブ化されているときに、このメンバー関数を呼び出します。 |
WM_ACTIVATEA PP | ON_WM_ACTIVATEAPP() | フレームワークは、アクティブ化されているタスクのすべてのトップレベルウィンドウ、および非アクティブ化されているタスクのすべてのトップレベルウィンドウに対して、このメンバー関数を呼び出します。 |
WM_APPCOMM AND | ON_WM_APPCOMMAND() | フレームワークは、ユーザーがアプリケーションコマンドイベントを生成すると、このメンバー関数を呼び出します。 |
WM_CANCELMODE | WM_CANCELMODE() | フレームワークはこのメンバー関数を呼び出して、内部モードをキャンセルするようにCWndに通知します。 |
WM_CHILDACTIVATE | ON_WM_CHILDACTIVATE() | CWndオブジェクトがマルチドキュメントインターフェイス(MDI)の子ウィンドウである場合、OnChildActivateは、ユーザーがウィンドウのタイトルバーをクリックしたとき、またはウィンドウがアクティブ化、移動、またはサイズ変更されたときにフレームワークによって呼び出されます。 |
WM_CLIPBOAR DUPDATE | ON_WM_CLIPBOARDUPDATE() | クリップボードの内容が変更されると、フレームワークはこのメンバー関数を呼び出します。 |
WM_CLOSE | ON_WM_CLOSE() | フレームワークは、このメンバー関数を、CWndまたはアプリケーションが終了することを示すシグナルとして呼び出します。 |
WM_CONTEXTMENU | ON_WM_CONTEXTMENU() | ユーザーがウィンドウ内でマウスの右ボタンをクリック(右クリック)したときにフレームワークによって呼び出されます。 |
WM_COPYDATA | ON_WM_COPYDATA() | このメンバー関数は、あるアプリケーションから別のアプリケーションにデータをコピーするためにフレームワークによって呼び出されます。 |
WM_CREATE | ON_WM_CREATE() | フレームワークは、アプリケーションがCreateまたはCreateExメンバー関数を呼び出してWindowsウィンドウの作成を要求すると、このメンバー関数を呼び出します。 |
WM_CTLCOLOR | ON_WM_CTLCOLOR() | フレームワークは、子コントロールが描画されようとしているときに、このメンバー関数を呼び出します。 |
WM_DELETEITEM | ON_WM_DELETEITEM() | フレームワークはこのメンバー関数を呼び出して、所有者描画リストボックスまたはコンボボックスの所有者に、リストボックスまたはコンボボックスが破棄されたこと、またはアイテムが削除されたことを通知します。 |
WM_DESTROY | ON_WM_DESTROY() | フレームワークはこのメンバー関数を呼び出して、CWndオブジェクトが破棄されていることを通知します。 |
WM_DRAWITEM | ON_WM_DRAWITEM() | フレームワークは、コントロールまたはメニューの視覚的側面が変更されたときに、所有者描画ボタンコントロール、コンボボックスコントロール、リストボックスコントロール、またはメニューの所有者に対してこのメンバー関数を呼び出します。 |
WM_DROPFILES | ON_WM_DROPFILES() | フレームワークは、ユーザーがドロップされたファイルの受信者として自分自身を登録したウィンドウ上でマウスの左ボタンを離すと、このメンバー関数を呼び出します。 |
WM_ENABLE | ON_WM_ENABLE() | アプリケーションがCWndオブジェクトの有効状態を変更すると、フレームワークはこのメンバー関数を呼び出します。構文。 |
WM_HELPINFO | ON_WM_HELPINFO() | アプリケーション内でF1ヘルプを処理します(現在のコンテキストを使用)。 |
WM_HOTKEY | ON_WM_HOTKEY() | フレームワークは、ユーザーがシステム全体のホットキーを押すと、このメンバー関数を呼び出します。 |
WM_HSCROLL | ON_WM_HSCROLL() | フレームワークは、ユーザーがウィンドウの水平スクロールバーをクリックすると、このメンバー関数を呼び出します。 |
WM_KEYDOWN | ON_WM_KEYDOWN() | 非システムキーが押されると、フレームワークはこのメンバー関数を呼び出します。 |
WM_KEYUP | ON_WM_KEYUP() | 非システムキーが解放されると、フレームワークはこのメンバー関数を呼び出します。 |
WM_KILLFOCUS | ON_WM_KILLFOCUS() | フレームワークは、入力フォーカスを失う直前にこのメンバー関数を呼び出します。 |
WM_LBUTTONDBLCLK | ON_WM_LBUTTONDBLCLK() | ユーザーがマウスの左ボタンをダブルクリックすると、フレームワークはこのメンバー関数を呼び出します。 |
WM_LBUTTONDOWN | ON_WM_LBUTTONDOWN() | フレームワークは、ユーザーがマウスの左ボタンを押すと、このメンバー関数を呼び出します。 |
WM_LBUTTONUP | ON_WM_LBUTTONUP() | フレームワークは、ユーザーがマウスの左ボタンを離すと、このメンバー関数を呼び出します。 |
WM_MBUTTONDBLCLK | ON_WM_MBUTTONDBLCLK() | ユーザーがマウスの中ボタンをダブルクリックすると、フレームワークはこのメンバー関数を呼び出します。 |
WM_MBUTTONDOWN | ON_WM_MBUTTONDOWN() | フレームワークは、ユーザーがマウスの中ボタンを押すと、このメンバー関数を呼び出します。 |
WM_MBUTTONUP | ON_WM_MBUTTONUP() | フレームワークは、ユーザーがマウスの中ボタンを離すと、このメンバー関数を呼び出します。 |
WM_MENUSELECT | ON_WM_MENUSELECT() | CWndオブジェクトがメニューに関連付けられている場合、ユーザーがメニュー項目を選択すると、フレームワークによってOnMenuSelectが呼び出されます。 |
WM_MOUSEACTIVATE | ON_WM_MOUSEACTIVATE() | フレームワークは、カーソルが非アクティブなウィンドウにあり、ユーザーがマウスボタンを押すと、このメンバー関数を呼び出します。 |
WM_MOUSEHOVER | ON_WM_MOUSEHOVER() | フレームワークは、TrackMouseEventの前の呼び出しで指定された期間、カーソルがウィンドウのクライアント領域にカーソルを合わせると、このメンバー関数を呼び出します。 |
WM_MOUSEHWHEEL | ON_WM_MOUSEHWHEEL() | 現在のウィンドウがDesktopWindow Manager(DWM)によって構成され、そのウィンドウが最大化されると、フレームワークはこのメンバーを呼び出します。 |
WM_MOUSELEAVE | ON_WM_MOUSELEAVE() | フレームワークは、カーソルがTrackMouseEventの前の呼び出しで指定されたウィンドウのクライアント領域を離れると、このメンバー関数を呼び出します。 |
WM_MOUSEMOVE | ON_WM_MOUSEMOVE() | フレームワークは、マウスカーソルが移動すると、このメンバー関数を呼び出します。 |
WM_MOVE | ON_WM_MOVE() | フレームワークは、CWndオブジェクトが移動された後、このメンバー関数を呼び出します。 |
WM_PAINT | ON_WM_PAINT() | フレームワークは、Windowsまたはアプリケーションがアプリケーションのウィンドウの一部を再描画するように要求すると、このメンバー関数を呼び出します。 |
WM_SETFOCUS() | ON_WM_SETFOCUS() | フレームワークは、入力フォーカスを取得した後、このメンバー関数を呼び出します。 |
WM_SIZE() | ON_WM_SIZE() | ウィンドウのサイズが変更された後、フレームワークはこのメンバー関数を呼び出します。 |
WM_TIMER | ON_WM_TIMER() | フレームワークは、タイマーのインストールに使用されるSetTimerメンバー関数で指定された各間隔の後に、このメンバー関数を呼び出します。 |
WM_VSCROLL | ON_WM_VSCROLL() | フレームワークは、ユーザーがウィンドウの垂直スクロールバーをクリックすると、このメンバー関数を呼び出します。 |
WM_WINDOWPOSCHANGED | ON_WM_WINDOWPOSCHANGED() | フレームワークは、SetWindowPosメンバー関数または別のウィンドウ管理関数の呼び出しの結果としてサイズ、位置、またはZオーダーが変更されたときに、このメンバー関数を呼び出します。 |
ウィンドウ作成の簡単な例を見てみましょう。
WM_CREATE −ウィンドウと呼ばれるオブジェクトが作成されると、オブジェクトを作成するフレームは、次のように識別されるメッセージを送信します。 ON_WM_CREATE。
Step 1− ON_WM_CREATEを作成するには、afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);を追加します。以下に示すように、DECLARE_MESSAGE_MAP()の前。
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
Step 2 − BEGIN_MESSAGE_MAP(CMainFrame、CFrameWnd)の後、END_MESSAGE_MAP()の前にON_WM_CREATE()を追加します。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
Step 3 −これがOnCreate()の実装です
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
// Call the base class to create the window
if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
// If the window was successfully created, let the user know
MessageBox(L"The window has been created!!!");
// Since the window was successfully created, return 0
return 0;
}
// Otherwise, return -1
return -1;
}
Step 4 −これで、*。cppファイルは次のコードのようになります。
#include <afxwin.h>
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
CMainFrame::CMainFrame() {
// Create the window's frame
Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW,
CRect(120, 100, 700, 480), NULL);
}
class CMessagesApp : public CWinApp {
public:
BOOL InitInstance();
};
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
END_MESSAGE_MAP()
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
// Call the base class to create the window
if (CFrameWnd::OnCreate(lpCreateStruct) == 0) {
// If the window was successfully created, let the user know
MessageBox(L"The window has been created!!!");
// Since the window was successfully created, return 0
return 0;
}
// Otherwise, return -1
return -1;
}
BOOL CMessagesApp::InitInstance() {
m_pMainWnd = new CMainFrame;
m_pMainWnd -> ShowWindow(SW_SHOW);
m_pMainWnd -> UpdateWindow();
return TRUE;
}
CMessagesApp theApp;
Step 5 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 6 − [OK]をクリックすると、メインウィンドウが表示されます。
コマンドメッセージ
グラフィカルアプリケーションの主な機能の1つは、ユーザーがマシンを操作できるようにするWindowsコントロールとリソースを表示することです。学習するコントロールの例は、ボタン、リストボックス、コンボボックスなどです。
前のレッスンで紹介したリソースの1つのタイプは、メニューです。このようなコントロールとリソースは、ユーザーがクリックしたときに独自のメッセージを開始できます。Windowsコントロールまたはリソースから発信されるメッセージは、コマンドメッセージと呼ばれます。
コマンドメッセージの簡単な例を見てみましょう。
アプリケーションに新しいドキュメントを作成する機能を提供するために、CWinAppクラスはOnFileNew()メソッドを提供します。
afx_msg void OnFileNew();
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew)
END_MESSAGE_MAP()
メソッドの定義は次のとおりです-
void CMainFrame::OnFileNew() {
// Create New file
}
キーボードメッセージ
A keyboardコンピュータに接続されているハードウェアオブジェクトです。デフォルトでは、コントロールに認識可能な記号、文字、およびその他の文字を入力するために使用されます。キーボードの各キーには、記号、文字、またはそれらの組み合わせが表示され、キーの用途を示します。ユーザーは通常、キーを押すと、プログラムに信号が送信されます。
各キーには、オペレーティングシステムが認識できるコードがあります。このコードは、virtual key code。
シニア番号 | 定数/値と説明 |
---|---|
1 | VK_LBUTTON マウスの左ボタン |
2 | VK_RBUTTON マウスの右ボタン |
3 | VK_CANCEL コントロールブレーク処理 |
4 | VK_MBUTTON マウスの中ボタン(3ボタンマウス) |
5 | VK_BACK BACKSPACEキー |
6 | VK_RETURN キーを入力してください |
7 | VK_TAB TABキー |
8 | VK_CLEAR クリアキー |
9 | VK_SHIFT シフトキー |
10 | VK_CONTROL Ctrlキー |
11 | VK_MENU Altキー |
12 | VK_PAUSE 一時停止キー |
13 | VK_CAPITAL CAPSLOCKキー |
14 | VK_ESCAPE ESCキー |
15 | VK_SPACE スペースキー |
16 | VK_PRIOR PAGEUPキー |
17 | VK_NEXT PageDownキー |
18 | VK_END ENDキー |
19 | VK_HOME ホームキー |
20 | VK_LEFT 左矢印キー |
21 | VK_UP 上矢印キー |
22 | VK_RIGHT 右矢印キー |
23 | VK_DOWN 下矢印キー |
24 | VK_SELECT SELECTキー |
25 | VK_PRINT PRINTキー |
26 | VK_EXECUTE EXECUTEキー |
27 | VK_SNAPSHOT PRINTSCREENキー |
28 | VK_INSERT INSキー |
29 | VK_DELETE DELキー |
30 | VK_NUMPAD0 テンキー0キー |
31 | VK_NUMPAD1 テンキー1キー |
32 | VK_NUMPAD2 テンキー2キー |
33 | VK_NUMPAD3 テンキー3キー |
34 | VK_NUMPAD4 テンキー4キー |
35 | VK_NUMPAD5 テンキー5キー |
36 | VK_NUMPAD6 テンキー6キー |
37 | VK_NUMPAD7 テンキー7キー |
38 | VK_NUMPAD8 テンキー8キー |
39 | VK_NUMPAD9 テンキー9キー |
40 | VK_MULTIPLY 乗算キー |
41 | VK_ADD キーを追加 |
42 | VK_SEPARATOR セパレーターキー |
43 | VK_SUBTRACT 減算キー |
44 | VK_DECIMAL 10進キー |
45 | VK_DIVIDE 分割キー |
46 | VK_F1 F1キー |
47 | VK_F2 F2キー |
48 | VK_F3 F3キー |
49 | VK_F4 F4キー |
50 | VK_F5 F5キー |
52 | VK_F6 F6キー |
53 | VK_F7 F7キー |
54 | VK_F8 F8キー |
55 | VK_F9 F9キー |
56 | VK_F10 F10キー |
57 | VK_F11 F11キー |
58 | VK_F12 F12キー |
59 | VK_NUMLOCK NUMLOCKキー |
60 | VK_SCROLL スクロールロックキー |
61 | VK_LSHIFT 左Shiftキー |
62 | VK_RSHIFT 右Shiftキー |
63 | VK_LCONTROL 左のCONTROLキー |
64 | VK_RCONTROL 右のCONTROLキー |
キーを押すと、WM_KEYDOWNまたはWM_SYSKEYDOWNメッセージがスレッドメッセージに配置されます。これは次のように定義できます-
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
簡単な例を見てみましょう。
Step 1 −これがメッセージです。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
Step 2 −これがOnKeyDown()の実装です。
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {
switch (nChar) {
case VK_RETURN:
MessageBox(L"You pressed Enter");
break;
case VK_F1:
MessageBox(L"Help is not available at the moment");
break;
case VK_DELETE:
MessageBox(L"Can't Delete This");
break;
default:
MessageBox(L"Whatever");
}
}
Step 3 −上記のコードをコンパイルして実行すると、次の出力が表示されます。
Step 4 − Enterキーを押すと、次のメッセージが表示されます。
マウスメッセージ
マウスは、ユーザーがマシンを操作できるようにするためにコンピューターに接続されているもう1つのオブジェクトです。
マウスの左ボタンが押された場合、ON_WM_LBUTTONDOWNメッセージが送信されます。このメッセージの構文は次のとおりです。
afx_msg void OnLButtonDown(UINT nFlags、CPointポイント)
マウスの右ボタンが押された場合、ON_WM_RBUTTONDOWNメッセージが送信されます。その構文は-
afx_msg void OnRButtonDown(UINT nFlags、CPointポイント)
同様に、左マウスを離すと、ON_WM_LBUTTONUPメッセージが送信されます。その構文は-
afx_msg void OnLButtonUp(UINT nFlags、CPointポイント)
右マウスを離すと、ON_WM_TBUTTONUPメッセージが送信されます。その構文は-
afx_msg void OnRButtonUp(UINT nFlags、CPointポイント)
簡単な例を見てみましょう。
Step 1 −次のコードに示すように、CMainFrameクラス定義に次の2つの関数を追加します。
class CMainFrame : public CFrameWnd {
public:
CMainFrame();
protected:
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
Step 2 −次の2つのメッセージマップを追加します。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_KEYDOWN()
ON_WM_LBUTTONDOWN()
ON_WM_RBUTTONUP()
END_MESSAGE_MAP()
Step 3 −関数の定義は次のとおりです。
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) {
CString MsgCoord;
MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y);
MessageBox(MsgCoord);
}
void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) {
MessageBox(L"Right Mouse Button Up");
}
Step 4 −このアプリケーションを実行すると、次の出力が表示されます。
Step 5 − [OK]をクリックすると、次のメッセージが表示されます。
Step 6−このウィンドウを右クリックします。これで、マウスの右ボタンを離すと、次のメッセージが表示されます。