我在报告模式下有一个Windows模板库CListViewCtrl(所以有一个包含2列的标题),其中包含所有者数据。此控件显示搜索结果。如果没有返回结果,我想在列表框区域中显示一条消息,表明没有结果。是否有捷径可寻?你知道任何现有的控件/示例代码(我找不到任何东西)。
否则,如果我将控件子类化以提供此功能,那将是一个好方法?
答案 0 :(得分: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,消息显示在标题下居中。这就是我想要的。我是一个子类化控件的新手,所以我不确定这是否是最好的解决方案。
答案 1 :(得分:2)
如果您使用的是Vista或更高版本,请处理LVN_GETEMPTYMARKUP
通知。对于Vista之前,您需要自己绘制消息。
答案 2 :(得分:0)
另一个想法是让另一个控件具有与列表控件相同的大小和位置,但是隐藏了。可以是编辑控件,静态文本,浏览器控件或者你有什么。
然后,当您没有任何搜索结果时,将消息放入此控件中,然后取消隐藏它。当用户执行另一个返回结果的搜索时,您将隐藏此控件并在列表视图中正常显示结果。