settingvaluelistctrl.cpp

来自「一个很好的LFP规约调试器」· C++ 代码 · 共 221 行

CPP
221
字号
// SettingValueListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "TestLFPProtocol.h"
#include "SettingValueListCtrl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSettingValueListCtrl
CSettingValueListCtrl::CSettingValueListCtrl()
{
	m_pEdit = NULL;
	m_pComboBox = NULL;
}

CSettingValueListCtrl::~CSettingValueListCtrl()
{
	delete m_pEdit;
	delete m_pComboBox;
}

BEGIN_MESSAGE_MAP(CSettingValueListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CSettingValueListCtrl)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDOWN()
	ON_EN_KILLFOCUS(IDC_EDIT_CTRL, OnEnKillFocus)
	ON_CBN_SELCHANGE(IDC_COMBOBOX_CTRL, OnSelchangeCombo)
	ON_COMMAND(IDC_CTRL_CHANGE, OnChangeValue )
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSettingValueListCtrl message handlers
void CSettingValueListCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
	CListCtrl::OnRButtonDown(nFlags, point);
	CMenu PopMenu;
	CMenu *pMenu; 
	CPoint pt;
	pt = point;
	CTestLFPProtocolApp* pApp = ( CTestLFPProtocolApp* )AfxGetApp();
	PopMenu.LoadMenu( IDR_MENU_POPUP );
	ClientToScreen ( &pt );
	pMenu = PopMenu.GetSubMenu( 1 );
	pMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON, pt.x, pt.y, this );
}

void CSettingValueListCtrl::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	CListCtrl::OnLButtonDblClk(nFlags, point);
	LVHITTESTINFO hti = {0};
	hti.pt = point;
	if( SubItemHitTest( &hti ) == -1 ) return;
	
	int iItem = hti.iItem;
	int iSubItem = hti.iSubItem;
	if( iItem == -1 || iSubItem == -1 ) return;
	CRect rect;
	GetSubItemRect( iItem, iSubItem, LVIR_LABEL, rect );
	ClientToScreen( rect );
	CPoint pt( rect.right, rect.bottom );
	CRect rc;
	GetWindowRect( rc );
	if( !rc.PtInRect( pt ) ) SendMessage( WM_VSCROLL, SB_LINEDOWN, 0 );
	pt.x = rect.left;
	pt.y = rect.top;
	if( !rc.PtInRect( pt ) ) SendMessage( WM_VSCROLL, SB_LINEUP, 0 );
	m_iRow = iItem;
	m_iCol = iSubItem;
	CTestLFPProtocolApp* pApp = ( CTestLFPProtocolApp* )AfxGetApp();
	switch( m_iCol ) {
	case 2:
		if( m_iRow == 0 ) {
			OnShowEditCtrl();
			break;
		}
		if( pApp->m_pMainView->dev_settingvalue_type[m_iRow] == 1 ) {
			OnShowEditCtrl();
			break;
		}
		if( pApp->m_pMainView->dev_settingvalue_type[m_iRow] == 2 ) {
			OnShowComboxCtrl();
			break;
		}
		if( pApp->m_pMainView->dev_settingvalue_type[m_iRow] == 3 ) {
			OnShowComboxCtrl( TRUE );
			break;
		}
		break;
	default:	break;
	}
}

void CSettingValueListCtrl::OnShowEditCtrl( void )
{
	if( m_iRow >= GetItemCount() ) return;
	if( GetItemData( m_iRow ) & 1 ) {
		if( m_pEdit ) m_pEdit->ShowWindow( SW_HIDE );
		return;
	}

	CRect rect;
	GetSubItemRect( m_iRow, m_iCol, LVIR_LABEL, rect );
	rect.top;
	if( m_pEdit == NULL ) {
		m_pEdit = new CEdit;
		m_pEdit->Create( WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS |
			WS_TABSTOP | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL,
			rect, this, IDC_EDIT_CTRL );
		m_pEdit->SetFont( GetFont() );
		m_pEdit->ShowWindow( SW_SHOW );
	}
	else {
		m_pEdit->SetWindowPos( NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_SHOWWINDOW );
	}
	if( m_pComboBox ) m_pComboBox->ShowWindow( SW_HIDE );
	TCHAR szItem[256] = {0};
	LVITEM item;
	item.mask = LVIF_TEXT;
	item.iItem = m_iRow;
	item.iSubItem = m_iCol;
	item.cchTextMax = ARRSIZE( szItem );
	item.pszText = szItem;
	GetItem( &item );
	m_pEdit->SetWindowText( szItem );
	m_pEdit->SetSel( 0, -1 );
	m_pEdit->SetFocus();
	m_pEdit->BringWindowToTop();	
}

void CSettingValueListCtrl::OnEnKillFocus()
{
	if( m_iRow != -1 && m_iCol != -1 ) {
		if( m_pEdit && m_pEdit->IsWindowVisible() ) {
			CString strItem;
			m_pEdit->GetWindowText( strItem );
			strItem.TrimLeft();
			strItem.TrimRight();
			SetItemText( m_iRow, m_iCol, strItem );
		}
	}
	if( m_pEdit ) m_pEdit->ShowWindow( SW_HIDE );
}

void CSettingValueListCtrl::OnShowComboxCtrl( BOOL IsAlarm /*= FALSE*/ )
{
	if( m_iRow >= GetItemCount() ) return;
	if( GetItemData( m_iRow ) & 1 ) {
		if( m_pComboBox ) m_pComboBox->ShowWindow( SW_HIDE );
		return;
	}
	CRect rect;
	GetSubItemRect(m_iRow, m_iCol, LVIR_LABEL, rect );
	rect.bottom += 200;
	if( m_pComboBox == NULL ) {
		m_pComboBox = new CComboBox;
		m_pComboBox->Create( WS_VSCROLL | CBS_DROPDOWNLIST | WS_CHILD |
			WS_VISIBLE | WS_TABSTOP, rect, this, IDC_COMBOBOX_CTRL );
		m_pComboBox->SetFont( GetFont() );
		m_pComboBox->ShowWindow( SW_SHOW );
	}
	else {
		m_pComboBox->SetWindowPos( NULL, rect.left, rect.top, rect.Width(), rect.Height(), SWP_SHOWWINDOW );
	}
	if( m_pEdit ) m_pEdit->ShowWindow( SW_HIDE );
	m_pComboBox->ResetContent();
	CreateComboBox( IsAlarm );
	m_pComboBox->ShowDropDown( TRUE );
	TCHAR szItem[256] = {0};
	LVITEM item;
	item.mask = LVIF_TEXT;
	item.iItem = m_iRow;
	item.iSubItem = m_iCol;
	item.cchTextMax = ARRSIZE( szItem );
	item.pszText = szItem;
	GetItem( &item );
	m_pComboBox->SetFocus();
	m_pComboBox->SelectString( -1, szItem );
	m_pComboBox->BringWindowToTop();
}


void CSettingValueListCtrl::OnSelchangeCombo()
{
	if( m_iRow != -1 && m_iCol != -1 ) {
		if( m_pComboBox && m_pComboBox->IsWindowVisible() ) {
			CString	strItem;
			m_pComboBox->GetWindowText( strItem );
			strItem.TrimLeft();
			strItem.TrimRight();
			SetItemText( m_iRow, m_iCol, strItem );
		}
	}
	if( m_pComboBox ) m_pComboBox->ShowWindow( SW_HIDE );
}

void CSettingValueListCtrl::CreateComboBox( BOOL IsAlarm )
{
	if( IsAlarm ) {
		m_pComboBox->AddString( "报警" );
		m_pComboBox->AddString( "跳闸" );
	}
	else {
		m_pComboBox->AddString( "退出" );
		m_pComboBox->AddString( "投入" );
	}
}

void CSettingValueListCtrl::OnChangeValue()
{
	CTestLFPProtocolApp* pApp = ( CTestLFPProtocolApp* )AfxGetApp();
	pApp->m_pMainView->dev_ctrl.dev_set_settings = TRUE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?