この前 みんなのおかけで 自作のCListControlの派生クラスを完成しました。
けれど、今度はCListView内に使いたいんです。
でも、リストビューのリストコントロールはすでにそのクラスにはまりこまれていて、コントロールのタイプが変更できないようです。
一応 Subclassメソッドで試してみたら、エラーが起こりました:
#include "MyListCtrl.h"
class CMyListCtrl : public CListCtrl ; //宣告
class CTestView: public CListView
{
//......
public:
CMyListCtrl m_ListCtrl; //自作のListCtrlのオブジェクト
};
CTestView::OnCreate(....)
{
//......
//最後に
HWND hListCtrl = GetListCtrl().Detach(); //ハンドルを取得
m_ListCtrl.SubclassWindow( hListCtrl );
}
ですけれども、SubclassWindowを呼び出すとき、エラーが起こった。
リストコントロールのサブクラス化をどうすればいいのでしょうか
よろしくお願いします
すみません、
MFC Visual C++ .NET 2003 WindowsXP の環境です
> //最後に
> HWND hListCtrl = GetListCtrl().Detach(); //ハンドルを取得
Detach()???
詳しくは知りませんが、
> HWND hListCtrl = GetListCtrl().Detach(); //ハンドルを取得
HWND hListCtrl = GetListCtrl().GetSafeHwnd(); //ハンドルを取得
では?
CWnd::SubclassWindow(HWND hWnd)の内部にです:
BOOL CWnd::SubclassWindow(HWND hWnd)
{
if (!Attach(hWnd)) //GetSafeWnd()使用したらここにエラー出る
return FALSE;
// allow any other subclassing to occur
PreSubclassWindow();
// now hook into the AFX WndProc
WNDPROC* lplpfn = GetSuperWndProcAddr();
WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd,
GWLP_WNDPROC,(INT_PTR)AfxGetAfxWndProc());
ASSERT(oldWndProc != AfxGetAfxWndProc());
//!!Detach()使用したらここにエラーが出る!
if (*lplpfn == NULL)
// the first control of that type created
*lplpfn = oldWndProc;
#ifdef _DEBUG
else if (*lplpfn != oldWndProc)
{
TRACE(traceAppMsg, 0, "Error: Trying to use SubclassWindow
with incorrect CWnd\n");
TRACE(traceAppMsg, 0, "\tderived class.\n");
TRACE(traceAppMsg, 0,
"\thWnd = $%08X (nIDC=$%08X) is not a %hs.\n",
(UINT)(UINT_PTR)hWnd,
_AfxGetDlgCtrlID(hWnd),
GetRuntimeClass()->m_lpszClassName);
ASSERT(FALSE);
// undo the subclassing if continuing after assert
::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (INT_PTR)oldWndProc);
}
#endif
return TRUE;
}
HWND hListCtrl = GetListCtrl().GetSafeHwnd();
にしたら、Attachできないようです。
HWND hListCtrl = GetListCtrl().Detach();
にしたら、ASSERT(oldWndProc != AfxGetAfxWndProc())でエラーが出る!
どうしてエラーが出てるか訳が分からないです
ツイート | ![]() |