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

If you're on Vista or later, handle the LVN_GETEMPTYMARKUP notification. For pre-Vista, you'll need to paint the message yourself.

于 2009-06-12T08:38:42.140 回答
0

另一个想法是拥有另一个控件,其大小和位置与列表控件相同,但隐藏。可以是编辑控件、静态文本、浏览器控件,或者你有什么。

然后,当您没有任何搜索结果时,您将消息放在此控件中,并取消隐藏它。当用户执行另一个返回结果的搜索时,您隐藏此控件并在列表视图中正常显示结果。

于 2009-06-02T02:20:33.310 回答