📄 bcgpeditlistbox.cpp
字号:
m_ptClick = CPoint (-1, -1);
}
//**************************************************************************
CBCGPEditListBox::~CBCGPEditListBox()
{
if (m_pWndList != NULL)
{
ASSERT_VALID (m_pWndList);
delete m_pWndList;
}
}
BEGIN_MESSAGE_MAP(CBCGPEditListBox, CBCGPEditListBase)
//{{AFX_MSG_MAP(CBCGPEditListBox)
//}}AFX_MSG_MAP
ON_NOTIFY(LVN_KEYDOWN, iListId, OnKeyDown)
ON_NOTIFY(NM_DBLCLK, iListId, OnDblclkList)
ON_NOTIFY(LVN_GETDISPINFO, iListId, OnGetdispinfo)
ON_NOTIFY(LVN_ENDLABELEDIT, iListId, OnEndLabelEdit)
ON_NOTIFY(LVN_ITEMCHANGED, iListId, OnItemChanged)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBCGPEditListBox message handlers
CWnd* CBCGPEditListBox::OnCreateList ()
{
if (GetSafeHwnd () == NULL ||
m_pWndList != NULL)
{
return FALSE;
}
ASSERT (GetStyle () & WS_CHILD);
CRect rectEmpty;
rectEmpty.SetRectEmpty ();
m_pWndList = new CListCtrl;
m_pWndList->CWnd::CreateEx (WS_EX_CLIENTEDGE, _T("SysListView32"), _T(""),
WS_VISIBLE | WS_CHILD | LVS_REPORT | LVS_SINGLESEL |
LVS_NOCOLUMNHEADER | LVS_EDITLABELS | LVS_SHOWSELALWAYS,
rectEmpty, this, iListId);
m_pWndList->SendMessage (LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT);
m_pWndList->InsertColumn (0, _T(""));
return m_pWndList;
}
//*************************************************************************************
int CBCGPEditListBox::AddItem (const CString& strText, DWORD dwData, int iIndex)
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
return -1;
}
ASSERT_VALID (m_pWndList);
if (iIndex < 0)
{
iIndex = m_pWndList->GetItemCount ();
}
int iItem = m_pWndList->InsertItem (iIndex, strText, I_IMAGECALLBACK);
m_pWndList->SetItemData (iItem, dwData);
if (iItem == 0)
{
SelectItem (0);
}
return iItem;
}
//*************************************************************************************
int CBCGPEditListBox::GetCount () const
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
return -1;
}
return m_pWndList->GetItemCount ();
}
//*************************************************************************************
CString CBCGPEditListBox::GetItemText (int iIndex) const
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
return _T("");
}
ASSERT_VALID (m_pWndList);
return m_pWndList->GetItemText (iIndex, 0);
}
//*************************************************************************************
DWORD CBCGPEditListBox::GetItemData (int iIndex) const
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return 0;
}
ASSERT_VALID (m_pWndList);
return m_pWndList->GetItemData (iIndex);
}
//*************************************************************************************
void CBCGPEditListBox::SetItemData (int iIndex, DWORD dwData)
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT_VALID (m_pWndList);
m_pWndList->SetItemData (iIndex, dwData);
}
//*************************************************************************************
#if _MSC_VER >= 1300
void CBCGPEditListBox::OnKeyDown(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVKEYDOWN* pKeyDown = (NMLVKEYDOWN*) pNMHDR;
#else
void CBCGPEditListBox::OnKeyDown (LPNMLVKEYDOWN pKeyDown, LRESULT* pResult)
{
#endif
*pResult = 0;
if (pKeyDown != NULL)
{
BYTE fCurrVirt = 0;
if (::GetAsyncKeyState (VK_CONTROL) & 0x8000)
{
fCurrVirt |= FCONTROL;
}
if (::GetAsyncKeyState (VK_MENU) & 0x8000)
{
fCurrVirt |= FALT;
}
if (::GetAsyncKeyState (VK_SHIFT) & 0x8000)
{
fCurrVirt |= FSHIFT;
}
int iButton = 0;
for (POSITION pos = m_lstKeyAccell.GetHeadPosition (); pos != NULL; iButton ++)
{
DWORD dwKey = m_lstKeyAccell.GetNext (pos);
if (dwKey != 0 && pKeyDown->wVKey == (dwKey & 0xFFFF))
{
//-------------------
// Check state flags:
//-------------------
BYTE fVirt = (BYTE) (dwKey >> 16);
if (fCurrVirt == fVirt)
{
OnClickButton (iButton);
return;
}
}
}
OnKey (pKeyDown->wVKey, fCurrVirt);
}
}
//*************************************************************************************
int CBCGPEditListBox::GetSelItem () const
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return -1;
}
ASSERT_VALID (m_pWndList);
return m_pWndList->GetNextItem (-1, LVNI_SELECTED);
}
//*************************************************************************************
BOOL CBCGPEditListBox::SelectItem (int iItem)
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT_VALID (m_pWndList);
if (!m_pWndList->SetItemState (iItem, LVIS_SELECTED | LVIS_FOCUSED,
LVIS_SELECTED | LVIS_FOCUSED))
{
return FALSE;
}
return m_pWndList->EnsureVisible (iItem, FALSE);
}
//*************************************************************************************
void CBCGPEditListBox::OnDblclkList(NMHDR* /*pNMHDR*/, LRESULT* pResult)
{
*pResult = 0;
int iSelItem = GetSelItem ();
if ((m_uiStandardBtns & BGCEDITLISTBOX_BTN_NEW) && iSelItem == -1)
{
CreateNewItem ();
return;
}
if (iSelItem >= 0)
{
EditItem (iSelItem);
}
}
//*************************************************************************************
BOOL CBCGPEditListBox::RemoveItem (int iIndex)
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT_VALID (m_pWndList);
BOOL bIsSelected = (GetSelItem () == iIndex);
if (!m_pWndList->DeleteItem (iIndex))
{
return FALSE;
}
if (!bIsSelected || GetCount () == 0)
{
return FALSE;
}
//-------------------
// Restore selection:
//-------------------
if (iIndex >= GetCount ())
{
iIndex --;
}
SelectItem (iIndex);
return TRUE;
}
//*************************************************************************************
void CBCGPEditListBox::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT (pNMHDR != NULL);
LV_ITEM* pItem = &((LV_DISPINFO*)pNMHDR)->item;
ASSERT (pItem != NULL);
if (pItem->mask & LVIF_IMAGE)
{
pItem->iImage = OnGetImage (pItem);
}
*pResult = 0;
}
//**************************************************************************
void CBCGPEditListBox::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT (pNMHDR != NULL);
LV_ITEM* pItem = &((LV_DISPINFO*)pNMHDR)->item;
ASSERT (pItem != NULL);
OnEndEditLabel (pItem->pszText);
for (POSITION pos = m_lstButtons.GetTailPosition (); pos != NULL;)
{
CBCGPButton* pButton = m_lstButtons.GetPrev (pos);
ASSERT (pButton != NULL);
pButton->EnableWindow ();
}
*pResult = 0;
}
//**************************************************************************
void CBCGPEditListBox::OnItemChanged(NMHDR* pNMHDR, LRESULT* pResult)
{
ASSERT (pNMHDR != NULL);
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
ASSERT (pNMListView != NULL);
if (pNMListView->uChanged == LVIF_STATE &&
(pNMListView->uOldState & LVIS_SELECTED) != (pNMListView->uNewState & LVIS_SELECTED))
{
OnSelectionChanged ();
}
*pResult = 0;
}
//**************************************************************************
BOOL CBCGPEditListBox::EditItem (int iIndex)
{
m_wndEdit.LockSize (NULL, FALSE);
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return FALSE;
}
ASSERT_VALID (m_pWndList);
m_pWndList->SetFocus ();
CEdit* pEdit = m_pWndList->EditLabel (iIndex);
if (pEdit == NULL)
{
return FALSE;
}
ASSERT_VALID (pEdit);
m_wndEdit.SubclassWindow (pEdit->GetSafeHwnd ());
m_wndEdit.EnableBrowse (m_bBrowseButton);
CRect rectClient;
GetClientRect (rectClient);
CRect rectEdit;
pEdit->GetClientRect (rectEdit);
pEdit->SetWindowPos (NULL, -1, -1,
rectClient.Width () - 2 * afxData.cxBorder2 - ::GetSystemMetrics (SM_CXVSCROLL),
rectEdit.Height (),
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
m_wndEdit.LockSize (this);
for (POSITION pos = m_lstButtons.GetTailPosition (); pos != NULL;)
{
CBCGPButton* pButton = m_lstButtons.GetPrev (pos);
ASSERT (pButton != NULL);
pButton->EnableWindow (FALSE);
}
return TRUE;
}
//**************************************************************************
void CBCGPEditListBox::OnSizeList ()
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT_VALID (m_pWndList);
CRect rectClient;
GetClientRect (rectClient);
m_pWndList->SetColumnWidth (0, rectClient.Width () -
2 * ::GetSystemMetrics (SM_CXEDGE) -
::GetSystemMetrics (SM_CXVSCROLL));
}
//****************************************************************************
void CBCGPEditListBox::SetItemText (int iIndex, const CString& strText)
{
if (GetSafeHwnd () == NULL || m_pWndList == NULL)
{
ASSERT (FALSE);
return;
}
ASSERT_VALID (m_pWndList);
m_pWndList->SetItemText (iIndex, 0, strText);
}
//****************************************************************************
BOOL CBCGPEditListBox::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONDOWN &&
m_pWndList != NULL &&
m_pWndList->GetEditControl () == NULL &&
m_pWndList->GetSafeHwnd () == CWnd::GetFocus ()->GetSafeHwnd ())
{
ASSERT_VALID (m_pWndList);
m_ptClick = CPoint (-1, -1);
CPoint ptClick = pMsg->pt;
m_pWndList->ScreenToClient (&ptClick);
UINT uFlags;
int iItem = m_pWndList->HitTest (ptClick, &uFlags);
if (iItem >= 0 && (uFlags & LVHT_ONITEMLABEL))
{
UINT uiMask = LVIS_FOCUSED | LVIS_SELECTED;
if ((m_pWndList->GetItemState (iItem, uiMask) & uiMask) == uiMask)
{
// Secondary click on selected item:
m_ptClick = ptClick;
SetCapture ();
return TRUE;
}
}
}
else if (pMsg->message == WM_LBUTTONUP && m_ptClick != CPoint (-1, -1))
{
ASSERT_VALID (m_pWndList);
ReleaseCapture ();
CPoint ptClick = pMsg->pt;
m_pWndList->ScreenToClient (&ptClick);
int iItem = m_pWndList->HitTest (ptClick);
BOOL bEditItem =
iItem >= 0 &&
(abs (ptClick.x - m_ptClick.x) < ::GetSystemMetrics (SM_CXDRAG) &&
abs (ptClick.y - m_ptClick.y) < ::GetSystemMetrics (SM_CYDRAG));
m_ptClick = CPoint (-1, -1);
if (bEditItem)
{
EditItem (iItem);
}
return TRUE;
}
return CBCGPEditListBase::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -