📄 addbatdlg.cpp
字号:
// D:\KingBook\KingBook\GUI\AddbatDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "KingBook.h"
#include "AddbatDlg.h"
#if BLOCK("CAddbatFolderDlg, 选择文件夹")
// CAddbatFolderDlg 对话框
IMPLEMENT_DYNAMIC(CAddbatFolderDlg, CPropertyPage)
CAddbatFolderDlg::CAddbatFolderDlg()
: CPropertyPage(CAddbatFolderDlg::IDD)
{
}
CAddbatFolderDlg::~CAddbatFolderDlg()
{
}
void CAddbatFolderDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAddbatFolderDlg, CPropertyPage)
END_MESSAGE_MAP()
// CAddbatFolderDlg 消息处理程序
BOOL CAddbatFolderDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
BOOL CAddbatFolderDlg::OnSetActive()
{
CAddbatDlg *pParent = (CAddbatDlg *)this->GetParent();
BROWSEINFO bif;
TCHAR folderDisplayName[MAX_PATH ] = {0};
TCHAR pszPath[1024] = {0};
bif.hwndOwner = this->m_hWnd;
bif.pidlRoot = NULL;
bif.pszDisplayName = folderDisplayName;
bif.ulFlags = BIF_DONTGOBELOWDOMAIN/*|BIF_NEWDIALOGSTYLE*/|BIF_NONEWFOLDERBUTTON|BIF_RETURNONLYFSDIRS;
bif.lpfn = NULL;
bif.lParam = NULL;
bif.iImage = NULL;
bif.lpszTitle = "浏览";
if(SHGetPathFromIDList(SHBrowseForFolder(&bif),pszPath) == TRUE)
{
pParent->strPath = pszPath;
}
else
{
pParent->strPath = "";
}
return CPropertyPage::OnSetActive();
}
#endif BLOCK("CAddbatFolderDlg, 选择文件夹")
#if BLOCK("CAddbatDlg 属性表对话框")
// CAddbatDlg
IMPLEMENT_DYNAMIC(CAddbatDlg, CPropertySheet)
CAddbatDlg::CAddbatDlg(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
// this->AddPage(&this->dlgFolder);
this->AddPage(&this->dlgList);
}
CAddbatDlg::CAddbatDlg(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
// this->AddPage(&this->dlgFolder);
this->AddPage(&this->dlgList);
}
CAddbatDlg::~CAddbatDlg()
{
}
BEGIN_MESSAGE_MAP(CAddbatDlg, CPropertySheet)
ON_WM_CREATE()
END_MESSAGE_MAP()
// CAddbatDlg 消息处理程序
BOOL CAddbatDlg::OnInitDialog()
{
BOOL bResult = CPropertySheet::OnInitDialog();
return bResult;
}
/// <summary>创建属性表对话框, 响应WM_CREATE事件</summary>
/// <param name="lpCreateStruct">指定对话框创建的方式</param>
/// <returns>成功返回0; 失败返回-1.</returns>
/// <remarks> 这个函数的主要目的是, 在显示属性表之前, 先显示"浏览文件夹"对话框, 让用户选择
/// 批量添加的图书所在的文件夹.如果用户在"浏览文件夹"对话框上点击"取消", 这个函数返回-1, 即
/// 不再创建属性表.
/// </remarks>
int CAddbatDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CPropertySheet::OnCreate(lpCreateStruct) == -1)
return -1;
BOOL bResult = 0;
BROWSEINFO bif;
TCHAR folderDisplayName[MAX_PATH ] = {0};
TCHAR pszPath[1024] = {0};
bif.hwndOwner = this->m_hWnd;
bif.pidlRoot = NULL;
bif.pszDisplayName = folderDisplayName;
bif.ulFlags = BIF_DONTGOBELOWDOMAIN/*|BIF_NEWDIALOGSTYLE*/|BIF_NONEWFOLDERBUTTON|BIF_RETURNONLYFSDIRS;
bif.lpfn = NULL;
bif.lParam = NULL;
bif.iImage = NULL;
bif.lpszTitle = "选择这批图书所在文件夹";
LPITEMIDLIST lpItem = NULL;
lpItem = SHBrowseForFolder(&bif);
if(lpItem == NULL)
return -1;
if(SHGetPathFromIDList(lpItem,pszPath) == TRUE)
{
this->strPath = pszPath;
}
else
{
this->strPath = "";
}
return bResult;
}
#endif BLOCK("CAddbatDlg 属性表对话框")
#if BLOCK("CAddbatListDlg, 文件列表")
// CAddbatListDlg 对话框
IMPLEMENT_DYNAMIC(CAddbatListDlg, CPropertyPage)
/// <summary>CAddbatListDlg的默认构造函数.</summary>
/// <remarks>创建CImageList, 以便显示文件的图标.
/// </remarks>
CAddbatListDlg::CAddbatListDlg()
: CPropertyPage(CAddbatListDlg::IDD)
{
imgList.Create(16, 16, ILC_COLOR8, 0, 4);
imgList.SetBkColor(RGB(255, 255, 255));
}
CAddbatListDlg::~CAddbatListDlg()
{
}
void CAddbatListDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAddbatListDlg, CPropertyPage)
ON_WM_CREATE()
END_MESSAGE_MAP()
// CAddbatListDlg 消息处理程序
/// <summary>当属性页被激活时, 执行这个函数</summary>
/// <returns>BOOL</returns>
/// <remarks>执行以下操作(或调用函数):
/// <list type="bullet">
/// <item><description>
/// <b>FillList()</b> : 填充列表框
/// </description></item>
/// </list>
/// </remarks>
BOOL CAddbatListDlg::OnSetActive()
{
this->FillList();
return CPropertyPage::OnSetActive();
}
/// <summary>初始化CAddbatListDlg属性页对话框, 并执行一些操作.</summary>
/// <returns>BOOL</returns>
/// <remarks>执行以下操作(或调用函数):
/// <list type="bullet">
/// <item><description><b>FillList()</b> : 填充列表框</description></item>
/// <item><description>设置列表框的样式.</description></item>
/// </list>
/// </remarks>
BOOL CAddbatListDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_FILE_LIST);
pList->SetExtendedStyle(LVS_EX_CHECKBOXES );
this->FillList();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
int CAddbatListDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
/// <summary>填充列表框</summary>
/// <returns>int</returns>
/// <remarks>实现步骤:
/// <list type="number">
/// <item><description>清空列表框中已有的内容,清空图片列表.</description></item>
/// <item><description>向列表框中插入新列:"文件名".</description></item>
/// <item><description>查找文件, 并得到文件的图标</description></item>
/// <item><description>使用得到的信息, 构造<c>LVITEM</c>, 并将其插入到列表框</description></item>
/// </list>
/// </remarks>
int CAddbatListDlg::FillList()
{
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_FILE_LIST);
CAddbatDlg *pParent = (CAddbatDlg *)this->GetParent();
WIN32_FIND_DATA findFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError;
int index = 0;
int nColumnCount = pList->GetHeaderCtrl()->GetItemCount();
// 清空已有的内容.
for (int i=0;i < nColumnCount;i++)
{
pList->DeleteColumn(0);
}
pList->DeleteAllItems();
for (int i=0;i < imgList.GetImageCount();i++)
{
imgList.Remove(i);
}
pList->InsertColumn(0, "文件名", 0, 300);
// MessageBox(pParent->strPath);
hFind = FindFirstFile(pParent->strPath + "\\*", &findFileData);
DWORD dwFilter = (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN
| FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_SYSTEM);
if (hFind == INVALID_HANDLE_VALUE)
{
return (-1);
}
else
{
LVITEM lvItem;
lvItem.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
SHFILEINFO sfi;
pList->SetImageList(&imgList, LVSIL_SMALL);
do
{
if((findFileData.dwFileAttributes & (dwFilter)) == 0)
{
// 得到图标
int hr = SHGetFileInfo(findFileData.cFileName, FILE_ATTRIBUTE_NORMAL/*findFileData.dwFileAttributes*/,
&sfi, sizeof(SHFILEINFO), /*SHGFI_OPENICON |*/ SHGFI_ICON | SHGFI_SMALLICON | SHGFI_SHELLICONSIZE|SHGFI_USEFILEATTRIBUTES);
imgList.Add(sfi.hIcon);
lvItem.iImage = imgList.GetImageCount() - 1;
lvItem.pszText = findFileData.cFileName;
pList->InsertItem(&lvItem);
}
}while (FindNextFile(hFind, &findFileData) != 0);
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
return (-1);
}
}
return 0;
}
/// <summary>当用户在属性表对话框上点击"确定"时</summary>
/// <returns>void</returns>
/// <remarks>得到用户在列表框中选择的项目, 并构造出图书信息, 放到CAddbatDlg相应项目中.
/// </remarks>
void CAddbatListDlg::OnOK()
{
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_FILE_LIST);
CAddbatDlg *pParent = (CAddbatDlg *)this->GetParent();
int nCount = pList->GetItemCount();
CString strName;
CString strFullName;
for(int i = 0; i < nCount; i ++)
{
if(pList->GetCheck(i) != 0) // 项被选中
{
strName = pList->GetItemText(i, 0);
strFullName = pParent->strPath + "\\" + strName;
Library::Book bookInfo;
bookInfo.SetName(strName.GetBuffer());
bookInfo.SetURL(strFullName.GetBuffer());
pParent->booksInfo.push_back(bookInfo);;
}
}
CPropertyPage::OnOK();
}
#endif BLOCK("CAddbatListDlg, 文件列表")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -