2016-05-12 22 views
3

Windowsエクスプローラーと同じ方法で、ListViewコントロール(Windowsフォーム/ pinvoke経由のWin32)で列フィルターを実装しようとしています。それを使用していないものにとっては、このようになります前に:ListViewコントロールのヘッダーでWindowsエクスプローラーの列フィルターを複製する方法

enter image description here

あなたは、ドロップダウンをクリックすると、矢印が表示されるドロップダウンヘッダーの列の上にカーソルを置くさまざまなフィルタリングオプションを持つコンテキストメニューが表示されます。あなたは、オプションを選択したら、次のように、常に表示されている目盛りの画像に矢印画像の変更: 私はHDF_SPLITBUTTONとリストビューにHDM_SETITEMメッセージを送信することにより、表示するドロップダウン矢印を持ってenter image description here

フォーマットフラグが指定されています。私は、フィルタリングメニューを表示することもできます。

問題は、「ティック」画像を表示する方法を理解できないことです。まあ、オーナーの描画を使うことに頼る以外のことは、本当に過度のようです。私はListViewとHeaderコントロールのAPIドキュメントを見てきましたが、画像を変更するために送信できるウィンドウメッセージはないようです。それを回避するために

Iは、フィルタリングがアクティブであることを示すために、ヘッダ画像を用いて試みたが、あなたがHDF_SORTUP又はHDF_SORTDOWNと同時にHDF_IMAGE又はHDF_BITMAPを使用することはできませんHDITEMマニュアルに従って。そこで、ソートとフィルタリングの両方の状態を示す新しい画像を作成しましたが、今度はすべてListViewアイテムがカラムヘッダイメージのサイズで字下げされています(c#ListViewコントロールの既知の問題のようです)。

私は有望だった何かを見つけました。BCM_SETSPLITINFOは、分割ボタンのグリフを設定します。しかし、ヘッダーには分割ボタンである子ウィンドウがない限り、分割ビューではなくListViewヘッダーがあります。

誰もが完全な所有者を実装せずにその「ティック」マークを複製する方法を知っています溶液?

おかげ

グレッグ

+2

ListViewのようですが、[それはありません](http://stackoverflow.com/questions/4089196/netuihwnd-and-directuihwnd)。 –

+0

ああ!それはそれを説明するだろう、私は前にDirectUIHWNDについて聞いていない。私はWin32 ListViewコントロールでこのような苦労を経験したことは間違いありません。私はSpy ++を実際に試しましたが、ヘッダーが別のウィンドウであることが分かりました。 – Greg

答えて

0

あなたは本当の良いことが必要な場合は、所有者に頼る最終的に描画されます。私はヘッダーコントロールがこのことに対して何らかのメッセージ/通知/通知を返すとは思わない。

今のところ、foolの場合は、列名の左端に目盛記号が表示されます。ダニがなければ、左に空白のセットを表示します。そのようなシンボルを右に置くことはできません。ユーザーが列のサイズを変更したり、目盛りが右端に表示されないことがあります。

選択したフォントに応じて、ティックシンボルの代わりにスペースを入れると、多かれ少なかれ次のようになります。

+0

私は現在、 "列名の左側にイメージを置く"トリックを使用しています。残念ながら.Netコントロールはこれをうまく処理しないため、HDM_SETIMAGELISTを使用してヘッダ・イメージ・リストを手動で設定していました。これは主に機能しましたが、イメージをクリアすると(LVM_SETCOLUMN with iImage = I_IMAGENONE)、ヘッダーはテキストを再配置しません。つまり、イメージは消えていますが、割り当てられたスペースはまだ残ります。 – Greg

+0

このスペースを抑えるには、 'item.fmt'(' HDITEM'構造体にあります)の 'HDF_IMAGE'をリセットする必要があります。 – Velcro

関連する問題