📄 mylistctrl.cpp
字号:
#include "stdafx.h"
#include "MyListCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct ItemData
{
public:
ItemData() : arrpsz( NULL ), dwData( NULL ) {}
LPTSTR* arrpsz;
DWORD dwData;
private:
ItemData( const ItemData& );
ItemData& operator=( const ItemData& );
};
CMyListCtrl::CMyListCtrl()
: m_iNumColumns( 0 )
, m_iSortColumn( -1 )
, m_bSortAscending( TRUE )
,blnMenu(TRUE)
,itemX(-1)
,itemY(-1)
,blnAllEdit(TRUE)
,m_EditStyle(ctr_Edit_DblClick)
{
}
CMyListCtrl::~CMyListCtrl()
{
CboArrayIndex.FreeExtra();
strArrayEditStyle.FreeExtra();
for(int i=0;i<CboArrayData.GetSize();i++)
{
CStringArray *strArray=(CStringArray *)CboArrayData.GetAt(i);
strArray->FreeExtra();
}
CboArrayData.FreeExtra();
NumArrayIndex.FreeExtra();
NumArrayData.FreeExtra();
}
BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CMyListCtrl)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)
ON_WM_DESTROY()
ON_WM_RBUTTONDOWN( )
ON_WM_LBUTTONDOWN( )
ON_WM_LBUTTONDBLCLK( )
ON_WM_PARENTNOTIFY()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_COMMAND(ID_MENU_list, OnMenuitemlist)
ON_COMMAND(ID_MENU_icon, OnMenuitemicon)
ON_COMMAND(ID_MENU_smallicon, OnMenuitemsmallicon)
ON_COMMAND(ID_MENU_report, OnMenuitemreport)
ON_COMMAND(ID_MENU_No,OnMenuNo)
ON_COMMAND(ID_MENU_Click,OnMenuClick)
ON_COMMAND(ID_MENU_DblClick,OnMenuDblClick)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CMyListCtrl::PreSubclassWindow()
{
ctl_EditText.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
ctl_EditDateTime.Create(ES_AUTOHSCROLL|WS_CHILD|ES_CENTER|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditDateTime);
ctl_EditComboDown.Create(WS_CHILD|CBS_DROPDOWN |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboDown);
ctl_EditComboDownList.Create(WS_CHILD|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP,CRect(0,0,0,0),this,ID_EditCboList);
ctl_EditNum.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(0,0,0,0),this,ID_EditText);
CFont *ft=GetFont();
ctl_EditComboDown.SetFont(ft,TRUE);
ctl_EditText.SetFont(ft,TRUE);
ctl_EditDateTime.SetFont(ft,TRUE);
ctl_EditNum.SetFont(ft,TRUE);
ctl_EditComboDownList.SetFont(ft,TRUE);
ctl_EditComboDownList.SetExtendedUI(TRUE);
ctl_EditComboDown.SetExtendedUI(TRUE);
// ModifyStyle(0,LVS_OWNERDRAWFIXED);
CListCtrl::PreSubclassWindow();
}
//添加一项
int CMyListCtrl::AddItem(int image)
{
LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
for(int i=0;i<m_iNumColumns;i++)
{
arrpsz[ i ] = new TCHAR[1];
(void)lstrcpy( arrpsz[ i ], "" );
}
int iIndex=InsertItem(GetItemCount(),"",image);
VERIFY( SetTextArray( iIndex, arrpsz ) );
return iIndex;
}
//设置排列方式
void CMyListCtrl::SetMyStyle(DWORD dwNewStyle)
{
if(itemX>=0&& itemY>=0)
SetEditPos(FALSE,itemX,itemY,FALSE);
DWORD oldStyle;
oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
if((oldStyle&LVS_TYPEMASK)!=dwNewStyle)
{
oldStyle&=~LVS_TYPEMASK;
oldStyle|=dwNewStyle;
SetWindowLong(GetSafeHwnd(),GWL_STYLE,oldStyle);
}
}
//返回排列方式
DWORD CMyListCtrl::GetMyStyle()
{
DWORD oldStyle,newStyle;
oldStyle=GetWindowLong(GetSafeHwnd(),GWL_STYLE);
newStyle=oldStyle&LVS_TYPEMASK;
return newStyle;
}
void CMyListCtrl::OnMenuitemlist()
{
SetMyStyle(LVS_LIST);
}
void CMyListCtrl::OnMenuitemicon()
{
SetMyStyle(LVS_ICON);
}
void CMyListCtrl::OnMenuitemreport()
{
SetMyStyle(LVS_REPORT);
}
void CMyListCtrl::OnMenuitemsmallicon()
{
SetMyStyle(LVS_SMALLICON);
}
void CMyListCtrl::OnMenuClick ()
{
m_EditStyle=ctr_Edit_Click;
SetEditPos(FALSE,itemX,itemY,FALSE);
}
void CMyListCtrl::OnMenuDblClick()
{
m_EditStyle=ctr_Edit_DblClick;
SetEditPos(FALSE,itemX,itemY,FALSE);
}
void CMyListCtrl::OnMenuNo()
{
if(m_EditStyle==ctr_Edit_No) return;
m_EditStyle=ctr_Edit_No;
if(!blnAllEdit) return;
if(itemY<0) return;
CString strText;
switch(GetColumnStyle(itemY))
{
case ctr_Edit_CboDownList:
ctl_EditComboDownList.ShowDropDown(FALSE);
ctl_EditComboDownList.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditComboDownList.ShowWindow(SW_HIDE);
break;
case ctr_Edit_CboDown:
ctl_EditComboDown.ShowDropDown(FALSE);
ctl_EditComboDown.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditComboDown.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Text:
ctl_EditText.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditText.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Time:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Date:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
case ctr_Edit_DateTime:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Num:
strText=ctl_EditNum.GetText();
SetItemText(itemX,itemY,strText);
ctl_EditNum.ShowWindow(SW_HIDE);
break;
default:
ctl_EditText.ShowWindow(SW_HIDE);
ctl_EditDateTime.ShowWindow(SW_HIDE);
ctl_EditComboDown.ShowWindow(SW_HIDE);
ctl_EditNum.ShowWindow(SW_HIDE);
break;
}
}
//右键单击显示菜单
void CMyListCtrl::OnLButtonDblClk( UINT nFlags, CPoint point )
{
if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
if(m_EditStyle==ctr_Edit_DblClick)
{
int i=itemY;
BOOL bln;
if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
GetItemPos(point);
bln=(i==itemY);
SetEditPos(TRUE,itemX,itemY,bln);
}
CListCtrl::OnLButtonDblClk(nFlags,point);
}
void CMyListCtrl::OnLButtonDown( UINT nFlags, CPoint point )
{
if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
if(m_EditStyle==ctr_Edit_Click)
{
int i=itemY;
BOOL bln;
if(itemY>=0) SetEditPos(FALSE,itemX,itemY,FALSE);
GetItemPos(point);
bln=(i==itemY);
SetEditPos(TRUE,itemX,itemY,bln); }
CListCtrl::OnLButtonDown(nFlags,point);
}
void CMyListCtrl::GetItemPos(CPoint point)
{
LVHITTESTINFO lvhti;
lvhti.pt = point;
int nItem = CListCtrl::SubItemHitTest(&lvhti);
if(nItem == -1)
return;
int nSubItem = lvhti.iSubItem;
itemX=nItem;
itemY=nSubItem;
}
void CMyListCtrl::SetEditPos(BOOL blnShow,int itemX,int itemY,BOOL blnCbo)
{
if(!blnAllEdit) return;
if(itemX<0||itemY<0) return;
if(m_EditStyle==ctr_Edit_No) return;
CString strText;
int i;
if(GetMyStyle()!=LVS_REPORT) return;
if(!blnShow)
{
switch(GetColumnStyle(itemY))
{
case ctr_Edit_CboDownList:
ctl_EditComboDownList.ShowDropDown(FALSE);
ctl_EditComboDownList.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditComboDownList.ShowWindow(SW_HIDE);
break;
case ctr_Edit_CboDown:
ctl_EditComboDown.ShowDropDown(FALSE);
ctl_EditComboDown.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditComboDown.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Text:
ctl_EditText.GetWindowText(strText);
SetItemText(itemX,itemY,strText);
ctl_EditText.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Time:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Date:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
case ctr_Edit_DateTime:
strText=ctl_EditDateTime.GetDetectText();
SetItemText(itemX,itemY,strText);
ctl_EditDateTime.ShowWindow(SW_HIDE);
break;
case ctr_Edit_Num:
strText=ctl_EditNum.GetText();
SetItemText(itemX,itemY,strText);
ctl_EditNum.ShowWindow(SW_HIDE);
break;
default:
ctl_EditText.ShowWindow(SW_HIDE);
ctl_EditDateTime.ShowWindow(SW_HIDE);
ctl_EditComboDown.ShowWindow(SW_HIDE);
ctl_EditNum.ShowWindow(SW_HIDE);
break;
}
//Invalidate(TRUE);
return;
}
CRect rcCtrl;
strText=GetItemText(itemX,itemY);
CListCtrl::GetSubItemRect(itemX,itemY,LVIR_LABEL,rcCtrl);
switch(GetColumnStyle(itemY))
{
case ctr_Edit_CboDownList:
if(!blnCbo) FillCboData(itemY);
rcCtrl.bottom=rcCtrl.top+150;
i=ctl_EditComboDownList.FindString(0,strText);
if(i>=0)
ctl_EditComboDownList.SetCurSel(i);
else
ctl_EditComboDownList.SetCurSel(0);
ctl_EditComboDownList.MoveWindow(rcCtrl,TRUE);
ctl_EditComboDownList.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditComboDownList.m_hWnd);
break;
case ctr_Edit_CboDown:
if(!blnCbo) FillCboData(itemY);
rcCtrl.bottom=rcCtrl.top+150;
i=ctl_EditComboDown.FindString(0,strText);
if(i>=0) ctl_EditComboDown.SetCurSel(i);
ctl_EditComboDown.SetWindowText(strText);
ctl_EditComboDown.MoveWindow(rcCtrl,TRUE);
ctl_EditComboDown.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditComboDown.m_hWnd);
break;
case ctr_Edit_Date:
ctl_EditDateTime.SetClassType(edit_date);
ctl_EditDateTime.SetDetectText(strText);
ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
ctl_EditDateTime.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditDateTime.m_hWnd);
ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
break;
case ctr_Edit_DateTime:
ctl_EditDateTime.SetClassType(edit_datetime);
ctl_EditDateTime.SetDetectText(strText);
ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
ctl_EditDateTime.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditDateTime.m_hWnd);
ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
break;
case ctr_Edit_Time:
ctl_EditDateTime.SetClassType(edit_time);
ctl_EditDateTime.SetDetectText(strText);
ctl_EditDateTime.MoveWindow(rcCtrl,TRUE);
ctl_EditDateTime.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditDateTime.m_hWnd);
ctl_EditDateTime.SetSel(0,strText.GetLength(),TRUE);
break;
case ctr_Edit_Text:
ctl_EditText.SetWindowText(strText);
ctl_EditText.MoveWindow(rcCtrl,TRUE);
ctl_EditText.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditText.m_hWnd);
ctl_EditText.SetSel(0,strText.GetLength(),TRUE);
break;
case ctr_Edit_Num:
ctl_EditNum.blnAuto=GetNumEditAuto(itemY);
ctl_EditNum.SetNumType(GetNumEditStyle(itemY)->x,GetNumEditStyle(itemY)->y);
ctl_EditNum.SetText(strText);
ctl_EditNum.MoveWindow(rcCtrl,TRUE);
ctl_EditNum.ShowWindow(SW_SHOW);
::SetFocus(ctl_EditNum.m_hWnd);
ctl_EditNum.SetSel(0,strText.GetLength(),TRUE);
break;
default:
break;
}
}
void CMyListCtrl::SetItemFont(CFont ft)
{
ctl_EditComboDown.SetFont(&ft,TRUE);
ctl_EditText.SetFont(&ft,TRUE);
ctl_EditDateTime.SetFont(&ft,TRUE);
ctl_EditNum.SetFont(&ft,TRUE);
ctl_EditComboDownList.SetFont(&ft,TRUE);
}
void CMyListCtrl::OnRButtonDown( UINT nFlags, CPoint point )
{
if(!blnMenu) return;
CMenu m_MyRightMenu;
m_MyRightMenu.CreatePopupMenu();
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_No,"无模式");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_Click,"单击模式");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_DblClick,"双击模式");
m_MyRightMenu.AppendMenu(MF_SEPARATOR,ID_MENU_sep,"");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_icon,"大图标");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_smallicon,"小图标");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_list,"列表");
m_MyRightMenu.AppendMenu(MF_STRING,ID_MENU_report,"详细信息");
DWORD newStyle=GetMyStyle();
switch(newStyle)
{
case LVS_ICON:
m_MyRightMenu.CheckMenuItem(ID_MENU_icon,MF_CHECKED);
break;
case LVS_SMALLICON:
m_MyRightMenu.CheckMenuItem(ID_MENU_smallicon,MF_CHECKED);
break;
case LVS_LIST:
m_MyRightMenu.CheckMenuItem(ID_MENU_list,MF_CHECKED);
break;
case LVS_REPORT:
m_MyRightMenu.CheckMenuItem(ID_MENU_report,MF_CHECKED);
break;
default:
break;
}
ClientToScreen(&point);
m_MyRightMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this,NULL);
m_MyRightMenu.DestroyMenu();
CListCtrl::OnRButtonDown(nFlags,point);
}
//添加单列
int CMyListCtrl::InsertColumnX(CString strName,int nFormat,int iWidth,int intEdit)
{
int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -