📄 zlistcontrol.cpp
字号:
#include "../StdAfx.h"
#include "zListControl.h"
zListControl::zListControl(void)
{
m_Version = 0.1f;
m_Tag = 0x4C495354; //"LIST"
#ifdef _PPC
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES;
InitCommonControlsEx(&icex);
#endif
m_colcnt=0;
m_selrow=-1;
m_selcol=-1;
memset(m_szPath,0,sizeof(m_szPath));
}
zListControl::~zListControl(void)
{
}
int zListControl::CreateEx(int ctlid,int x, int y, int nWidth, int nHeight, HWND hParent,HINSTANCE hInst)
{
DWORD dwExtStyle = 0;
TCHAR * lpszClass = WC_LISTVIEW;
TCHAR * lpszName = _T("列表控件");
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | LVS_REPORT | LVS_SINGLESEL; \
// | LVS_EDITLABELS;//| LVS_OWNERDATA |LVS_OWNERDRAWFIXED; 自绘制风格
m_hCtrl = ::CreateWindowEx(dwExtStyle,lpszClass,lpszName,dwStyle,
x,y,nWidth,nHeight,hParent,(HMENU)ctlid,hInst,NULL);
if (m_hCtrl)
{
ListView_SetExtendedListViewStyle(m_hCtrl,LVS_EX_FULLROWSELECT| LVS_EX_FULLROWSELECT);//|LVS_EX_GRIDLINES );
}
return zControl::CreateEx(ctlid,x,y,nWidth,nHeight,hParent,hInst);
}
int zListControl::OnNotify(LPNMHDR lParam)
{
TCHAR sz[300]={0};
int ret = 0;
NM_LISTVIEW* pLvdi = (NM_LISTVIEW*)lParam;
switch(pLvdi->hdr.code)
{
case NM_CLICK: //0xFFFFFFE(0-2)
if (pLvdi->iItem>=0)
{
m_selrow = pLvdi->iItem;
m_selcol = pLvdi->iSubItem;
zListRow * p = this->GetParam(m_selrow);
OnClick(p);
}
break;
case NM_DBLCLK:
if (pLvdi->iItem>=0)
{
m_selrow = pLvdi->iItem;
m_selcol = pLvdi->iSubItem;
zListRow * p = this->GetParam(m_selrow);
OnDblClick(p);
}
break;
case LVN_GETDISPINFO:
OnDispInfo(lParam);
break;
case 0xffffffef:
// wsprintf(sz,_T("Notify:MouseMove?%x\n"),pLvdi->hdr.code);
break;
case 0xfffffff9:
// wsprintf(sz,_T("Notify:Mouse??%x\n"),pLvdi->hdr.code);
break;
case 0xfffffffb:
{
POINT pt = pLvdi->ptAction;
pt.x= 100; pt.y= 100; //未找到定位.
OnPopupMenu(pt);
}
break;
case 0xffffff9c:
break;
case 0xffffff9a:
break;
case WM_CONTEXTMENU: //0x7b
wsprintf(sz,_T("Notify:List:0x7B\n "));
break;
case 0x3e8:
break;
case WM_DRAWITEM: //custom drawing code for owner-draw listview control
LPDRAWITEMSTRUCT lpdis;
lpdis = (LPDRAWITEMSTRUCT)lParam;
break;
case WM_MEASUREITEM: //Set the item height to 36 pixels
LPMEASUREITEMSTRUCT lpmi;
lpmi = (LPMEASUREITEMSTRUCT)lParam;
break;
case LVN_BEGINLABELEDIT:
{
HWND hWndEdit;
hWndEdit = (HWND)SendMessage(m_hCtrl, LVM_GETEDITCONTROL, 0, 0);
SendMessage(hWndEdit, EM_SETLIMITTEXT, (WPARAM)20, 0);
}
break;
case LVN_ENDLABELEDIT:
// 保存用户修改的记录
// if ((pLvdi->item.iItem != -1) && (pLvdi->item.pszText != NULL))
// _tcscpy(pHouse->szAddress, pLvdi->item.pszText);
break;
case LVN_COLUMNCLICK:
// 用户点列,进行排序
// ListView_SortItems( pNm->hdr.hwndFrom,ListViewCompareProc,(LPARAM)(pNm->iSubItem));
break;
default:
break;
}
if(_tcslen(sz)>0)
::OutputDebugString(sz);
return zControl::OnNotify(lParam);
}
int zListControl::OnDispInfo(LPNMHDR lParam)
{
//示范代码
LV_DISPINFO *pLvdi = (LV_DISPINFO *)lParam;
zListRow *pRow = (zListRow *)(pLvdi->item.lParam);
static TCHAR szText[LIST_ROWS_MAX_TEXT];
int col = pLvdi->item.iSubItem;
// switch(col)
// {
// case 0:
_tcsncpy(szText,pRow->GetItemText(col),LIST_ROWS_MAX_TEXT);
// break;
// case 1:
// _tcsncpy(szText,pRow->GetItemText(2),LIST_ROWS_MAX_TEXT);
// break;
// case 2:
// break;
// case 3:
// break;
// }
pLvdi->item.pszText = szText;
return 0;
}
void zListControl::OnClick(zListRow * pList)
{
}
int zListControl::Save(TCHAR * pszSaveName)
{
if (m_pFile==NULL) return 0;
int total = 0;
zListRow * pRow = NULL;
BOOL ret = m_pFile->CreateFile(pszSaveName,_T("w"));
if (ret)
{
//写标记
m_pFile->WriteFile(&m_Tag,1,sizeof(m_Tag));
//写存储版本
m_pFile->WriteFile(&m_Version,1,sizeof(float));
//写头
m_vListColumn.Save(m_pFile);
//写列数据
int size = this->GetItemSize();
m_pFile->WriteFile(&size,1,sizeof(int));
for(int i=0;i<size;i++)
{
pRow = this->GetParam(i);
if (pRow)
{
pRow->Save(m_pFile);
}
}
m_pFile->CloseFile();
}
return total;
}
int zListControl::Load(TCHAR * pszLoadName)
{
if (m_pFile==NULL) return 0;
int total = 0;
this->Reset();
BOOL ret =m_pFile->CreateFile(pszLoadName,_T("r"));
if (ret)
{
//读取标记
DWORD tag;
m_pFile->ReadFile(&tag,1,sizeof(DWORD));
if(tag!=m_Tag)
{
::MessageBox(m_hCtrl,_T("不是本类型文件!"),_T("错误"),MB_OK|MB_ICONQUESTION);
m_pFile->CloseFile();
return 0;
}
//读取版本
float version;
m_pFile->ReadFile(&version,1,sizeof(float));
if(version!=m_Version)
{
::MessageBox(m_hCtrl,_T("存储文件版本和本程序版本不一致!"),_T("错误"),MB_OK|MB_ICONQUESTION);
m_pFile->CloseFile();
return 0;
}
//读头
int col = m_vListColumn.Load(m_pFile);
int i = 0;
//更新ui
for(i=0;i<col;i++)
{
//向界面上添加
TCHAR sz[300]={0};
_tcsncpy(sz,m_vListColumn.GetName(i),sizeof(sz)/sizeof(TCHAR));
LVCOLUMN lvCol;
lvCol.mask= LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_SUBITEM;
lvCol.pszText= sz;
lvCol.cchTextMax = (int)_tcslen(sz);
lvCol.cx= m_vListColumn.GetWidth(i);
lvCol.fmt= m_vListColumn.GetFlags(i);
lvCol.iSubItem= i;
// lvCol.iImage = m_vListColumn.GetColumnImage(i);
ListView_InsertColumn(m_hCtrl,i,&lvCol);
}
//读列数据
zListRow * pRow = NULL;
m_pFile->ReadFile(&total,1,sizeof(int));
for(i=0;i<total;i++)
{
pRow = new zListRow(col);
pRow->Load(m_pFile);
this->AddRow(pRow);
}
m_pFile->CloseFile();
}
return total;
}
int zListControl::ResetRow()
{
if (!m_hCtrl) return 0;
m_selrow=-1;
m_selcol=-1;
return ListView_DeleteAllItems(m_hCtrl);
}
void zListControl::Reset()
{
ResetRow();
int iColumn = m_vListColumn.Size();
for (int c=iColumn;c>=0;c--) ListView_DeleteColumn(m_hCtrl,c);
m_vListColumn.Reset();
m_selrow=-1;
m_selcol=-1;
}
void zListControl::SetColumnFlags(int n,int nFlags)
{
m_vListColumn.SetFlags(n,nFlags);
LVCOLUMN lvc;
memset(&lvc,0,sizeof(LVCOLUMN));
lvc.mask = LVCF_FMT;
lvc.fmt = nFlags;
ListView_SetColumn(m_hCtrl,n,&lvc);
}
void zListControl::SetColumnImage(int n,int nImage)
{
//如果nImage>图标总数,设置成 0
m_vListColumn.SetColumnImage(n,nImage);
LVCOLUMN lvc;
memset(&lvc,0,sizeof(LVCOLUMN));
lvc.mask = LVCF_IMAGE;
lvc.iImage = nImage;
ListView_SetColumn(m_hCtrl,n,&lvc);
}
int zListControl::AddColumn(int size, TCHAR * pTitle)
{
if (!m_hCtrl) return 0;
//向存储中添加
m_colcnt = m_vListColumn.Size();
m_vListColumn.AddColumn(pTitle,size);
//向界面上添加
LVCOLUMN lvCol;
lvCol.mask= LVCF_TEXT | LVCF_WIDTH | LVCF_FMT | LVCF_SUBITEM;
lvCol.pszText= pTitle;
lvCol.cx= size;
lvCol.fmt= LVCFMT_LEFT;
lvCol.iSubItem= m_colcnt;
// int ret = (int)SendMessage(m_hCtrl, LVM_INSERTCOLUMN,m_colcnt, (LPARAM)&lvCol);
int ret = ListView_InsertColumn(m_hCtrl,m_colcnt,&lvCol);
//存储有多少个项
m_colcnt = m_vListColumn.Size();
//向项上添加
zListRow * pRow = NULL;
int rows = ListView_GetItemCount(m_hCtrl);
for (int i=0;i<rows;i++)
{
pRow = this->GetParam(i);
pRow->AddItemText(_T(""));
}
return ret;
}
int zListControl::DeleteColumn(int iColumn)
{
if (iColumn>=m_colcnt) return 0;
//删除列存储
m_vListColumn.DeleteColumn(iColumn);
//删除界面
ListView_DeleteColumn(m_hCtrl,iColumn);
//删除行存储
zListRow * pRow = NULL;
int rows = ListView_GetItemCount(m_hCtrl);
for (int i=0;i<rows;i++)
{
pRow = this->GetParam(i);
pRow->DeleteItemText(iColumn);
}
//返回
m_colcnt = m_vListColumn.Size();
return m_colcnt;
}
int zListControl::AddRow()
{
zListRow * pRow = new zListRow(m_colcnt);
return AddRow(pRow,-1);
}
int zListControl::AddRow(zListRow * pRow,int iInsert)
{
LVITEM lvI; // list view item structure
memset(&lvI,0,sizeof(LVITEM));
lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
int index = ListView_GetItemCount(m_hCtrl);
if (iInsert<index) iInsert=index;
lvI.iItem = iInsert;
lvI.iSubItem = 0;
lvI.pszText = LPSTR_TEXTCALLBACK;
lvI.lParam = (LPARAM)pRow;
index = ListView_InsertItem(m_hCtrl, &lvI);
if ( index == -1)
return NULL;
int iColcnt = m_vListColumn.Size();
for (int iSubItem = 1; iSubItem < iColcnt; iSubItem++)
{
ListView_SetItemText( m_hCtrl,
index,
iSubItem,
LPSTR_TEXTCALLBACK);
}
ListView_Update(m_hCtrl,index);
return ListView_GetItemCount(m_hCtrl);
}
int zListControl::DeleteRow(long row)
{
if (!m_hCtrl) return 0;
return ListView_DeleteItem(m_hCtrl,row);
}
int zListControl::OnPopupMenu(POINT point)
{
if (m_nMenuId<=0) return 0;
// TCHAR sz[300]={0};
HMENU hMenu;
HMENU hMenuTrackPopup;
hMenu = LoadMenu (m_hInst, MAKEINTRESOURCE(m_nMenuId));
if (NULL != hMenu)
{
hMenuTrackPopup = GetSubMenu(hMenu, 0);
POINT pt;
LVHITTESTINFO tti;
GetCursorPos(&pt);
tti.pt = pt;
ScreenToClient(m_hCtrl,&tti.pt);
int hi = ListView_HitTest(m_hCtrl,&tti);
if(hi && (tti.flags && LVHT_ONITEM))
{
//在项上面弹出菜单
// ListView_SetItem(m_hCtrl,hi);
HWND hParent = ::GetParent(m_hCtrl);
TrackPopupMenu(hMenuTrackPopup, TPM_LEFTALIGN|TPM_TOPALIGN, pt.x, pt.y, 0, hParent, NULL);
DestroyMenu(hMenu);
}else
{
//不在项上面弹出菜单
}
}else return 0;
return 1;
}
zListRow * zListControl::GetParam(int row)
{
LVITEM lvi;
memset(&lvi,0,sizeof(LVITEM));
lvi.iItem=row;
lvi.mask=LVIF_PARAM;
ListView_GetItem(m_hCtrl,&lvi);
return (zListRow *)lvi.lParam;
}
void zListControl::SetImageList(zGraphList * pList)
{
if (!m_hCtrl) return;
if (pList)
{
m_pImageList = pList;
m_pImageSave = pList;
ListView_SetImageList(m_hCtrl,m_pImageList->m_hList,TVSIL_NORMAL);
}else
{
m_pImageList = NULL;
ListView_SetImageList(m_hCtrl,NULL,TVSIL_NORMAL);
}
}
/* 排序算法
int CALLBACK ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
HOUSEINFO *pHouse1 = (HOUSEINFO *)lParam1;
HOUSEINFO *pHouse2 = (HOUSEINFO *)lParam2;
LPTSTR lpStr1, lpStr2;
int iResult;
if (pHouse1 && pHouse2)
{
switch( lParamSort)
{
case 0: // sort by Address
lpStr1 = pHouse1->szAddress;
lpStr2 = pHouse2->szAddress;
iResult = lstrcmpi(lpStr1, lpStr2);
break;
case 1: // sort by city
lpStr1 = pHouse1->szCity;
lpStr2 = pHouse2->szCity;
iResult = lstrcmpi(lpStr1, lpStr2);
break;
case 2: // sort by price
iResult = pHouse1->iPrice - pHouse2->iPrice;
break;
case 3: // sort by number of bedrooms
iResult = pHouse1->iBeds - pHouse2->iBeds;
break;
case 4: // sort by number of bathrooms
iResult = pHouse1->iBaths - pHouse2->iBaths;
break;
default:
iResult = 0;
break;
}
}
return(iResult);
}
*/
int zListControl::SetItemText(int row,int col,TCHAR * pTitle)
{
if (!m_hCtrl) return 0;
int total = ListView_GetItemCount(m_hCtrl);
zListRow * pRow = NULL;
if (row>=total)
{
pRow = new zListRow(m_colcnt);
this->AddRow(pRow);
}else
{
pRow = (zListRow *)this->GetParam(row);
}
int size = m_vListColumn.Size();
if (col>=size) return 0;
pRow->SetItemText(col,pTitle);
ListView_Update(m_hCtrl,row);
return 1;
}
int zListControl::GetItemText(int row,int col,TCHAR * pTitle,int iSize)
{
if (!m_hCtrl) return 0;
zListRow * pRow = (zListRow *)this->GetParam(row);
if (pRow)
{
TCHAR * p = pRow->GetItemText(col);
_tcsncpy(pTitle,p,iSize);
}
return (int)_tcslen(pTitle);
}
void zListControl::OnDblClick(zListRow * pRow)
{
TCHAR szName[MAX_PATH]={0};
if(pRow)
{
if(_tcscmp(pRow->GetItemText(1),_T(".exe"))==0)
{
_tcscpy(szName,m_szPath);
_tcscat(szName,_T("\\"));
_tcscat(szName,pRow->GetItemText(0));
::OutputDebugString(szName);
CreateProcess(szName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
}else //其他类型,需要查注册表
{
}
}
}
void zListControl::InsertDiskList()
{
AddColumn(150,_T("名称")); this->SetColumnFlags(0,LVCFMT_LEFT);
AddColumn(0,_T("类型")); this->SetColumnFlags(1,LVCFMT_RIGHT);
AddColumn(75,_T("大小")); this->SetColumnFlags(2,LVCFMT_RIGHT);
AddColumn(0,_T("时间")); this->SetColumnFlags(3,LVCFMT_RIGHT);
}
void zListControl::FlushDiskList(TCHAR * pPath)
{
//操作,遍历选择项.
TCHAR sa[MAX_PATH]={0}; //tmp
TCHAR sz[MAX_PATH]={0}; //名字
TCHAR pn[MAX_PATH]={0}; //路径+查询(*.*)
_tcscpy(m_szPath,pPath);
_tcscpy(pn,pPath);
_tcscat(pn,_T("\\*.*"));
this->ResetRow();
zFileFind ff;
ff.FindFirstFile(pn);
if (ff.m_hFind!=INVALID_HANDLE_VALUE)
{
SetCursor(LoadCursor(NULL, IDC_WAIT)); //放在线程中?
do{
_tcscpy(sz,ff.m_find.cFileName);
// zNode * pNode = new zNode();
// _tcscpy(pNode->sPath,pa); _tcscat(pNode->sPath,_T("\\")); _tcscat(pNode->sPath,sz);
// _tcscpy(pNode->sName,sz);
if(ff.m_find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// pNode->nState = 1; //Directory
// AddChild(pNode);
}else
{
// this->AddRow();
int index = this->GetItemSize();
//文件名
this->SetItemText(index,0,sz);
//文件类型
TCHAR * p = _tcsstr(sz,_T("."));
if(p) SetItemText(index,1,p);
else SetItemText(index,1,_T("文件"));
//文件大小
wsprintf(sa,_T("%d"),ff.m_find.nFileSizeLow);
{
int size = ff.m_find.nFileSizeLow;
// int po = 0;
// while(size>10) {size/=10; po++;}
double ds = (double)ff.m_find.nFileSizeLow;
if(ds<1000) wsprintf(sa,_T("%d%s"),ff.m_find.nFileSizeLow,_T("B"));
else if(ds>=1000 && ds<1000000) wsprintf(sa,_T("%.2f%s"),ds/1024,_T("K"));
else wsprintf(sa,_T("%.2f%s"),ds/(1048576),_T("M"));
}
this->SetItemText(index,2,sa);
SYSTEMTIME st;
FileTimeToSystemTime(&ff.m_find.ftCreationTime,&st);
wsprintf(sa,_T("%d-%d-%d %d:%d:%d"),st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
this->SetItemText(index,3,sa);
// pNode->nState = 0; //file
// AddChild(pNode);
}
}while(ff.FindNextFile());
SetCursor(LoadCursor (NULL, IDC_ARROW));
}
ff.FindClose();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -