⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listctrlex.cpp.svn-base

📁 vc环境下编译的一个对USB设备进行烧录的驱动程序
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
// 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 + -