📄 listctrlex.cpp.svn-base
字号:
// ListCtrlEx.cpp : implementation file
//
#include "stdafx.h"
#include "burnNand.h"
#include "ListCtrlEx.h"
#include "ListCellEdit.h"
#include "ConfigDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx
static int m_nIndex;
static int m_nSubItem;
static bool m_bHit;
static int m_nInterval;
#define IDC_PROPCMBBOX 1500
CListCtrlEx::CListCtrlEx()
: m_ItemIndex(0), m_SubItemIndex(0)
{
m_nIndex = -1;
m_nSubItem = -1;
m_bHit = FALSE;
m_nInterval = 0;
for(int i = 0; i < T_POP_ITEM_NUM; i++)
{
m_pop_item[i].SubItemType = T_POP_NULL;
}
}
CListCtrlEx::~CListCtrlEx()
{
}
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlEx)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_VSCROLL()
ON_WM_HSCROLL()
ON_WM_SIZE()
ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndlabeledit)
ON_WM_KEYDOWN()
ON_WM_LBUTTONDBLCLK()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
ON_CBN_KILLFOCUS(IDC_PROPCMBBOX, OnKillfocusCmbBox)
ON_CBN_SELCHANGE(IDC_PROPCMBBOX, OnSelchangeCmbBox)
ON_COMMAND_RANGE(IMENU_ITEM_ID,IMENU_ITEM_ID+100, OnMenuSelect)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListCtrlEx message handlers
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
// Take the default processing unless we set this to something else below.
*pResult = CDRF_DODEFAULT;
// First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
// This is the notification message for an item. We'll request
// notifications before each subitem's prepaint stage.
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
}
BOOL CListCtrlEx::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if( pMsg->message == WM_KEYDOWN )
{
if(pMsg->wParam == VK_RETURN)
return TRUE;
}
return CListCtrl::PreTranslateMessage(pMsg);
}
bool CListCtrlEx::SetSubItemPopItem(int nSubItem, T_POP_TYPE type, CString str)
{
if(nSubItem >= T_POP_ITEM_NUM)
return false;
m_pop_item[nSubItem].SubItemType = type;
m_pop_item[nSubItem].ItemString = str;
return true;
}
void CListCtrlEx::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString strIndex;
CListCtrl::OnLButtonDblClk(nFlags, point);
int nItem=0, nSubItem=0;
int rowHeight=0, rowCnt=0;
CRect rect;
CConfigDlg *pDlg = (CConfigDlg *)GetParent();
if ((nItem = HitTestEx (point, nSubItem)) != -1)
{
if (nSubItem != 0)
{
m_nIndex = nItem;
m_nSubItem = nSubItem;
if(m_pop_item[nSubItem].SubItemType == T_POP_MENU)
{
CMenu menu;
CString str;
int i = 0, i2 = 0, index = 0;
menu.CreatePopupMenu();
while ((i2 = m_pop_item[nSubItem].ItemString.Find('|',i)) != -1)
{
BOOL bRet=menu.AppendMenu(MF_STRING, IMENU_ITEM_ID + index,
m_pop_item[nSubItem].ItemString.Mid(i, i2-i));
index++;
i=i2+1;
}
CPoint ptScreen(point);
ClientToScreen(&ptScreen);
menu.TrackPopupMenu(TPM_LEFTBUTTON , ptScreen.x, ptScreen.y, this);
return;
}
else if(m_pop_item[nSubItem].SubItemType == T_POP_CMBBOX)
{
CRect Rect;
GetItemRect (nItem, &Rect, LVIR_BOUNDS);
for(int i = 0; i < nSubItem; i++)
{
Rect.left += GetColumnWidth(i);
}
m_cmbBox_nItem = nItem;
m_cmbBox_nSubItem = nSubItem;
if(!m_cmbBox)
{
Rect.bottom += 100;
m_cmbBox.Create(WS_VSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWNLIST |
CBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_CHILD | WS_BORDER,
Rect,this,IDC_PROPCMBBOX);
//m_cmbBox.SetFont(&m_SSerif8Font);
}
CString cmbItems = m_pop_item[nSubItem].ItemString;
CHAR lBoxSelText[255];
GetItemText(nItem, nSubItem, lBoxSelText, 255);
m_cmbBox.ResetContent();
int i2, strlength = 0;
i=0;
while ((i2=cmbItems.Find('|',i)) != -1)
{
if(strlength < (int)strlen(cmbItems.Mid(i,i2-i)))
strlength = strlen(cmbItems.Mid(i,i2-i));
m_cmbBox.AddString(cmbItems.Mid(i,i2-i));
i=i2+1;
}
extern LONG m_text_width;
strlength *= m_text_width;
strlength += GetSystemMetrics(SM_CXVSCROLL);
if(strlength < GetColumnWidth(nSubItem))
strlength = GetColumnWidth(nSubItem);
Rect.right = Rect.left + strlength;
if (m_cmbBox)
m_cmbBox.MoveWindow(Rect);
m_cmbBox.ShowWindow(SW_SHOW);
m_cmbBox.SetFocus();
//跳到当前值
int j = m_cmbBox.FindStringExact(0,lBoxSelText);
if (j != CB_ERR)
m_cmbBox.SetCurSel(j);
else
m_cmbBox.SetCurSel(0);
}
else
EditSubItem(nItem, nSubItem);
}
return;
}
rowCnt = GetItemCount();
if ( rowCnt== 0)
{
strIndex.Format("%d", rowCnt + 1);
InsertItem(rowCnt, strIndex);
//EditSubItem(0, 1);
}
else
{
GetItemRect (0, &rect, LVIR_BOUNDS);
rowHeight = rect.Height();
rect.top += rowHeight*rowCnt;
rect.bottom += rowHeight*rowCnt;
if (rect.PtInRect(point))
{
strIndex.Format("%d", rowCnt + 1);
InsertItem(rowCnt, strIndex);
//EditSubItem(rowCnt, 1);
}
}
}
void CListCtrlEx::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if (GetFocus() != this) SetFocus();
CListCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CListCtrlEx::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
if (GetFocus() != this) SetFocus();
CListCtrl::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CListCtrlEx::OnSize(UINT nType, int cx, int cy)
{
CListCtrl::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CListCtrlEx::OnEndlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;
LV_ITEM *plvItem = &plvDispInfo->item;
CConfigDlg * pDlg = (CConfigDlg *)GetParent();
if (plvItem->pszText != NULL)
{
SetItemText (plvItem->iItem, plvItem->iSubItem, plvItem->pszText);
}
*pResult = 0;
}
void CListCtrlEx::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
int k;
if (nChar == VK_DELETE)
{
CConfigDlg * pDlg = (CConfigDlg *)GetParent();
::SendMessage(pDlg->GetSafeHwnd(), WM_COMMAND, IDC_BUTTON4, 0);
if((k = GetNextItem(-1, LVNI_SELECTED)) != -1)
{
DeleteItem(k);
}
}
CListCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
int CListCtrlEx::HitTestEx (CPoint& Point, int& nSubItem)
{
nSubItem = 0;
int ColumnNum = 0;
int Row = HitTest (Point, NULL);
// Make sure that the ListView is in LVS_REPORT
if ((GetWindowLong (m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT)
return Row;
// Get the top and bottom row visible
Row = GetTopIndex();
int Bottom = Row + GetCountPerPage();
if (Bottom > GetItemCount())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -