//////////////////////////////////////////
// FileListProc.h
// Copyright (c) 08/30/2022 by ECCSkelton
//////////////////////////////////////////

/////////////////////////////////
//主ウィンドウCFILELISTの関数の定義
//ウィンドウメッセージ関数
/////////////////////////////////
bool CFILELIST::OnInit(WPARAM wParam, LPARAM lParam) {

	//コモンコントロールの初期化
	InitCommonControls();

	//ツールバー登録−SetHandle(hWnd))
	m_TBar.SetHandle(GetDlgItem(m_hWnd, IDC_TOOLBAR));
	//ツールバーボタン用カスタムビットマップ追加
	m_TBar.AddBmp(m_hInstance, MAKEINTRESOURCE(IDI_TOOLBAR), 9);
	//ツールバーボタン追加
	TBBUTTON tbb[13];
	ZeroMemory(tbb, sizeof(tbb));
	tbb[0].iBitmap = m_TBar.m_id + 0;
	tbb[0].fsState = TBSTATE_ENABLED;
	tbb[0].fsStyle = TBSTYLE_BUTTON;
	tbb[0].idCommand = IDM_OPEN;
	tbb[1].iBitmap = m_TBar.m_id + 1;
	tbb[1].fsState = TBSTATE_ENABLED;
	tbb[1].fsStyle = TBSTYLE_BUTTON;
	tbb[1].idCommand = IDM_SAVE;
	tbb[2].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[3].iBitmap = m_TBar.m_id + 2;
	tbb[3].fsState = TBSTATE_ENABLED;
	tbb[3].fsStyle = TBSTYLE_BUTTON;
	tbb[3].idCommand = IDM_EXIT;
	tbb[4].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[5].iBitmap = m_TBar.m_id + 3;
	tbb[5].fsState = TBSTATE_ENABLED;
	tbb[5].fsStyle = TBSTYLE_BUTTON;
	tbb[5].idCommand = IDM_ADD;
	tbb[6].iBitmap = m_TBar.m_id + 4;
	tbb[6].fsState = TBSTATE_ENABLED;
	tbb[6].fsStyle = TBSTYLE_BUTTON;
	tbb[6].idCommand = IDM_SEARCH;
	tbb[7].iBitmap = m_TBar.m_id + 5;
	tbb[7].fsState = TBSTATE_ENABLED;
	tbb[7].fsStyle = TBSTYLE_BUTTON;
	tbb[7].idCommand = IDM_EDIT;
	tbb[8].iBitmap = m_TBar.m_id + 6;
	tbb[8].fsState = TBSTATE_ENABLED;
	tbb[8].fsStyle = TBSTYLE_BUTTON;
	tbb[8].idCommand = IDM_DELETE;
	tbb[9].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[10].iBitmap = m_TBar.m_id + 7;
	tbb[10].fsState = TBSTATE_ENABLED;
	tbb[10].fsStyle = TBSTYLE_BUTTON;
	tbb[10].idCommand = IDM_SORT;
	tbb[11].fsStyle = TBSTYLE_SEP;	//セパレーター
	tbb[12].iBitmap = m_TBar.m_id + 8;
	tbb[12].fsState = TBSTATE_ENABLED;
	tbb[12].fsStyle = TBSTYLE_BUTTON;
	tbb[12].idCommand = IDM_VERSION;
	m_TBar.AddButtons(13, tbb);

	//ステータスバー登録−SetHandle(hWnd))
	m_SBar.SetHandle(GetDlgItem(m_hWnd, IDC_STATUSBAR));
	//ステータスバー区画設定
	int sec[2] = {100, -1};
	m_SBar.SetSection(2, sec);
	//ステータスバー文字列設定
	m_SBar.SetText(0, L"FileList Ver 1.0");
	m_SBar.SetText(1, L"ファイルリストファイル名");

	//リストビューウィンドウハンドル
	m_ListView.m_hWnd = GetDlgItem(m_hWnd, IDC_LISTVIEW);
	//リストビュー親ウィンドウハンドル
	m_ListView.m_hParent = m_hWnd;
	//リストビューインスタンス
	m_ListView.m_hInstance = m_hInstance;
	//リストビューコントロールID
	m_ListView.m_hMenu = (HMENU)IDC_LISTVIEW;
	//リストビュー列名と幅の設定
	m_ListView.InsertColumn(0, 30, L"No", LVCFMT_CENTER);
	m_ListView.InsertColumn(1, 190, L"ファイル名");
	m_ListView.InsertColumn(2, 496, L"備考");
	m_ListView.InsertColumn(3, 0, L"フルパス名");
	//リストビュー拡張スタイルの設定
	INITCOMMONCONTROLSEX ic;
	ic.dwSize = sizeof(ic);
	ic.dwICC = ICC_LISTVIEW_CLASSES;
	InitCommonControlsEx(&ic);
	DWORD lvStyle = SendItemMsg(IDC_LISTVIEW, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);
	lvStyle |= LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES;
	SendItemMsg(IDC_LISTVIEW, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES, lvStyle);

	//メニューハンドルの取得
	g_hPopup = GetSubMenu(GetMenu(m_hWnd), 1);

	//リストビューは項目未選択なので「編集」と「削除」を無効にする
	ChangeMenuStatus(FALSE);

	//ドラッグアンドドロップの受付開始
	DragAcceptFiles(m_hWnd, TRUE);

	return TRUE;
}

bool CFILELIST::OnNotify(WPARAM wParam, LPARAM lParam) {

	if((int)wParam == IDC_LISTVIEW) {	//リストビューからのメッセージ
		int n = m_ListView.GetNextItem(-1, LVNI_ALL | LVIS_SELECTED);
		if(n == -1) {	//未選択なら
			//「編集」と「削除」を無効にする
			ChangeMenuStatus(FALSE);
		}
		else {
			//「編集」と「削除」を有効にする
			ChangeMenuStatus(TRUE);
		}
		//リストビューの通知メッセージによる処理
		switch(((LPNMLISTVIEW)lParam)->hdr.code) {
		case LVN_COLUMNCLICK:	//列見出しがクリックされたら
			if(sortsubno[((LPNMLISTVIEW)lParam)->iSubItem] == UP)
				sortsubno[((LPNMLISTVIEW)lParam)->iSubItem] = DOWN;
			else
				sortsubno[((LPNMLISTVIEW)lParam)->iSubItem] = UP;
			m_ListView.SortItem(CompProc, ((LPNMLISTVIEW)lParam)->iSubItem);
			break;
		case NM_DBLCLK:		//左ダブルクリックしたら
			if(n != -1)
				OnEdit();
			break;
		case NM_RCLICK:		//右クリックしたら
			//ウインドウの位置情報を取得
			RECT rec;
			GetWindowRect(m_hWnd, &rec);
			//ポップアップメニューの表示場所を設定
			POINT pt;
			GetCursorPos(&pt);
			//ポップアップメニューの表示
			TrackPopupMenu(g_hPopup, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON, pt.x, pt.y, 0, m_hWnd, &rec);
			break;
		}
		return TRUE;
	}
	//ツールバーツールチップ
	if(((LPNMHDR)lParam)->code == TTN_NEEDTEXT) {	//TTN_GETDISPINFOと同じ
		((LPTOOLTIPTEXT)lParam)->hinst = m_hInstance;
		WCHAR* tag;
		switch(((LPTOOLTIPTEXT)lParam)->hdr.idFrom) {
		case IDM_OPEN:
			tag = L"リストを開く";
			break;
		case IDM_SAVE:
			tag = L"リストの保存";
			break;
		case IDM_EXIT:
			tag = L"終了";
			break;
		case IDM_ADD:
			tag = L"追加";
			break;
		case IDM_SEARCH:
			tag = L"検索";
			break;
		case IDM_EDIT:
			tag = L"編集";
			break;
		case IDM_DELETE:
			tag = L"削除";
			break;
		case IDM_SORT:
			tag = L"並び替え";
			break;
		case IDM_VERSION:
			tag = L"バージョン情報";
			break;
		}
		((LPTOOLTIPTEXT)lParam)->lpszText = tag;
		return TRUE;
	}
	return FALSE;
}

bool CFILELIST::OnSize(WPARAM wParam, LPARAM lParam) {

	m_TBar.AutoSize();
	m_SBar.AutoSize();
	//最後の「備考」幅を調整してm_ListViewをクライアント領域に合わせる
	m_ListView.m_x = 0;
	m_ListView.m_Width = LOWORD(lParam);
	m_ListView.m_Height = HIWORD(lParam);
	RECT rec;
	GetWindowRect(m_SBar.GetHandle(), &rec);
	m_ListView.m_Height -= rec.bottom - rec.top;
	GetWindowRect(m_TBar.GetHandle(), &rec);
	m_ListView.m_y = rec.bottom - rec.top;
	m_ListView.m_Height -= m_ListView.m_y;
	m_ListView.Move(m_ListView.m_x, m_ListView.m_y, m_ListView.m_Width, m_ListView.m_Height);
	m_ListView.SetColumn(2, LVCFMT_LEFT, m_ListView.m_Width - 224, L"備考");
	return TRUE;
}

bool CFILELIST::OnClose(WPARAM wParam, LPARAM lParam) {

	if(MessageBoxW(m_hWnd, L"終了しますか", L"終了確認",
					MB_YESNO | MB_ICONQUESTION) == IDYES) {
		//処理をするとDestroyWindow、PostQuitMessageが呼ばれる
		if(!*g_File.ToChar() &&
			MessageBoxW(m_hWnd, L"ファイルが選択されていません\n現在のデータを保存しますか？",
						L"保存確認", MB_YESNO | MB_ICONQUESTION) == IDYES)
			OnSave();
		return TRUE;
	}
	else
		//そうでなければウィンドウではDefWindowProc関数をreturn、ダイアログではreturn FALSEとなる。
		return FALSE;
}

//D&D処理
bool CFILELIST::OnDropFiles(WPARAM wParam, LPARAM lParam) {

	//ドラッグアンドドロップされたファイル名取得と処理
	static WCHAR FileName[MAX_PATH];
	int n;									//ファイル数
	HDROP hDrop = (HDROP)wParam; 			//HDROPを取得
	n = DragQueryFile(hDrop, -1, NULL, 0);	//ファイル数を取得
	for(int i = 0; i < n; i++) {
		DragQueryFile(hDrop, i, FileName, MAX_PATH);	//ファイル名を取得
		if(g_ExtChk.CheckExt(FileName, g_MFlt)) {
			g_Data = FileName;
			g_ByFile = TRUE;
			OnAdd();
		}
		else
			MessageBoxW(m_hWnd, FileName, L"再生対象外のファイル", MB_OK | MB_ICONERROR);
	}
	DragFinish((HDROP)wParam);
	return TRUE;
}

//ウィンドウ最小サイズ処理
bool CFILELIST::OnMinMax(WPARAM wPram, LPARAM lParam) {

	//典型的なウィンドウのサイズ制限処理
	MINMAXINFO *pmmi;
	pmmi = (MINMAXINFO*)lParam;
	pmmi->ptMinTrackSize.x = 496;	//クライアントエリア480 + 16
	pmmi->ptMinTrackSize.y = 301;	//クライアントエリア240 + 61
	return FALSE;					//処理はDefWndProcに任す
}

/////////////////////////////////
//主ウィンドウCFILELISTの関数の定義
//メニュー項目、コントロール関数
/////////////////////////////////
bool CFILELIST::OnOpen() {

	//ファイルリストファイルを選択する
	WCHAR* fp = g_Cmndlg.GetFileName(m_hWnd, g_LFlt, TRUE, g_Ext, g_Path);
	if(!fp) {
		MessageBoxW(m_hWnd, L"キャンセルされました", L"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else
		g_File = fp;
	//選択したファイルリストファイルをg_Dataに読み込む
	if(!g_Data.FromFile(g_File.ToChar())) {
		MessageBoxW(m_hWnd, L"ファイルリストファイルを読み込めませんでした", L"エラー",
					MB_OK | MB_ICONERROR);
		return FALSE;
	}
	else {
		//現在の行データをすべて削除
		m_ListView.DeleteAllItems();
		int n = 0;
		while(WCHAR* cp = GetDelimtStr(g_Data.ToChar())) {
			//再生番号（999迄、最後のnはLVIF_PARAMをソートする為に追加）
			WCHAR buff[4];
			wsprintf(buff, L"%d", n);
			m_ListView.InsertItem(n, buff, -1, n);
			//フルパス名（データを保存）
			m_ListView.SetItem(n, 3, cp);
			//ファイル名
			m_ListView.SetItem(n, 1, GetFileName(cp));
			//備考
			cp = GetDelimtStr(g_Data.ToChar());
			m_ListView.SetItem(n, 2, cp);
			n++;
			if(n > 999) {	//念のためのエラー処理
				MessageBoxW(m_hWnd, L"最大再生数（999）を超えました", L"エラー", MB_OK | MB_ICONERROR);
				return FALSE;
			}
		}
	}
	m_SBar.SetText(1, g_File.ToChar());		//ステータスバーにフルパス名表示
	m_SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_File.ToChar());	//ToolTipをつける
	return TRUE;
}

bool CFILELIST::OnSave() {

	WCHAR* fp = g_Cmndlg.GetFileName(m_hWnd, g_LFlt, FALSE, g_Ext, g_Path);
	if(!fp) {
		MessageBoxW(m_hWnd, L"キャンセルされました", L"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	g_File = fp;				//ファイル名を保存
	//行数だけ文字列化を繰り返す
	int n = m_ListView.GetItemCount();
	//初期化
	g_Data = L"";				//g_Dataを初期化
	WCHAR buff[MAX_PATH * 4];	//「備考」の最大文字数は約1KB
	CSTR row;
	for(int i = 0; i < n; i++) {
		row = L"\"";				//rowを初期化（フルパスは「""」で囲む）
		//ListViewの2列のデータを読み出し、コンマ区切の文字列一行とする
		m_ListView.GetItemText(i, 3, buff, MAX_PATH);
		row = row + buff;
		row = row + L"\",\"";
		m_ListView.GetItemText(i, 2, buff, MAX_PATH * 4);
		row = row + buff;		//最終項目も文字列中に'\n'があるので
		row = row + L"\"\n";		//「""」で囲う
 		//一行データをg_Dataへ足しこんでゆく
		g_Data = g_Data + row;
	}
	g_Data.ToFile(g_File.ToChar());		//ファイルを保存
	m_SBar.SetText(1, g_File.ToChar());	//ステータスバーにフルパス名表示
	m_SBar.SendMsg(SB_SETTIPTEXT, 1, (LPARAM)g_File.ToChar());	//ToolTipをつける
	return TRUE;
}

bool CFILELIST::OnExit() {

	SendMsg(WM_CLOSE, 0, 0);
	return TRUE;
}

bool CFILELIST::OnAdd() {

	WCHAR* fn;
	if(g_ByFile)
		g_ByFile = FALSE;
	else {
		//ファイルを選択する
		fn = g_Cmndlg.GetFileName(m_hWnd, g_MFlt, TRUE);
		if(!fn) {
			MessageBoxW(m_hWnd, L"キャンセルされました", L"エラー", MB_OK | MB_ICONERROR);
			return FALSE;
		}
		g_Data = fn;
	}
	//リストの最後尾を確認
	int n = m_ListView.GetItemCount();
	//念のためのエラー処理
	if(n > 999) {
		MessageBoxW(m_hWnd, L"最大再生数（999）を超えました", L"エラー", MB_OK | MB_ICONERROR);
		return FALSE;
	}
	//再生番号（999迄、最後のnはLVIF_PARAMをソートする為に追加）
	WCHAR buff[4];
	wsprintfW(buff, L"%d", n);
	m_ListView.InsertItem(n, buff, -1, n);
	//フルパス名（データを保存）
	m_ListView.SetItem(n, 3, g_Data.ToChar());
	//ファイル名
	m_ListView.SetItem(n, 1, GetFileName(g_Data.ToChar()));
	return TRUE;
}

bool CFILELIST::OnSearch() {

	static CSTR ToFind;					//検索文字列保存用変数
	static int found = 0;				//初期値は最初から
	WCHAR buff[MAX_PATH];				//リストボックス文字列取得用バッファ
	int n = m_ListView.GetItemCount();	//リストボックスの行数確認
	//検索文字列取得ダイアログ
	searchdlg.DoModal(m_hWnd, L"IDD_SEARCH", GetInstance());
	//前回の検索と同じ検索文字列であれば検索を継続
	if(g_Data != ToFind) {	//異なれば
		ToFind = g_Data;		//検索文字列を更新し
		found = 0;			//最初から検索する
		m_ListView.SetItemState(-1, 0, LVIS_SELECTED);	//全行の選択状態の解除
	}
	for(int i = found; i < n; i++) {		//行
		for(int j = 0; j < 3; j++) {		//列
			m_ListView.GetItemText(i, j, buff, MAX_PATH);	//文字列取得
			if(StrStrW(buff, ToFind.ToChar())) {			//検索文字列が含まれれば
				found = i + 1;								//次の検索のために、見つかった行の次を指す
				SetFocus(m_ListView.m_hWnd);				//m_ListViewにフォーカスがないと選択状態が表示されない
				m_ListView.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);	//選択状態にする
				return TRUE;
			}
		}
	}
	MessageBoxW(m_hWnd, L"検索文字は見当たりませんでした", L"検索結果", MB_OK | MB_ICONINFORMATION);
	m_ListView.SetItemState(-1, 0, LVIS_SELECTED);	//全行の選択状態の解除
	return TRUE;
}

bool CFILELIST::OnEdit() {

	int n = m_ListView.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
	if (n == -1) {
		MessageBoxW(m_hWnd, L"項目が選択されていません", L"警告", MB_OK);
		return FALSE;
	}
	//CSTR g_DataにNo、ファイル名とカンマ区切り「備考」を格納
	WCHAR buff[MAX_PATH * 4];
	//No
	m_ListView.GetItemText(n, 0, buff, MAX_PATH);
	g_Data = buff;
	g_Data = g_Data + L",";
	//ファイル名
	m_ListView.GetItemText(n, 1, buff, MAX_PATH);
	g_Data = g_Data + buff;
	g_Data = g_Data + L",\"";
	//備考
	m_ListView.GetItemText(n, 2, buff, MAX_PATH * 4);
	g_Data = g_Data + buff;	//最終項目は文字列中に'\n'
	g_Data = g_Data + L"\"";	//があるので「""」で囲う
	//編集用ダイアログを呼び出す
	if(!editdlg.DoModal(m_hWnd, L"IDD_EDIT", GetInstance()))
		return FALSE;
	//CSTR g_Dataに格納されたNoとカンマ区切り「備考」を格納
	WCHAR* cp = GetDelimtStr(g_Data.ToChar());
	m_ListView.SetItem(n, 0, cp);
	m_ListView.SetItem(n, 2, GetDelimtStr(g_Data.ToChar()));
	return TRUE;
}

bool CFILELIST::OnDelete() {

	//複数選択に対応
	int n = m_ListView.GetNextItem(-1, LVNI_ALL | LVIS_SELECTED);
	while(n != -1) {
		m_ListView.DeleteItem(n); 
		n = m_ListView.GetNextItem(n - 1, LVNI_ALL | LVIS_SELECTED);
	}
	m_SBar.SetText(1, L"ファイルリストファイル名");	//ステータスバー表示変更
	return TRUE;
}

bool CFILELIST::OnSort() {

	sortdlg.DoModal(m_hWnd, L"IDD_SORT", GetInstance());
	return TRUE;
}

bool CFILELIST::OnVersion() {

	versiondlg.DoModal(m_hWnd, L"IDD_VERSION", GetInstance());
	return TRUE;
}

//////////////////////////////////////
//ユーザー定義関数
//IDM_EDITとIDM_DELETEの状態を変更する
//////////////////////////////////////
bool CFILELIST::ChangeMenuStatus(bool flag) {

	EnableMenuItem(g_hPopup, IDM_EDIT, (flag ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
	EnableMenuItem(g_hPopup, IDM_DELETE, (flag ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
	SendMessage(m_TBar.GetHandle(), TB_ENABLEBUTTON, IDM_EDIT, flag);
	SendMessage(m_TBar.GetHandle(), TB_ENABLEBUTTON, IDM_DELETE, flag);
	return TRUE;
}

////////////////////////////////////
//ユーザー定義関数
//フルパス名からファイル名だけを取得
////////////////////////////////////
WCHAR* CFILELIST::GetFileName(WCHAR* pathname) {

	static WCHAR fn[MAX_PATH];	//データをスタックに置かない為
	lstrcpyW(fn, pathname);		//引数の文字列のコピーを作る
	//cpをpassnameの終端(NULL)のひとつ前に進める
	WCHAR* sp = (WCHAR*)fn;
	WCHAR* ep = (WCHAR*)fn + lstrlenW(fn) - 1;
	WCHAR* last = 0;				//最後の'\'を指すポインター
	if(*sp == '\"' && *ep == '\"')
		*ep = '\0';	//「""」で囲まれていれば外す（NULLを指す）
	//文字列の'\'を探す
	while(sp < ep) {
		if(*sp == '\\')
		last = sp;				//spを進めるのでlastに記録
		sp++;					//spを進める
	}
	return ++last;				//最後の'\\'の次＝ファイル名の先頭アドレスを返す
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool EDITDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//GetDelimitStrはソースを短縮してしまうのでg_Dataは保護する
	CSTR Data = g_Data;
	//CSTR g_Dataのカンマ区切り文字列をEdit1〜3までに格納
	WCHAR* cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT1, WM_SETTEXT, NULL, (LPARAM)cp); 
	cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT2, WM_SETTEXT, NULL, (LPARAM)cp); 
	cp = GetDelimtStr(Data.ToChar());
	SendItemMsg(IDC_EDIT3, WM_SETTEXT, NULL, (LPARAM)cp); 
	return TRUE;
}

bool EDITDLG::OnIdok() {

	WCHAR buff[MAX_PATH * 4];	//文字列格納用バッファ
	//g_DataにNoを格納
	SendItemMsg(IDC_EDIT1, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)buff); 
	g_Data = buff;
	//g_Dataにカンマ区切りで「備考」を格納
	g_Data = g_Data + L",\"";
	SendItemMsg(IDC_EDIT3, WM_GETTEXT, (WPARAM)MAX_PATH * 4, (LPARAM)buff); 
	g_Data = g_Data + buff;
	g_Data = g_Data + L"\"";	//「備考」は文字列中に'\n'があるので「""」で囲う
	EndModal(TRUE);
	return TRUE;
}

bool EDITDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool SEARCHDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	SendItemMsg(IDC_EDIT1, WM_SETTEXT, 0, (LPARAM)m_ToFind);
	return TRUE;
}

bool SEARCHDLG::OnIdok() {

	SendItemMsg(IDC_EDIT1, WM_GETTEXT, MAX_PATH, (LPARAM)m_ToFind);
	g_Data = m_ToFind;
	EndModal(TRUE);
	return TRUE;
}

bool SEARCHDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool SORTDLG::OnInit(WPARAM wParam, LPARAM lParam) {

	//コンボボックスに文字列を登録
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)L"No");
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)L"ファイル名");
	SendItemMsg(IDC_COMBOBOX1, CB_ADDSTRING, 0, (LPARAM)L"備考");
	SendItemMsg(IDC_COMBOBOX1, CB_SETCURSEL, 0, 0);	//一番目を選択状態にする
	SendItemMsg(IDC_COMBOBOX2, CB_ADDSTRING, 0, (LPARAM)L"昇順");
	SendItemMsg(IDC_COMBOBOX2, CB_ADDSTRING, 0, (LPARAM)L"降順");
	SendItemMsg(IDC_COMBOBOX2, CB_SETCURSEL, 0, 0);	//一番目を選択状態にする
	return TRUE;
}

bool SORTDLG::OnIdok() {

	//選択番号の取得
	int col = SendItemMsg(IDC_COMBOBOX1, CB_GETCURSEL, 0, 0);
	int dir = SendItemMsg(IDC_COMBOBOX2, CB_GETCURSEL, 0, 0);
	//ソート対象項目に昇順、降順のデータを書込む
	sortsubno[col] = (bool)dir;
	//ソート処理
	FileList.m_ListView.SortItem(CompProc, col);
	EndModal(TRUE);
	return TRUE;
}

bool SORTDLG::OnIdcancel() {

	EndModal(FALSE);
	return TRUE;
}

///////////////////////////////
//ユーザーダイアログの関数定義
//コントロール関数
///////////////////////////////
bool VERSIONDLG::OnIdok() {

	EndModal(TRUE);
	return TRUE;
}
