0

MyCTreeCtrlクラスがあり、次のようなメッセージハンドラーを追加したいと思います。

void MyCTreeCtrl::OnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{

}

私は何を書くべきですか:

BEGIN_MESSAGE_MAP(MyCTreeCtrl, CTreeCtrl)

END_MESSAGE_MAP()

BEGINDRAGハンドラーを作成します。

MFCでのメッセージ処理に関する文献を教えていただけませんか。ありがとう。

4

1 に答える 1

2

自分でハンドラーを作成しようとして、メッセージ マップを処理しないでください。ほとんどのメッセージでは、ウィザードがコードを追加します。たとえば、ダイアログのツリー コントロールの場合、リソース エディターでツリー コントロールを選択し、[イベント ハンドラーの追加] を選択できます (クラス ビューとプロパティを使用してメッセージ ハンドラーを挿入する方法は他にもあります)。MS がそれをイベント ハンドラーと名付けたのは残念ですが、実際には、特定の通知コードを制御するための通知メッセージ ハンドラーです。あなたの場合は TVN_BEGINDRAG です。ウィザードは、適切なエントリをメッセージ マップに挿入します。

ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_DRAG, &CYourDlg::OnTvnBegindragTreeDrag)

.h ファイルに宣言を追加します。

afx_msg void OnTvnBegindragTreeDrag(NMHDR *pNMHDR, LRESULT *pResult);

および .cpp ファイルの実装 (定義):

void CYourDlg::OnTvnBegindragTreeDrag(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: Add your control notification handler code here
    *pResult = 0;
}

簡単に言うと、メッセージ マップは、メッセージ ハンドラーを柔軟に挿入できるように MFC が設計された方法です。Win32 アプリケーションと同様に、メッセージ ハンドラは Windows プロシージャから呼び出されます。MFC では、すべてのコントロールがサブクラス化されるのは MFC ウィンドウ プロシージャです。メッセージ マップは、AFX_MSGMAP_ENTRY 構造体の静的配列です。

struct AFX_MSGMAP_ENTRY
{
    UINT nMessage;   // windows message
    UINT nCode;      // control code or WM_NOTIFY code
    UINT nID;        // control ID (or 0 for windows messages)
    UINT nLastID;    // used for entries specifying a range of control id's
    UINT_PTR nSig;       // signature type (action) or pointer to message #
    AFX_PMSG pfn;    // routine to call (or special value)
};

MFC ウィンドウ プロシージャはこのマップを取得し、特定の署名 (nSig) のエントリを検索し、エントリの署名が一致する場合は、適切な関数 (pfn) を呼び出します。マップ内の各メッセージ エントリは、この構造に展開される特定のマクロを使用します。メッセージがMW_NOTIFYであるため、あなたの場合はON_NOTIFYです。通知コード TVN_BEGINDRAG も表示されます。ウィザード データベースにないメッセージまたはカスタム メッセージのメッセージ エントリを作成する場合は、次の方法で使用できる ON_MESSAGE という選択肢がいくつかあります。ヘッダーと cpp ファイルに。

    ON_MESSAGE(WM_CUSTOM_MESSAGE, OnCustomMessage)
LRESULT CTreeCtrlDragSampleDlg::OnCustomMessage(WPARAM wParam, LPARAM lParam)
{
    return 0;
}
afx_msg LRESULT OnCustomMessage(WPARAM wParam, LPARAM lParam);

その他の選択肢: ウィンドウまたはウィンドウ コモン コントロールからの WM_COMMAND メッセージをマップする ON_COMMAND、ON_CONTROL。より詳しい情報:

http://msdn.microsoft.com/en-us/library/6d1asasd(v=vs.100).aspx for VS 2010

于 2012-05-27T11:13:17.583 に答える