2

レポートモードのWindowsテンプレートライブラリCListViewCtrl(つまり、2列のヘッダーがあります)と所有者データセットがあります。このコントロールは検索結果を表示します。結果が返されない場合は、結果がなかったことを示すメッセージをリストボックス領域に表示したいと思います。これを行う簡単な方法はありますか?既存のコントロール/サンプルコードを知っていますか(何も見つかりませんでした)。

そうでなければ、この機能を提供するためにコントロールをサブクラス化する場合、良いアプローチは何でしょうか?

4

3 に答える 3

5

私は最終的にコントロールをサブクラス化し、OnPaintを次のように処理しました。

class MsgListViewCtrl : public CWindowImpl< MsgListViewCtrl, WTL::CListViewCtrl >
{
    std::wstring m_message;
public:
    MsgListViewCtrl(void) {}

    BEGIN_MSG_MAP(MsgListViewCtrl)
        MSG_WM_PAINT( OnPaint )
    END_MSG_MAP()

    void Attach( HWND hwnd )
    {
        SubclassWindow( hwnd );
    }

    void SetStatusMessage( const std::wstring& msg )
    {
        m_message = msg;
    }

    void OnPaint( HDC hDc )
    {
        SetMsgHandled( FALSE );
        if( GetItemCount() == 0 )
        {
            if( !m_message.empty() )
            {
                CRect cRect, hdrRect;
                GetClientRect( &cRect );
                this->GetHeader().GetClientRect( &hdrRect );
                cRect.top += hdrRect.Height() + 5;

                PAINTSTRUCT ps;
                SIZE size;
                WTL::CDCHandle handle = this->BeginPaint( &ps );
                handle.SelectFont( this->GetFont() );
                handle.GetTextExtent( m_message.c_str(), (int)m_message.length(), &size );
                cRect.bottom = cRect.top + size.cy;
                handle.DrawText( m_message.c_str(), -1, &cRect, DT_CENTER | DT_SINGLELINE | DT_VCENTER );
                this->EndPaint( &ps );
                SetMsgHandled( TRUE );
            }
        }
    }
};

検索の実行後、結果がない場合は、SetStatusMessageを呼び出すと、メッセージがヘッダーの下の中央に表示されます。それが私が欲しかったものです。私はコントロールのサブクラス化の初心者なので、これが最善の解決策かどうかはわかりません。

于 2009-06-02T00:28:28.887 に答える
2

Vista以降を使用している場合は、LVN_GETEMPTYMARKUP通知を処理してください。Vistaより前の場合は、メッセージを自分でペイントする必要があります。

于 2009-06-12T08:38:42.140 に答える
0

別のアイデアは、リストコントロールと同じサイズと位置で、非表示の別のコントロールを用意することです。編集コントロール、静的テキスト、ブラウザコントロール、またはあなたが持っているものである可能性があります。

次に、検索結果がない場合は、メッセージをこのコントロールに配置し、非表示を解除します。ユーザーが結果を返す別の検索を行うと、このコントロールを非表示にして、通常どおりリストビューに結果を表示します。

于 2009-06-02T02:20:33.310 に答える