请教怎么设置让CListCtrl可编辑

StarsWu 2005-04-20 01:04:44
将CListCtrl设为report后可以加多列,设置了Editable属性后只有第一列可以编辑。怎样让其他列可以编辑?谢先。
...全文
1553 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
StarsWu 2005-04-28
  • 打赏
  • 举报
回复
另,可不可以把OnCustomDraw写到派生的CListCtrl里?
StarsWu 2005-04-26
  • 打赏
  • 举报
回复
请教在EDIT外点鼠标左键时应该怎样将消息不通过主窗口直接传给EDIT,让EDIT返回值。主要是想实现封装。
jiudon 2005-04-24
  • 打赏
  • 举报
回复
高人啊,收藏先!!!
gracezhu277 2005-04-22
  • 打赏
  • 举报
回复
楼上的方法具体说一下好吗?关注ing...
Fzergling 2005-04-21
  • 打赏
  • 举报
回复
VCKBASE上有好多这样的例子,你可以去下个来看看就知道了
icper 2005-04-21
  • 打赏
  • 举报
回复
wangjia184(我就是传说中的。。。。。。SB) :
怎样判断输入结束呢?

只要edit丢失焦点或return ,esc就认为结束
anlywei 2005-04-21
  • 打赏
  • 举报
回复
gz
icper 2005-04-21
  • 打赏
  • 举报
回复
wangjia184 贴的代码已经计算出了edit的大小了
StarsWu 2005-04-21
  • 打赏
  • 举报
回复
wangjia184(我就是传说中的。。。。。。SB) :
怎样判断输入结束呢?
StarsWu 2005-04-21
  • 打赏
  • 举报
回复
回复人: oyljerry(【勇敢的心】→ ㊣Contributing A za!㊣) ( ) 信誉:120 2005-04-20 20:56:00 得分: 0

编辑框大小需要自己手动根据ListCtrl的单元格来自己调整,多调整一下,使它大小适合
-------------------------------------------------------------------------------------
这样不行吧,单元格的宽是可调整的,怎么能在程序中固定大小?


lizifong 2005-04-21
  • 打赏
  • 举报
回复
wangjia184(我就是传说中的。。。。。。SB) :
怎样判断输入结束呢?

只要edit丢失焦点或return ,esc就认为结束
--------------------------------------------------
我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。

//////////////////
处理WM_KEYDOWN, 或在PreTranslateMessage中处理
hz张三 2005-04-21
  • 打赏
  • 举报
回复
都这么做的。create一个edit上去。
gracezhu277 2005-04-21
  • 打赏
  • 举报
回复
顶!
StarsWu 2005-04-21
  • 打赏
  • 举报
回复
顺便问一下,怎样让其中的某行背景变色?
StarsWu 2005-04-21
  • 打赏
  • 举报
回复
wangjia184(我就是传说中的。。。。。。SB) :
怎样判断输入结束呢?

只要edit丢失焦点或return ,esc就认为结束
--------------------------------------------------
我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。
anlywei 2005-04-20
  • 打赏
  • 举报
回复
方法妙!
oyljerry 2005-04-20
  • 打赏
  • 举报
回复
编辑框大小需要自己手动根据ListCtrl的单元格来自己调整,多调整一下,使它大小适合
StarsWu 2005-04-20
  • 打赏
  • 举报
回复
那编辑框的长宽高怎么设呢?怎么获取单个框的RECT?
CodeProject-Jerry 2005-04-20
  • 打赏
  • 举报
回复
//////////////////////////////////////////////////////////////////////
// 双击修改内容 //
//////////////////////////////////////////////////////////////////////
void CNewList::OnLButtonDblClk(UINT nFlags, CPoint point)
{
int Index;
int ColNum;
if ((Index = HitTestEx (point, &ColNum)) != -1)
{
if (GetWindowLong (m_hWnd, GWL_STYLE) & LVS_EDITLABELS)
EditSubItem (Index, ColNum);
}
CListCtrl::OnLButtonDblClk(nFlags, point);
}


//////////////////////////////////////////////////////////////////
// 通过坐标得到 行,列 //
//////////////////////////////////////////////////////////////////
int CNewList::HitTestEx(CPoint& Point, int* pColumn)
{
int ColumnNum=0;
int Row=HitTest(Point,NULL);
if (pColumn)
*pColumn=0;
//判断ListCtrl 是否为LVS_REPORT
if ((GetWindowLong(m_hWnd,GWL_STYLE)&LVS_TYPEMASK)!=LVS_REPORT)
return Row;

Row=GetTopIndex();
int Bottom=Row+GetCountPerPage();
if (Bottom>GetItemCount())
Bottom=GetItemCount();
//判断在哪一行 哪一列
CHeaderCtrl* pHeader=(CHeaderCtrl*)GetDlgItem(0);
int nColumnCount=pHeader->GetItemCount();
for(;Row<=Bottom;++Row)
{
CRect rect;
GetItemRect(Row,&rect,LVIR_BOUNDS);
if (rect.PtInRect(Point))
{
for(ColumnNum=0;ColumnNum<nColumnCount;++ColumnNum)
{
int ColWidth=GetColumnWidth(ColumnNum);
if (Point.x>=rect.left && Point.x<=(rect.left+ColWidth))
{
if (pColumn)
*pColumn=ColumnNum;
return Row;
}
rect.left +=ColWidth;
}
}
}
return -1;
}


///////////////////////////////////////////////////////////////////
// 显示CEditCell //
///////////////////////////////////////////////////////////////////
void CNewList::EditSubItem(int Item, int Column)
{
CHeaderCtrl* pHeader=(CHeaderCtrl*)GetDlgItem(0);
int nColumnCount=pHeader->GetItemCount();
if (Column>=nColumnCount || GetColumnWidth(Column)<5) //判断宽度是否正确
return;

int Offset=0;
for(int iColumn=0;iColumn<Column;++iColumn) //得到CEditCell的right坐标
{
Offset +=GetColumnWidth(iColumn);
}
CRect rect;
GetItemRect(Item,rect,LVIR_BOUNDS);
CRect ClientRect;
GetClientRect(&ClientRect);
if (Offset+rect.left<0 || Offset+rect.left>ClientRect.right) //得到CEditCell的left坐标
{
CSize size;
if (Offset+rect.left>0)
size.cx=-(Offset-rect.left);
else
size.cx=Offset-rect.left;
size.cy=0;
Scroll(size);
rect.left=size.cx;
}
LV_COLUMN lvCol;
lvCol.mask=LVCF_FMT;
GetColumn(Column,&lvCol);
DWORD dwStyle;
//判断item的显示位子
if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
dwStyle = ES_LEFT;
else if ((lvCol.fmt & LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
dwStyle = ES_RIGHT;
else dwStyle = ES_CENTER;
//调整CEditCell 的w位子 (两边缩小2)
rect.left += Offset+2;
rect.right=rect.left+GetColumnWidth(Column)-2;
if (rect.right>ClientRect.right)
rect.right=ClientRect.right;


EditCellShow(dwStyle,rect,Item,Column);


//ComboCellShow(dwStyle,rect,Item,Column);

}
QBHAPPY 2005-04-20
  • 打赏
  • 举报
回复
m_list.SetItemText( int nItem, int nSubItem, LPTSTR lpszText )
其中m_list为关联你列表控件的变量,nItem是列,nSubItem是行,lpszText是你要添加的值可用CSting类赋值.比如:m_list.SetItemText( 0, 0, "100");就是在第一行第一列插入100这个数值.
加载更多回复(5)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧