1

WTL を使用している場合、組み込みオブジェクトを表すコントロールを自由にコピーできます。

// Notice that CWindow is passed by _copy_, because it only wraps the HWND
int OnNotifyFormat(CWindow wndFrom, int nCommand) { ... }

独自のコントロールを作成したい場合は、次のように言うのは簡単です。

template <class T, class TBase = CWindow, class TWinTraits = CControlWinTraits>
struct CMyControlImpl: public CWindowImpl<T, TBase, TWinTraits>
{
    std::vector<int> internal_info;

    BEGIN_MSG_MAP_EX(...)
        ...
    END_MSG_MAP()
};

struct CMyControl : public CMyControlImpl<CMyControl>
{
    DECLARE_WND_CLASS_EX(TEXT("MyControl"), 0, COLOR_WINDOW)
};

しかし今の問題は、私が単純に言うことができないということです:

void OnFooHappened(CMyControl control)
{
}

CMyControlは単なるハンドルではなく、データ自体が含まれているためです。

このコピー動作に関して、組み込みの ATL/WTL クラスと一致するコントロール クラスを作成する正しい方法は何ですか?

4

1 に答える 1

3

の WTL には、いくつかのカスタム コントロールがあります\Include\atlctrlx.h

///////////////////////////////////////////////////////////////////////////////
// Classes in this file:
//
// CBitmapButtonImpl<T, TBase, TWinTraits>
// CBitmapButton
// CCheckListViewCtrlImpl<T, TBase, TWinTraits>
// CCheckListViewCtrl
// CHyperLinkImpl<T, TBase, TWinTraits>
// CHyperLink

これとは別に、 http: //viksoe.dkで適切に作成されたカスタム WTL コントロールを見つけることができます。

コントロールの「コピー可能性」は、ハンドルを介して標準コントロールを使用できるという事実に基づいており、HWNDこのハンドルを簡単にコピー、アタッチ、デタッチなどでき、有効である間はコントロール全体が適切です。ラッパー クラスはシンで、HWNDメンバー変数のみが含まれます。

一方、お気づきのように、カスタム コントロールには追加情報があり、それらを簡単にコピーすることはできません。この追加情報をコントロールで動的に割り当て/解放することができます。追加のコントロール固有のウィンドウ メッセージと通知を実装し、メソッドをメッセージに変換して実際のコントロールに送信するシン ラッパー クラスを作成できます。次にそれらを処理します。特に。パラメータを含むメッセージを実際のメソッドに変換することによって。これにより、薄いラッパー クラスをコピーできますが、コントロール自体はより複雑で面倒です (通常はそのようにする必要はありません)。

于 2012-08-07T06:22:28.813 に答える