将CListCtrl设为report后可以加多列,设置了Editable属性后只有第一列可以编辑。怎样让其他列可以编辑?谢先。
解决方案 »
- WTL COMBO BOX控件的问题
- 自作皮肤库问题,请教高手
- USB modem通信问题
- 如何重新设置BSTR 字符串的值?
- 用IshellFolder::EnumObjects列举文件夹的各项,无法获取隐藏文件或文件夹???
- CTreeList如何支持右键单击弹出菜单?
- ACCESS数据库可以在数据库操作时进行压缩,那么如何在VC中实现这一功能呢?
- 如何通过代码建立数据库?
- 大家认为在C#中有什么东西可以替代COM,COM和COM+有什么区别,COM我只知道是组件到底有什么用?谁可以给我个COM简单应用的例子
- 急!请问谁有PowerBuilder的运行连接库pbvm60.dll,请mail 给我
- 局部键盘钩子的问题..
- 如何做到不让左右键移动超出文本范围?
其中m_list为关联你列表控件的变量,nItem是列,nSubItem是行,lpszText是你要添加的值可用CSting类赋值.比如:m_list.SetItemText( 0, 0, "100");就是在第一行第一列插入100这个数值.
// 双击修改内容 //
//////////////////////////////////////////////////////////////////////
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);}
编辑框大小需要自己手动根据ListCtrl的单元格来自己调整,多调整一下,使它大小适合
-------------------------------------------------------------------------------------
这样不行吧,单元格的宽是可调整的,怎么能在程序中固定大小?
怎样判断输入结束呢?
怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
--------------------------------------------------
我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。
怎样判断输入结束呢?只要edit丢失焦点或return ,esc就认为结束
--------------------------------------------------
我试过,在对话框中点击对话框的其他地方时edit不会失去焦点,效果不好。按ESC和Enter时对话框会有默认操作,会关闭,而且EDIT获取不了这些按键。重载OnOk和OnCancel,不让关闭对话框,按对话框的关闭按扭都不会关。//////////////////
处理WM_KEYDOWN, 或在PreTranslateMessage中处理