VC里面的ListCtrl在详细资料排列方式下能不能象Excel那样编辑里面的东西? 用ListCtrl自带的方式只能编辑第一列的东西,其他的要是想编辑的话只能自己做。主要就是自己建立一个CEdit,该编辑哪个小格的时候就把CEdit移到哪儿。这儿有篇文章,可能对你会有点儿帮助http://www.vckbase.com/document/ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我写的一个类,如下:// ParamListCtrl.cpp : implementation file//#include "stdafx.h"#include "ParamListCtrl.h"#include"MainFrm.h"#include "childFrm.h"#include"UAB.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//#define TOKEN_SIZE 256/////////////////////////////////////////////////////////////////////////////// CParamListCtrlCParamListCtrl::CParamListCtrl(){ m_nType=DEFALUT_TYPE;}CParamListCtrl::~CParamListCtrl(){}BEGIN_MESSAGE_MAP(CParamListCtrl, CListCtrl) //{{AFX_MSG_MAP(CParamListCtrl) ON_WM_LBUTTONDOWN() ON_WM_SETFOCUS() ON_WM_HSCROLL() ON_WM_VSCROLL() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CParamListCtrl message handlers/************************************************************************** 原形:CParamListCtrl::PreSubclassWindow() 功能:在窗口子类化之前设置窗口的子集,它允许动态创建窗口的子集 参数:无 返回值:无 创建人: **************************************************************************/void CParamListCtrl::PreSubclassWindow() { //设置当前的行列为0// m_bIsIdxParamList = FALSE; m_nCurrentLine = 0; m_nCurrentRow = 0; //调用CEdit类的Create函数创建一个编辑框,我们可以自己设计它的风格// m_edit.Create(WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT, CRect(0,0,0,0),this,1001); //设置编辑框的字体 m_edit.SetFont(GetFont()); //限制编辑框的长度// m_edit.SetLimitText(TOKEN_SIZE-1); if (GetItemCount() == 0) InsertItem(0,""); //调用SetExtendedStyle函数 SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); GetHeaderCtrl()->ModifyStyle(0,HDS_HOTTRACK); CListCtrl::PreSubclassWindow();}void CParamListCtrl::OnLButtonDown(UINT nFlags, CPoint point) { CListCtrl::OnLButtonDown(nFlags, point); LVHITTESTINFO hti; memset(&hti,0,sizeof(LVHITTESTINFO)); hti.pt = point; SubItemHitTest(&hti); if (hti.iSubItem == -1) return; if (hti.iItem == -1) { hti.iItem = GetItemCount(); InsertItem(hti.iItem,""); } //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(hti.iItem,hti.iSubItem); break; case PROCCOMM_WIZARD: SelectItem(hti.iItem,1); break; case BUSINESSVAR_WND: SelectItem(hti.iItem,hti.iSubItem); break; case GLOBALVAR_WND: SelectItem(hti.iItem,hti.iSubItem); break; case LOCALVAR_WND: SelectItem(hti.iItem,hti.iSubItem); break; default: SelectItem(hti.iItem,hti.iSubItem); break; }}void CParamListCtrl::SelectItem(int nLine,int nRow){ int nColumnCount = GetHeaderCtrl()->GetItemCount(); if (nColumnCount == 0) return; CRect rcItem; GetSubItemRect(nLine,nRow,LVIR_BOUNDS,rcItem); if (nRow == 0 && nColumnCount > 1) // { CRect rcSecond; GetSubItemRect(nLine,nRow + 1,LVIR_BOUNDS,rcSecond); rcItem.right = rcSecond.left; } if (::IsWindow(m_edit.m_hWnd))//这里加了nRow==1这个判断条件 { AcceptText(); CRect ItemRect; GetHeaderCtrl()->GetClientRect(ItemRect); if(rcItem.top>ItemRect.Height()) m_edit.MoveWindow(rcItem); Update(m_nCurrentLine); RedrawItems(1,GetItemCount()); m_edit.SetWindowText(GetItemText(nLine,nRow)); m_edit.SetModify(FALSE); m_edit.SetFocus(); m_edit.SetSel(0,-1); } m_nCurrentLine = nLine; m_nCurrentRow = nRow;}//处理键盘上的响应消息BOOL CParamListCtrl::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN) { int nStart,nEnd; int nLine = m_nCurrentLine; int nRow = m_nCurrentRow; int nColumnCount = GetHeaderCtrl()->GetItemCount(); switch (pMsg->wParam) { //回车,TAB键属性 case VK_TAB: // case VK_RETURN: nRow++; if (nRow >= nColumnCount) { nRow = 0; nLine++; if (nLine >= GetItemCount()) { nLine = GetItemCount(); InsertItem(nLine,""); } } //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(nLine,nRow); break; case PROCCOMM_WIZARD: SelectItem(nLine,1); break; case BUSINESSVAR_WND: SelectItem(nLine,nRow); break; case GLOBALVAR_WND: SelectItem(nLine,nRow); break; case LOCALVAR_WND: SelectItem(nLine,nRow); break; default: break; } // SelectItem(nLine,nRow); return TRUE; case VK_LEFT: m_edit.GetSel(nStart,nEnd); if (nStart == 0 && nEnd == 0) { nRow--; if (nRow < 0) { nRow = nColumnCount-1; nLine--; if (nLine < 0) nLine = GetItemCount()-1; } //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(nLine,nRow); break; case PROCCOMM_WIZARD: SelectItem(nLine,1); break; case BUSINESSVAR_WND: SelectItem(nLine,nRow); break; case GLOBALVAR_WND: SelectItem(nLine,nRow); break; case LOCALVAR_WND: SelectItem(nLine,nRow); break; default: break; } }else { m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); } return TRUE; case VK_RIGHT: m_edit.GetSel(nStart,nEnd); if (nStart == m_edit.GetWindowTextLength() && nStart == nEnd) { nRow++; if (nRow >= nColumnCount) { nRow = 0; nLine++; if (nLine >= GetItemCount()) nLine = 0; } // SelectItem(nLine,nRow); //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(nLine,nRow); break; case PROCCOMM_WIZARD: SelectItem(nLine,1); break; case BUSINESSVAR_WND: SelectItem(nLine,nRow); break; case GLOBALVAR_WND: SelectItem(nLine,nRow); break; case LOCALVAR_WND: SelectItem(nLine,nRow); break; default: break; } }else { m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); } return TRUE; case VK_UP: nLine--; if (nLine < 0) nLine = GetItemCount() - 1; // SelectItem(nLine,nRow); //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(nLine,nRow); break; case PROCCOMM_WIZARD: SelectItem(nLine,1); break; case BUSINESSVAR_WND: SelectItem(nLine,nRow); break; case GLOBALVAR_WND: SelectItem(nLine,nRow); break; case LOCALVAR_WND: SelectItem(nLine,nRow); break; default: break; } return TRUE; case VK_DOWN: nLine++; if (nLine >= GetItemCount()) { nLine = GetItemCount(); InsertItem(nLine,""); } // if (nLine >= GetItemCount()) // nLine = 0; // SelectItem(nLine,nRow); //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(nLine,nRow); break; case PROCCOMM_WIZARD: SelectItem(nLine,1); break; case BUSINESSVAR_WND: SelectItem(nLine,nRow); break; case GLOBALVAR_WND: SelectItem(nLine,nRow); break; case LOCALVAR_WND: SelectItem(nLine,nRow); break; default: break; } return TRUE; default: break; } } return CListCtrl::PreTranslateMessage(pMsg);}void CParamListCtrl::OnSetFocus(CWnd* pOldWnd) { CListCtrl::OnSetFocus(pOldWnd); m_edit.ShowWindow(SW_SHOW); //在这里要判断类型,并选择作一定相应的处理// switch(m_nType) { case PROCCOMM_SET : SelectItem(m_nCurrentLine,m_nCurrentRow); break; case PROCCOMM_WIZARD: SelectItem(m_nCurrentLine,1); break; case BUSINESSVAR_WND: SelectItem(m_nCurrentLine,m_nCurrentRow); break; case GLOBALVAR_WND: SelectItem(m_nCurrentLine,m_nCurrentRow); break; case LOCALVAR_WND: SelectItem(m_nCurrentLine,m_nCurrentRow); break; default: break; }// SelectItem(m_nCurrentLine,m_nCurrentRow);}void CParamListCtrl::AcceptText(){ CUABApp* pApp=(CUABApp*)AfxGetApp(); CMainFrame* pMainWnd=(CMainFrame*)AfxGetMainWnd(); if (m_edit.GetModify()) { CString strEdit; m_edit.GetWindowText(strEdit); //判断变量类型并作出相应处理 if(strEdit!="") { strEdit.TrimLeft(); strEdit.TrimRight(); } switch(m_nType) { case PROCCOMM_SET : // 过程命令参数设置 //参数类型的自动填充 } SetItemText(m_nCurrentLine,m_nCurrentRow,strEdit); }}BOOL CParamListCtrl::OnCommand(WPARAM wParam, LPARAM lParam) { if (HIWORD(wParam) == EN_KILLFOCUS && LOWORD(wParam) == 1001) { AcceptText(); m_edit.ShowWindow(SW_HIDE);// Update(m_nCurrentLine);// EnsureVisible(m_nCurrentLine,TRUE); } return CListCtrl::OnCommand(wParam, lParam);}void CParamListCtrl::SetListType(int nType){ m_nType=nType;}LPCTSTR CParamListCtrl::GetFullTypeName(LPCTSTR lpsz){ return NULL;}void CParamListCtrl::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 CParamListCtrl::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);} http://www.csdn.net/expert/topic/434/434283.shtm各位高人,请帮忙看一下,如能解决,必500分相送是关于网络文件传输的问题 vs2005 线程中初始串口,接收不到数据 100分求犀利字符串比较函数----标题长长长长长 关于对话框数组问题 使用ChangeDisplaySettings异常 请问在CComEnum这个类怎么用? 设置focus 我真的不知道要分数有什么用?哪位告诉我 高分求助!如何用程序获取显卡的物理地址? 我自己用VC写了一个activex控件,怎样显示选中的数据库 MFC中基于单文档弹出对话框 是兄弟的帮忙看一下到底我的编程先锋网页出了什么问题。(附图) C文件与CPP文件的区别!!!!!!!!!
// ParamListCtrl.cpp : implementation file
//#include "stdafx.h"
#include "ParamListCtrl.h"
#include"MainFrm.h"
#include "childFrm.h"
#include"UAB.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//#define TOKEN_SIZE 256/////////////////////////////////////////////////////////////////////////////
// CParamListCtrlCParamListCtrl::CParamListCtrl()
{
m_nType=DEFALUT_TYPE;
}CParamListCtrl::~CParamListCtrl()
{
}
BEGIN_MESSAGE_MAP(CParamListCtrl, CListCtrl)
//{{AFX_MSG_MAP(CParamListCtrl)
ON_WM_LBUTTONDOWN()
ON_WM_SETFOCUS()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CParamListCtrl message handlers
/**************************************************************************
原形:CParamListCtrl::PreSubclassWindow()
功能:在窗口子类化之前设置窗口的子集,它允许动态创建窗口的子集
参数:无
返回值:无
创建人: **************************************************************************/
void CParamListCtrl::PreSubclassWindow()
{
//设置当前的行列为0
// m_bIsIdxParamList = FALSE;
m_nCurrentLine = 0;
m_nCurrentRow = 0;
//调用CEdit类的Create函数创建一个编辑框,我们可以自己设计它的风格//
m_edit.Create(WS_CHILD | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,
CRect(0,0,0,0),this,1001);
//设置编辑框的字体
m_edit.SetFont(GetFont());
//限制编辑框的长度
// m_edit.SetLimitText(TOKEN_SIZE-1);
if (GetItemCount() == 0) InsertItem(0,"");
//调用SetExtendedStyle函数
SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT |
LVS_EX_GRIDLINES);
GetHeaderCtrl()->ModifyStyle(0,HDS_HOTTRACK); CListCtrl::PreSubclassWindow();
}void CParamListCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
CListCtrl::OnLButtonDown(nFlags, point); LVHITTESTINFO hti;
memset(&hti,0,sizeof(LVHITTESTINFO));
hti.pt = point;
SubItemHitTest(&hti);
if (hti.iSubItem == -1) return;
if (hti.iItem == -1)
{
hti.iItem = GetItemCount();
InsertItem(hti.iItem,"");
}
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(hti.iItem,hti.iSubItem);
break;
case PROCCOMM_WIZARD:
SelectItem(hti.iItem,1);
break;
case BUSINESSVAR_WND:
SelectItem(hti.iItem,hti.iSubItem);
break;
case GLOBALVAR_WND:
SelectItem(hti.iItem,hti.iSubItem);
break;
case LOCALVAR_WND:
SelectItem(hti.iItem,hti.iSubItem);
break;
default:
SelectItem(hti.iItem,hti.iSubItem);
break;
}
}void CParamListCtrl::SelectItem(int nLine,int nRow)
{
int nColumnCount = GetHeaderCtrl()->GetItemCount();
if (nColumnCount == 0) return; CRect rcItem;
GetSubItemRect(nLine,nRow,LVIR_BOUNDS,rcItem);
if (nRow == 0 && nColumnCount > 1) //
{
CRect rcSecond;
GetSubItemRect(nLine,nRow + 1,LVIR_BOUNDS,rcSecond);
rcItem.right = rcSecond.left;
} if (::IsWindow(m_edit.m_hWnd))//这里加了nRow==1这个判断条件
{
AcceptText();
CRect ItemRect;
GetHeaderCtrl()->GetClientRect(ItemRect);
if(rcItem.top>ItemRect.Height())
m_edit.MoveWindow(rcItem);
Update(m_nCurrentLine);
RedrawItems(1,GetItemCount());
m_edit.SetWindowText(GetItemText(nLine,nRow));
m_edit.SetModify(FALSE);
m_edit.SetFocus();
m_edit.SetSel(0,-1);
}
m_nCurrentLine = nLine;
m_nCurrentRow = nRow;
}//处理键盘上的响应消息
BOOL CParamListCtrl::PreTranslateMessage(MSG* pMsg)
{ if (pMsg->message == WM_KEYDOWN)
{
int nStart,nEnd;
int nLine = m_nCurrentLine;
int nRow = m_nCurrentRow;
int nColumnCount = GetHeaderCtrl()->GetItemCount();
switch (pMsg->wParam)
{
//回车,TAB键属性
case VK_TAB:
// case VK_RETURN:
nRow++;
if (nRow >= nColumnCount)
{
nRow = 0;
nLine++;
if (nLine >= GetItemCount())
{
nLine = GetItemCount();
InsertItem(nLine,"");
}
}
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(nLine,nRow);
break;
case PROCCOMM_WIZARD:
SelectItem(nLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(nLine,nRow);
break;
case GLOBALVAR_WND:
SelectItem(nLine,nRow);
break;
case LOCALVAR_WND:
SelectItem(nLine,nRow);
break;
default:
break;
}
// SelectItem(nLine,nRow);
return TRUE;
case VK_LEFT:
m_edit.GetSel(nStart,nEnd);
if (nStart == 0 && nEnd == 0)
{
nRow--;
if (nRow < 0)
{
nRow = nColumnCount-1;
nLine--;
if (nLine < 0)
nLine = GetItemCount()-1;
}
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(nLine,nRow);
break;
case PROCCOMM_WIZARD:
SelectItem(nLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(nLine,nRow);
break;
case GLOBALVAR_WND:
SelectItem(nLine,nRow);
break;
case LOCALVAR_WND:
SelectItem(nLine,nRow);
break;
default:
break;
}
}else
{
m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
}
return TRUE;
case VK_RIGHT:
m_edit.GetSel(nStart,nEnd);
if (nStart == m_edit.GetWindowTextLength() && nStart == nEnd)
{
nRow++;
if (nRow >= nColumnCount)
{
nRow = 0;
nLine++;
if (nLine >= GetItemCount())
nLine = 0;
}
// SelectItem(nLine,nRow);
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(nLine,nRow);
break;
case PROCCOMM_WIZARD:
SelectItem(nLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(nLine,nRow);
break;
case GLOBALVAR_WND:
SelectItem(nLine,nRow);
break;
case LOCALVAR_WND:
SelectItem(nLine,nRow);
break;
default:
break;
}
}else
{
m_edit.SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
}
return TRUE;
case VK_UP:
nLine--;
if (nLine < 0)
nLine = GetItemCount() - 1;
// SelectItem(nLine,nRow);
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(nLine,nRow);
break;
case PROCCOMM_WIZARD:
SelectItem(nLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(nLine,nRow);
break;
case GLOBALVAR_WND:
SelectItem(nLine,nRow);
break;
case LOCALVAR_WND:
SelectItem(nLine,nRow);
break;
default:
break;
}
return TRUE;
case VK_DOWN:
nLine++;
if (nLine >= GetItemCount())
{
nLine = GetItemCount();
InsertItem(nLine,"");
}
// if (nLine >= GetItemCount())
// nLine = 0;
// SelectItem(nLine,nRow);
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(nLine,nRow);
break;
case PROCCOMM_WIZARD:
SelectItem(nLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(nLine,nRow);
break;
case GLOBALVAR_WND:
SelectItem(nLine,nRow);
break;
case LOCALVAR_WND:
SelectItem(nLine,nRow);
break;
default:
break;
}
return TRUE;
default:
break;
}
} return CListCtrl::PreTranslateMessage(pMsg);
}void CParamListCtrl::OnSetFocus(CWnd* pOldWnd)
{
CListCtrl::OnSetFocus(pOldWnd);
m_edit.ShowWindow(SW_SHOW);
//在这里要判断类型,并选择作一定相应的处理//
switch(m_nType)
{
case PROCCOMM_SET :
SelectItem(m_nCurrentLine,m_nCurrentRow);
break;
case PROCCOMM_WIZARD:
SelectItem(m_nCurrentLine,1);
break;
case BUSINESSVAR_WND:
SelectItem(m_nCurrentLine,m_nCurrentRow);
break;
case GLOBALVAR_WND:
SelectItem(m_nCurrentLine,m_nCurrentRow);
break;
case LOCALVAR_WND:
SelectItem(m_nCurrentLine,m_nCurrentRow);
break;
default:
break;
}
// SelectItem(m_nCurrentLine,m_nCurrentRow);
}void CParamListCtrl::AcceptText()
{
CUABApp* pApp=(CUABApp*)AfxGetApp();
CMainFrame* pMainWnd=(CMainFrame*)AfxGetMainWnd(); if (m_edit.GetModify())
{
CString strEdit;
m_edit.GetWindowText(strEdit);
//判断变量类型并作出相应处理
if(strEdit!="")
{
strEdit.TrimLeft();
strEdit.TrimRight();
}
switch(m_nType)
{
case PROCCOMM_SET : // 过程命令参数设置
//参数类型的自动填充
}
SetItemText(m_nCurrentLine,m_nCurrentRow,strEdit);
}}BOOL CParamListCtrl::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (HIWORD(wParam) == EN_KILLFOCUS && LOWORD(wParam) == 1001)
{
AcceptText();
m_edit.ShowWindow(SW_HIDE);
// Update(m_nCurrentLine);
// EnsureVisible(m_nCurrentLine,TRUE);
} return CListCtrl::OnCommand(wParam, lParam);
}void CParamListCtrl::SetListType(int nType)
{
m_nType=nType;
}LPCTSTR CParamListCtrl::GetFullTypeName(LPCTSTR lpsz)
{
return NULL;
}void CParamListCtrl::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 CParamListCtrl::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);
}
是关于网络文件传输的问题