※ ChatGPTを利用し、要約された質問です(原文:インライン処理)
CListCtrlの派生クラスをインラインで書きたい方法
このQ&Aのポイント
VS2008 MFCを使用して、CListCtrlの派生クラスをインラインで書く方法がわからない。
メッセージ処理を追加するとcppファイルが生成されるため、ヘッダファイルだけで使用する方法はあるか。
MFC初心者のため、BEGIN_MESSAGE_MAPやIMPLEMENT_DYNAMICの意味がわからず困っている。ヒントを教えてほしい。
VS2008 MFC を使用して、CListCtrlの派生クラスを全てインラインで書きたいと思い、
・追加->クラス->C++クラス->基本クラス"CListCtrl" + インラインオプションにチェック
で作成したのですが、メッセージ処理を追加するとcppファイルが出来てしまいます。
利便性からヘッダファイル単体で使用したいのですが、cppの内容をヘッダに全て書き写し、cppファイルを削除することは出来ないのでしょうか?
Ex.
<クラス生成直後=ヘッダファイルのみ>
#pragma once
#include "afxcmn.h"
class CTest01 :
public CListCtrl
{
public:
CTest01(void)
{
}
virtual ~CTest01(void)
{
}
};
<メッセージ追加後=ヘッダ>
#pragma once
#include "afxcmn.h"
class CTest01 :
public CListCtrl
{
public:
CTest01(void)
{
}
virtual ~CTest01(void)
{
}
DECLARE_MESSAGE_MAP()
afx_msg void OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult);
};
<メッセージ追加後=cpp>
#include "StdAfx.h"
#include "Test01.h"
BEGIN_MESSAGE_MAP(CTest01, CListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, &CTest01::OnLvnColumnclick)
END_MESSAGE_MAP()
void CTest01::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: ここにコントロール通知ハンドラ コードを追加します。
*pResult = 0;
}
上記の例でOnLvnColumnclickをヘッダファイルに記述することは可能でしたが、BEGIN_MESSAGE_MAPの辺りと、インクルードをヘッダに移動するとリンク時にエラーが出てしまいます。
メッセージ処理をする場合cppファイルは必須なのでしょうか?
・追加->クラス->MFCクラス->基本クラス"CListCtrl"
で作成した場合、上記プラスIMPLEMENT_DYNAMICもインクルードファイル内に記述出来ずに困っています。
MFC初心者のため、いまいちBEGIN_MESSAGE_MAPやIMPLEMENT_DYNAMICの意味がわからず行き詰まっています。
なにかヒント等有りましたら、教えていただけないでしょうか?
よろしくお願いいたします。
お礼
的確且つ簡潔な解答、非常に感謝いたします。 そうですか…やはり無理なのですね…。 ちょっとそんな気がしていたのですが、有識者ならば何とかなるかと思い質問いたしました。 ありがとうございました。
補足
本題から少々ずれるのですが、派生クラスでWindowProcをオーバーライドしてLVN_COLUMNCLICKからメッセージ処理関数へジャンプさせるので有れば、ヘッダファイルのみで処理できるのでしょうか? 途中までがんばったのですが、LVN_COLUMNCLICKをうまく拾えず頓挫しています…。