スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MFCのListCtrlをソートする方法

MFCのListCtrlをソートする方法の備忘録です

まず、listにInsertItemをする際にSetItemData()でそのリストItemに関連するデータを設定します。
これは、ソートのCompareの際に、どのItemをCompareするのかを特定するための情報です。
例えば、Itemのデータを保持するエリアのポインタとか、配列のインデックス等です。

次にソートのCompare関数をstaticで定義します。
これはqsortのcompareと同じように、2つのItemをCompareして、どちらが前に来るかを返します。
(マイナスを返すCompareのと最初のItemが前で、プラスを返すと2番目のItemが前になります)

そして、このCompareを使って

CListCtrl.SortItem()を呼ぶことによって、ListCtrlの中のリストがソートされます。
このとき、選択されている行があれば、その行が移動した場合に、移動先の行が選択された状態になっています。

また、リストの見出し部分をクリックしてソートしたい場合が多いのですが、
その場合はLVN_COLUMNCLICKイベントをフックして



void CMyDlg::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

index = pNMListView->iSubItem;


のようにして、クリックしたカラムを調べることができます。

また、見出し部分に▲のマークを出すには
CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
で取得されるヘッダの該当するカラムの属性として以下のようにHDF_SORTUPやHDF_SORTDOWNを設定すればいいようですが


CHeaderCtrl* pHeader = m_list.GetHeaderCtrl();
HDITEM hdrItem;
hdrItem.mask = HDI_FORMAT;
pHeader->GetItem(index, &hdrItem);
hdrItem.fmt |= HDF_SORTUP;
pHeader->SetItem(index, &hdrItem);

のようにすればいいようですが、VC++6.0の場合は、新しいcomctl32.dllを知らせるために
xmlのmanifestを登録しないといけないようなので、ややこしいです。

スポンサーサイト
プロフィール

chattera.net

Author:chattera.net
フリーでソフト開発の仕事をしています。
自作したこのチャットシステムは、何か世の中に役に立つこともあるかと思いますので、お呼びがかかるとうれしいですね。

連絡先は chatteranet@gmail.com です。

また、ソフト開発関連のお誘いもうけたまわっております。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。