0

WTLを使用して所有者描画リストボックスを作成しようとしています。私のコードは次のようになります

template<class T, class TBase = CListBox, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CMyListBoxImpl : 
   public CWindowImpl< T, TBase, TWinTraits >,
   public COwnerDraw< T >
{
...
BEGIN_MSG_MAP(CMyListBoxImpl)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
    MESSAGE_HANDLER(WM_SIZE, OnSize) 
    MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
    CHAIN_MSG_MAP(COwnerDraw< T >)
    DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

...

void Init()
{
    ...
    ModifyStyle(0, BS_OWNERDRAW | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS);
    ...
}
void DrawItem(LPDRAWITEMSTRUCT lpdis)
{
  ...

また、親のメッセージループに追加REFLECT_NOTIFICATIONSし、プロパティシートで[所有者の描画]を[固定]に設定しました。しかし、それでもメッセージを受信できません。次に、spy ++を使用してリストボックスが受信するメッセージを調べたところ、非常に奇妙なメッセージが見つかりました(WM_USER+7211)。
私のOSはWinXpで、VS2008を使用しています。

4

1 に答える 1

1
  • BS_OWNERDRAW?それはボタンスタイルです。
  • LBS_OWNERDRAWFIXEDを使用しても、WM_MEASUREITEMを処理する必要があります。
  • 一部のコントロールスタイル(LBS_OWNERDRAWFIXEDなど)は、コントロールの作成時にのみ設定できます(これは、「プロパティシートで所有者の描画を固定に設定する」という意味ですか?そうであれば、コードでスタイルを変更するのはなぜですか?)

このフォーラムスレッドも役立つかもしれません...

于 2010-08-04T10:53:03.780 に答える