在开发MFC应用程序时,经常会遇到需要对列表框中的项目进行排序和移动的需求。虽然这种对话框很常见,但遗憾的是,在网上并没有找到现成的解决方案,因此决定自己创建一个。
在之前的文章“移动列表框项目上下”中,介绍了如何在第二个列表框中排序项目。
a) 将以下文件添加到项目中:
MovListBoxItem.h
& .cpp
ListBoxMoveItem.h
& .cpp
WndResizer_2.h
& .cpp
Function_1D.h
& .cpp
b) 在“属性/链接/输入”中:在“附加依赖项”中添加'UxTheme.lib'(在调试和发布版本中)。
c) 在项目中创建一个对话框,包含以下数据:
C++ IDD_DIALOG1 DIALOGEX 0, 0, 301, 277
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Move ListBox Items and sort"
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
LISTBOX IDC_LIST1, 7, 23, 115, 223, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
LISTBOX IDC_LIST2, 159, 23, 115, 223, LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON ">", IDC_BUTTON1, 128, 99, 25, 14
PUSHBUTTON "<", IDC_BUTTON2, 128, 115, 25, 14
PUSHBUTTON ">>", IDC_BUTTON3, 128, 139, 25, 14
PUSHBUTTON "<<", IDC_BUTTON4, 128, 155, 25, 14
LTEXT "Available", IDC_STATIC_AVAILABLE, 7, 13, 33, 8
LTEXT "Selected", IDC_STATIC_SELECTED, 158, 13, 38, 8
LTEXT "(x/n)", IDC_STATIC_NBDISPO, 49, 13, 33, 8
DEFPUSHBUTTON "OK", IDOK, 158, 253, 50, 14
PUSHBUTTON "Cancel", IDCANCEL, 224, 253, 50, 14
LTEXT "(x/n)", IDC_STATIC_NB_SEL, 201, 13, 33, 8
PUSHBUTTON "^", IDC_BUTTON20, 278, 112, 18, 19
PUSHBUTTON "v", IDC_BUTTON21, 278, 136, 18, 19
END
d) 添加变量:
e) 在代码中包含:
#include "MovListBoxItem.h"
#include "ListBoxMoveItem.h"
需要在对话框中传递两个变量:
UpdateData(TRUE); // TRUE:获取变量中的值
CListBoxMoveItem dialog(this, m_vCompleteList, m_vChoosenList);
if (dialog.DoModal() == IDOK)
{
m_vChoosenList = dialog.Get_ListColSelection();
}
delete dialog;
UpdateData(FALSE); // FALSE:更新控件
演示包括 Mizan Rahman 的 WndResizer 的修改版本MFC/C++Helper Class for Window Resizing(原始版本也可以使用,修改是为了隐藏/显示控件)。