2009-06-01 13 views
2

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

この機能を提供するためにコントロールをサブクラス化すると、何が良いアプローチになりますか?

答えて

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

これは素晴らしいコードプロジェクトの記事になります。 – Rob

+0

ウィンドウのサイズを変更するとき、これはどのように機能しますか? –

+0

サイズ変更時に機能するかどうかわかりません。固定サイズのダイアログウィンドウで使用していました。 – Skrymsli

0

もう1つの考え方は、リストコントロールと同じサイズと位置を持つが、非表示の別のコントロールを持つことです。編集コントロール、静的テキスト、ブラウザコントロール、または何を持つことができます。

次に、検索結果がないときは、このコントロールにメッセージを入れて、非表示にします。ユーザーが結果を返す別の検索を実行すると、このコントロールが非表示になり、結果がリストビューに正常に表示されます。

2

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

+0

クールで、この新しい通知について知りませんでした。時間はありますが、Windows 5をターゲットにしているので、この場合は役に立ちません。 – Skrymsli

関連する問題