在List Control中如何让单元格显示多行字符,并且可以编辑?

西笑生
人工智能领域优质创作者
2009-09-16 06:52:44
List Control如何实现下面的效果?
VIEW为Report,如何是其他view能够实现也可以
1 单元格显示多行字符。
2 单元格高度随字符行数自动变换。
3 可以编辑单元格,接受回车,鼠标移开自动保存的界面

谢谢
...全文
1048 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxa520 2012-04-27
  • 打赏
  • 举报
回复
为什么 我试了不行。
hongzhu306 2011-12-09
  • 打赏
  • 举报
回复
看看具体怎么实现,也想实现该功能
zqzzhong 2011-10-11
  • 打赏
  • 举报
回复
第三个,需要修改下,是在void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)的最后面添加,如下。

////add by jg for multi line.
CRect rect = ParentRect;
UINT nFormat = DT_WORDBREAK | DT_CALCRECT;
int nDescrHeight = dc.DrawText(str, rect, nFormat);
//end
if (nDescrHeight > m_Rect.Height())
{
((CGridCtrl*)GetParent())->SetRowHeight(m_nRow, nDescrHeight);
}
chenyr106 2009-10-19
  • 打赏
  • 举报
回复
按照你们提示的方法,我验证过,在单元格里面输入文本可以这么换行,非常谢谢。但想再请问一下,我现在也碰到这个问题,我想让单元格开始显示文本的时候,就按照文本的内容进行自动的换行和调整行高,而不是在单元格中输入文本(OnChar事件),我应该怎么办,或者修改那个类,谢谢!
西笑生 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 muzizongheng 的回复:]
LZ 记着给分哦。 呵呵。
[/Quote]
在看了完了,立马给分
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
LZ 记着给分哦。 呵呵。
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
第一, 你在CGridDefaultCell::CGridDefaultCell() 里把默认的|DT_SINGLELINE注释掉:
 m_nFormat = DT_LEFT|DT_VCENTER/*|DT_SINGLELINE*/|DT_NOPREFIX | DT_END_ELLIPSIS;  //change by jg for multi line.


第二, void CGridCtrl::OnEndEditCell(int nRow, int nCol, CString str)里添加一句:
CString strCurrentText = GetItemText(nRow, nCol);
if (strCurrentText != str)
{
SetItemText(nRow, nCol, str);
if (ValidateEdit(nRow, nCol, str) &&
SendMessageToParent(nRow, nCol, GVN_ENDLABELEDIT) >= 0)
{
SetModified(TRUE, nRow, nCol);
RedrawCell(nRow, nCol);

RedrawWindow();//add by jg for multi line text.
}
else
{
SetItemText(nRow, nCol, strCurrentText);
}
}

CGridCellBase* pCell = GetCell(nRow, nCol);
if (pCell)
pCell->OnEndEdit();


第三, 就是那个void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)里,

//add by jg for multi line.
CRect rect;
UINT nFormat = DT_WORDBREAK | DT_CALCRECT;
int nDescrHeight = dc.DrawText(str, rect, nFormat);
//end
。。。。。。。。
if (nDescrHeight > m_Rect.Height())
{
((CGridCtrl*)GetParent())->SetRowHeight(m_nRow, nDescrHeight);
}
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
在不? 搞定
西笑生 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 muzizongheng 的回复:]
这个类应该稍微修改点东西 就能满足你的要求。 我给你看看怎么改, ==
[/Quote]
非常感谢
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
这个类应该稍微修改点东西 就能满足你的要求。 我给你看看怎么改, ==
西笑生 2009-09-18
  • 打赏
  • 举报
回复
我在inplaceEdit的构造里 已经修改了创建时的风格。
编辑框已经接受回车,可以输入多行的问题已经解决,但是输入之后单元格显示的是一行。

现在的问题是:
如何让单元格显示多行并且行的高度自动跟随输入文字的行数变化?
西笑生 2009-09-18
  • 打赏
  • 举报
回复
完成 结贴 给分
西笑生 2009-09-18
  • 打赏
  • 举报
回复
第三, 就是那个void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)里,
C/C++ code
//add by jg for multi line.
CRect rect;
UINT nFormat = DT_WORDBREAK | DT_CALCRECT;
int nDescrHeight = dc.DrawText(str, rect, nFormat);
//end
。。。。。。。。
if (nDescrHeight > m_Rect.Height())
{
((CGridCtrl*)GetParent())->SetRowHeight(m_nRow, nDescrHeight);
}

这段代码是不是添加在void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
函数的最下面。

现在只剩下单元格内回车自动改变行高。
muzizongheng 2009-09-18
  • 打赏
  • 举报
回复
我给的代码假定你 已经修改了edit方面的style和enter处理。 呵呵。如果你没实现
代码如下:


CInPlaceEdit::CInPlaceEdit(CWnd* pParent, CRect& rect, DWORD dwStyle, UINT nID,
int nRow, int nColumn, CString sInitText,
UINT nFirstChar)
{
m_sInitText = sInitText;
m_nRow = nRow;
m_nColumn = nColumn;
m_nLastChar = 0;
m_bExitOnArrows = (nFirstChar != VK_LBUTTON); // If mouse click brought us here,
// then no exit on arrows

m_Rect = rect; // For bizarre CE bug.

DWORD dwEditStyle = WS_BORDER|WS_CHILD|WS_VISIBLE/*| ES_AUTOHSCROLL*/ | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL //add by jg for multiline
| dwStyle;



void CInPlaceEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_TAB/* || nChar == VK_RETURN*/) //delete by jg for multiline
{
m_nLastChar = nChar;
GetParent()->SetFocus(); // This will destroy this window
return;
}
西笑生 2009-09-17
  • 打赏
  • 举报
回复

1 http://www.vckbase.com/code/viewcode.asp?id=2914
此类只能编辑,不能改变行高

2 Tr0j4n
代码是与组合框的结合。

3 muzizongheng

http://www.codeproject.com/KB/miscctrl/gridctrl.aspx
不能自适应行高
http://www.codeproject.com/KB/miscctrl/adding___quot_merge_cells.aspx
此类功能确实强大,但是不能多行显示字符,不能输入回车符

谢谢回答

muzizongheng 2009-09-17
  • 打赏
  • 举报
回复
lz,自适应行高的啊, 你调用 AutoSize就可以了。 行高列宽都自适应的。
MoXiaoRab 2009-09-17
  • 打赏
  • 举报
回复
构造风格 |ES_WANTRETURN |ES_MULTILINE
西笑生 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 muzizongheng 的回复:]
这个你把col固定, 只autosize(row)的, 然后在inplaceEdit的构造里 修改创建时的风格, wantreturn 和multiLine。
[/Quote]
可以详细些吗,更改哪个示例
muzizongheng 2009-09-17
  • 打赏
  • 举报
回复
这个你把col固定, 只autosize(row)的, 然后在inplaceEdit的构造里 修改创建时的风格, wantreturn 和multiLine。
西笑生 2009-09-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 muzizongheng 的回复:]
lz,自适应行高的啊, 你调用 AutoSize就可以了。 行高列宽都自适应的。
[/Quote]
输入回车符怎么处理?自动换行
加载更多回复(5)

15,979

社区成员

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

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