リストビューのリストコントロールをサブクラス化には


清原  2006-06-09 05:11:32  No: 62109

この前 みんなのおかけで  自作の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を呼び出すとき、エラーが起こった。

リストコントロールのサブクラス化をどうすればいいのでしょうか
よろしくお願いします


清原  2006-06-09 05:13:08  No: 62110

すみません、
MFC  Visual C++ .NET 2003   WindowsXP  の環境です


えてこう  2006-06-09 22:44:44  No: 62111

>   //最後に
>   HWND hListCtrl = GetListCtrl().Detach();  //ハンドルを取得

Detach()???


KING・王  2006-06-10 19:19:37  No: 62112

詳しくは知りませんが、
>  HWND hListCtrl = GetListCtrl().Detach();  //ハンドルを取得
 HWND hListCtrl = GetListCtrl().GetSafeHwnd();  //ハンドルを取得
では?


清原  2006-06-10 21:35:28  No: 62113

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())でエラーが出る!

どうしてエラーが出てるか訳が分からないです


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加