📄 mylistctrl.cpp
字号:
}
void CMyListCtrl::Sort( int iColumn, BOOL bAscending )
{
m_iSortColumn = iColumn;
m_bSortAscending = bAscending;
m_ctlHeader.SetSortArrow( m_iSortColumn, m_bSortAscending );
VERIFY( SortItems( CompareFunction, reinterpret_cast<DWORD>( this ) ) );
}
void CMyListCtrl::OnDestroy()
{
for( int iItem = 0; iItem < GetItemCount(); iItem ++ )
FreeItemMemory( iItem );
CListCtrl::OnDestroy();
}
BOOL CMyListCtrl::SetItemText( int nItem, int nSubItem, LPCTSTR lpszText )
{
if( !CListCtrl::SetItemText( nItem, nSubItem, lpszText ) )
return FALSE;
LPTSTR* arrpsz = GetTextArray( nItem );
LPTSTR pszText = arrpsz[ nSubItem ];
delete[] pszText;
pszText = new TCHAR[ lstrlen( lpszText ) + 1 ];
(void)lstrcpy( pszText, lpszText );
arrpsz[ nSubItem ] = pszText;
return TRUE;
}
BOOL CMyListCtrl::SetItemData( int nItem, DWORD dwData )
{
if( nItem >= GetItemCount() )
return FALSE;
ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
ASSERT( pid );
pid->dwData = dwData;
return TRUE;
}
DWORD CMyListCtrl::GetItemData( int nItem ) const
{
ASSERT( nItem < GetItemCount() );
ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( nItem ) );
ASSERT( pid );
return pid->dwData;
}
BOOL CMyListCtrl::SetTextArray( int iItem, LPTSTR* arrpsz )
{
ASSERT( CListCtrl::GetItemData( iItem ) == NULL );
ItemData* pid = new ItemData;
pid->arrpsz = arrpsz;
return CListCtrl::SetItemData( iItem, reinterpret_cast<DWORD>( pid ) );
}
LPTSTR* CMyListCtrl::GetTextArray( int iItem ) const
{
ASSERT( iItem < GetItemCount() );
ItemData* pid = reinterpret_cast<ItemData*>( CListCtrl::GetItemData( iItem ) );
return pid->arrpsz;
}
void CMyListCtrl::SetShowMenu(BOOL blnShow)
{
blnMenu=blnShow;
}
BOOL CMyListCtrl::PreTranslateMessage(MSG* pMsg)
{
int i=itemX,j=itemY;
CRect rcCtrl;
if(pMsg->message == WM_KEYDOWN)
{
if(pMsg->wParam == VK_TAB)
{
if((itemY+1)<=m_iNumColumns)
{
SetEditPos(FALSE,i,j,FALSE);
if(FALSE == Key_Ctrl(i,j))
Key_Shift(i,j);
CListCtrl::GetSubItemRect(i,j,LVIR_LABEL,rcCtrl);
if(m_EditStyle==ctr_Edit_Click)
OnLButtonDown(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
else
OnLButtonDblClk(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
POSITION pos = CListCtrl::GetFirstSelectedItemPosition();
if (pos == NULL)
{
}
else
{
while (pos)
{
int ntpItem = CListCtrl::GetNextSelectedItem(pos);
CListCtrl::SetItemState(ntpItem,0,LVIS_SELECTED);
}
}
CListCtrl::SetItemState(i, LVIS_SELECTED, LVIS_SELECTED);
return TRUE;
}
}
else if(pMsg->wParam == VK_RETURN)
{
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
if(sRet == 0)
{
if(GetColumnStyle(j)!=ctr_Edit_No)
{
SetEditPos(FALSE,i,j,FALSE);
Key_Shift(i,j);
CListCtrl::GetSubItemRect(i,j,LVIR_LABEL,rcCtrl);
if(m_EditStyle==ctr_Edit_Click)
OnLButtonDown(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
else
OnLButtonDblClk(0,CPoint(rcCtrl.left+1,rcCtrl.top+1));
}
return TRUE;
}
else
{
if(GetColumnStyle(j)==ctr_Edit_CboDown)
ctl_EditComboDown.ShowDropDown(TRUE);
if(GetColumnStyle(j)==ctr_Edit_CboDownList)
ctl_EditComboDownList.ShowDropDown(TRUE);
return TRUE;
}
}
if(pMsg->wParam == VK_LEFT)
{
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
if(sRet!= 0)
{
switch(GetColumnStyle(j))
{
case ctr_Edit_No:
break;
case ctr_Edit_Text:
ctl_EditText.SetSel(0,0);
break;
case ctr_Edit_Date:
ctl_EditDateTime.SetSel(0,0);
break;
case ctr_Edit_DateTime:
ctl_EditDateTime.SetSel(0,0);
break;
case ctr_Edit_Time:
ctl_EditDateTime.SetSel(0,0);
break;
case ctr_Edit_CboDown:
ctl_EditComboDown.SetEditSel(0,0);
break;
// case ctr_Edit_CboDownList:
// ctl_EditComboDownList.SetEditSel(0,0);
// break;
case ctr_Edit_Num:
ctl_EditNum.SetSel(0,0);
break;
}
return TRUE;
}
}
if(pMsg->wParam == VK_RIGHT)
{
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
if(sRet!= 0)
{
switch(GetColumnStyle(j))
{
case ctr_Edit_No:
break;
case ctr_Edit_Text:
ctl_EditText.SetSel(-1);
break;
case ctr_Edit_Date:
ctl_EditDateTime.SetSel(-1);
break;
case ctr_Edit_DateTime:
ctl_EditDateTime.SetSel(-1);
break;
case ctr_Edit_Time:
ctl_EditDateTime.SetSel(-1);
break;
case ctr_Edit_Num:
ctl_EditNum.SetSel(-1);
break;
case ctr_Edit_CboDown:
CString str;
ctl_EditComboDown.GetWindowText(str);
ctl_EditComboDown.SetEditSel(str.GetLength(),str.GetLength());
break;
}
return TRUE;
}
}
if(pMsg->wParam == VK_DOWN)
{
CString strText;
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
if(sRet!= 0)
{
switch(GetColumnStyle(j))
{
case ctr_Edit_No:
break;
case ctr_Edit_Text:
ctl_EditText.GetWindowText(strText);
ctl_EditText.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Date:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_DateTime:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Time:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Num:
strText=ctl_EditNum.GetText();
ctl_EditNum.SetSel(0,strText.GetLength());
break;
case ctr_Edit_CboDown:
if(ctl_EditComboDown.GetCount()>0)
ctl_EditComboDown.SetCurSel(ctl_EditComboDown.GetCount()-1);
break;
case ctr_Edit_CboDownList:
if(ctl_EditComboDownList.GetCount()>0)
ctl_EditComboDownList.SetCurSel(ctl_EditComboDownList.GetCount()-1);
break;
default:
break;
}
return TRUE;
}
}
if(pMsg->wParam == VK_UP)
{
CString strText;
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
if(sRet!= 0)
{
switch(GetColumnStyle(j))
{
case ctr_Edit_No:
break;
case ctr_Edit_Text:
ctl_EditText.GetWindowText(strText);
ctl_EditText.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Date:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_DateTime:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Time:
strText=ctl_EditDateTime.GetDetectText();
ctl_EditDateTime.SetSel(0,strText.GetLength());
break;
case ctr_Edit_Num:
strText=ctl_EditNum.GetText();
ctl_EditNum.SetSel(0,strText.GetLength());
break;
case ctr_Edit_CboDown:
if(ctl_EditComboDown.GetCount()>0)
ctl_EditComboDown.SetCurSel(0);
break;
case ctr_Edit_CboDownList:
if(ctl_EditComboDownList.GetCount()>0)
ctl_EditComboDownList.SetCurSel(0);
break;
default:
break;
}
return TRUE;
}
}
}
return CListCtrl::PreTranslateMessage(pMsg);
}
void CMyListCtrl::OnParentNotify(UINT message, LPARAM lParam)
{
CListCtrl::OnParentNotify(message, lParam);
//////////////////////////////////////////////////////////////////////////
CHeaderCtrl* pHeaderCtrl = CListCtrl::GetHeaderCtrl();
if(pHeaderCtrl == NULL)
return;
CRect rcHeader;
pHeaderCtrl->GetWindowRect(rcHeader);
ScreenToClient(rcHeader);
//The x coordinate is in the low-order word and the y coordinate is in the high-order word.
CPoint pt;
pt.x = (int)LOWORD(lParam);
pt.y = (int)HIWORD(lParam);
if(rcHeader.PtInRect(pt) && message == WM_LBUTTONDOWN)
{
ctl_EditComboDown.ShowWindow(SW_HIDE);
ctl_EditDateTime.ShowWindow(SW_HIDE);
ctl_EditText.ShowWindow(SW_HIDE);
ctl_EditNum.ShowWindow(SW_HIDE);
}
}
BOOL CMyListCtrl::Key_Shift(int& nItem,int& nSub)
{
int nItemCount = CListCtrl::GetItemCount();
CHeaderCtrl* pHeader = CListCtrl::GetHeaderCtrl();
if(pHeader == NULL)
return FALSE;
short sRet = GetKeyState(VK_SHIFT);
int nSubcCount = pHeader->GetItemCount();
sRet = sRet >>15;
if(sRet == 0)
{
nSub += 1;
if(nSub >= nSubcCount)
{
if(nItem == nItemCount-1)
{
nItem = 0;
nSub = 0;
}
else
{
nSub = 0;
nItem += 1;
}
}
if(nItem >= nItemCount)
nItem = nItemCount-1;
return FALSE;
}
else
{
nSub -= 1;
if(nSub < 0)
{
nSub = nSubcCount -1;
nItem --;
}
if(nItem < 0)
nItem = nItemCount-1;
return TRUE;
}
return FALSE;
}
BOOL CMyListCtrl::Key_Ctrl(int& nItem,int &nSub)
{
short sRet = GetKeyState(VK_CONTROL);
sRet = sRet >>15;
int nItemCount = CListCtrl::GetItemCount();
if(sRet == 0)
{
}
else
{
nItem = nItem >=nItemCount-1? 0:nItem+=1;
return TRUE;
}
return FALSE;
}
void CMyListCtrl::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SetEditPos(FALSE,itemX,itemY,FALSE);
CListCtrl::OnHScroll(nSBCode,nPos,pScrollBar);
}
void CMyListCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SetEditPos(FALSE,itemX,itemY,FALSE);
CListCtrl::OnVScroll(nSBCode,nPos,pScrollBar);
}
void CMyListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (!lpDrawItemStruct) return;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rcItem;
CFont ft;
ft.CreateFont(10,10,0,0,
FW_NORMAL,FALSE,FALSE,FALSE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_MODERN,
"MS Sans Serif");
GetSubItemRect(lpDrawItemStruct->itemID,0,LVIR_LABEL,rcItem);
CString str;
str.Format("%d-----%d",lpDrawItemStruct->itemID,0);
pDC->SelectObject(&ft);
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(rcItem.left,rcItem.top,str);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -